[PostgreSQL] копирование данных между базами

oleg1331

есть ли возможность (сторонний скрипт, или просто
какая-нибудь технология) по копированию таблиц между базами. Делать дамп из
одной, а потом вставлять в другую... один-два раза так, конечно, можно
делать. Но постоянно - слишком много проблем. Хотелось бы найти способ
по-лучше.
P.S. вопрос возник из необходимости делать запросы, затрагивающие сразу несколько БД, но (как я понимаю) в постгресе такое невозможно в принципе, то приходится заниматься копированием.

hwh2010

Делать дамп из одной, а потом вставлять в другую... один-два раза так, конечно, можно делать. Но постоянно - слишком много проблем
расскажи пожалуйста, от каких проблем хотелось бы избавится?
ещё любопытно, почему бы не работать в одной базе, раз данные связаны?

oleg1331

делать \copy в временный файл из одной базы, потом \copy из временного файла в другую базу.. или из консоли пайп организовывать, а в copy прописывать stdin/stdout..
Проблемы в основном из-за того, что у меня много текстовых и двоичных данных, и за то, что внутри таблиц хранится - я не отвечаю. copy с этим по-моему не справится. (взять хотя бы табы и переносы строк внутри текстовых полей)
Данные в одной базе хранить - нельзя. Логически разные :) Просто у меня идет некоторый цикл обработки данных, так что используется цепочка из баз (там их примерно пять штук разных). Под мускулем я это все организовал - там запросы между баз проходят на ура. Но по некоторым причинам решил попробовать для первых трех баз из цепочки использовать постгрес, однако столкнулся с вышеописанной проблемой.
Требования - необходимо, чтобы можно было одной командой из постгреса/шела скопировать данные из одной базы в другую. Чем быстрее - тем лучше. Какя понимаю, копированием файла (как можно в мускуле для MyISAM) с постгресом не получится, поэтому вот ищу другие способы.

doublemother

--Example importing data to table sometable
--from tab delimited where NULLs appear as NULL
COPY sometable FROM "/path/to/textfile.txt" USING DELIMITERS '\t' WITH NULL As 'NULL';

--Example exporting a query to a comma separated (CSV) called textfile.csv
--setting NULLS to text NULL
COPY (SELECT * FROM sometable WHERE somevalue LIKE '%') TO '/path/to/textfile.csv'
WITH NULL As 'NULL' CSV HEADER QUOTE AS '"';

http://www.postgresonline.com/special_feature.php?sf_name=po...

tokuchu

Постгрес в одной базе может несколько схем хранить. Между ними, я думаю, запросы делать можно.

oleg1331

сиб за шпаргалку, вещь хорошая :)
посмотрел внимательней на copy, он все нехорошее (вроде бы) экранирут. попробую аккуратно по-пользоваться, надеюсь, что проблем не возникнет.

oleg1331

схем то может. только вот создать две одинаковые таблицы (с одним именем) в одной базе все равно нельзя (или я криво создаю? :
  
create table tmp_objects(row_id serial, data text) tablespace tmp_ts;
create table tmp_objects(row_id serial, data text);
ERROR: объект "tmp_objects" уже существует

вот меня интересует вопрос - каким образом мне из любой базы доступны таблицы pg_user, pg_roles и т.п.? наверняка ведь это не заглушка специально на эти таблицы и есть какой-то механизм, позволяющих расшарить таблицы на всех?

hwh2010

олько вот создать две одинаковые таблицы (с одним именем) в одной базе все равно нельзя (или я криво создаю? :
postgres=# CREATE SCHEMA s1
postgres-# ;
CREATE SCHEMA
postgres=# CREATE SCHEMA s2
;
CREATE SCHEMA
postgres=# CREATE TABLE s1.foo;
CREATE TABLE
postgres=# CREATE TABLE s2.foo;
CREATE TABLE
postgres=#
postgres=# \d foo
Не найдено ни одного отношения с именем "foo".
postgres=# \d s1.foo
Таблица "s1.foo"
Колонка | Тип | Модификаторы
---------+-----+--------------

postgres=# \d s2.foo
Таблица "s2.foo"
Колонка | Тип | Модификаторы
---------+-----+--------------

postgres=# select * from s1.foo,s2.foo;
--
(0 rows)

postgres=#

oleg1331

oops.. точно. сорри, я постгрес всего неделю знаю изучаю :o

ava3443

вопрос возник из необходимости делать запросы, затрагивающие сразу несколько БД
(как я понимаю) в постгресе такое невозможно в принципе
database links вроде и в PostgreSQL есть: http://www.postgresql.org/docs/current/static/dblink.html
сам не пробовал

oleg1331

не-не-не.. на такое я морально не готов :) беглым взглядом - это синтаксис для приложений.. для запросов нужен sql, а мешать то и другое, тем более в консоли.
не знаю, для чего эти функции ввели, но я пока не понимаю их философию.

klyv

не бойся. это вызывается из SQL. это называется "хранимые процедуры" (или типа того). система присоединённых серверов, серверных подключений, итп есть во всех (вроде) СУБД современных. благодаря ей можно легко и непринуждённо использовать данные/функционал другой БД в работе первой.

oleg1331

я в курсе, что эт такое, с хранимыми процедурами/функциями ( по крайней мере в мускуле ) работал.
Однако их не поиспользуешь в джоинах, вложенных запросах и т.п. в полную силу. Оптимизация на них не действует, индексы будут использоваться не в полную силу и т.п. Именно поэтому я и отнекиваюсь от этого. Это костыли все-таки.. а хочется нормального решения.
Вот спасибо за схемы, буду пробовать с ними.

klyv

если б на них оптимизации не было, ими бы никто и не пользовался.
если присоединён сервер той же СУБД, что и наш, всяко будут некоторые оптимизации. Например, не просто так в MS SQL есть понятие "distributed transaction coordinator".
Оставить комментарий
Имя или ник:
Комментарий: