[PostgreSQL] копирование данных между базами
Делать дамп из одной, а потом вставлять в другую... один-два раза так, конечно, можно делать. Но постоянно - слишком много проблемрасскажи пожалуйста, от каких проблем хотелось бы избавится?
ещё любопытно, почему бы не работать в одной базе, раз данные связаны?
Проблемы в основном из-за того, что у меня много текстовых и двоичных данных, и за то, что внутри таблиц хранится - я не отвечаю. copy с этим по-моему не справится. (взять хотя бы табы и переносы строк внутри текстовых полей)
Данные в одной базе хранить - нельзя. Логически разные Просто у меня идет некоторый цикл обработки данных, так что используется цепочка из баз (там их примерно пять штук разных). Под мускулем я это все организовал - там запросы между баз проходят на ура. Но по некоторым причинам решил попробовать для первых трех баз из цепочки использовать постгрес, однако столкнулся с вышеописанной проблемой.
Требования - необходимо, чтобы можно было одной командой из постгреса/шела скопировать данные из одной базы в другую. Чем быстрее - тем лучше. Какя понимаю, копированием файла (как можно в мускуле для MyISAM) с постгресом не получится, поэтому вот ищу другие способы.
--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...
Постгрес в одной базе может несколько схем хранить. Между ними, я думаю, запросы делать можно.
посмотрел внимательней на copy, он все нехорошее (вроде бы) экранирут. попробую аккуратно по-пользоваться, надеюсь, что проблем не возникнет.
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 и т.п.? наверняка ведь это не заглушка специально на эти таблицы и есть какой-то механизм, позволяющих расшарить таблицы на всех?
олько вот создать две одинаковые таблицы (с одним именем) в одной базе все равно нельзя (или я криво создаю? :
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=#
вопрос возник из необходимости делать запросы, затрагивающие сразу несколько БДdatabase links вроде и в PostgreSQL есть: http://www.postgresql.org/docs/current/static/dblink.html
(как я понимаю) в постгресе такое невозможно в принципе
сам не пробовал
не знаю, для чего эти функции ввели, но я пока не понимаю их философию.
не бойся. это вызывается из SQL. это называется "хранимые процедуры" (или типа того). система присоединённых серверов, серверных подключений, итп есть во всех (вроде) СУБД современных. благодаря ей можно легко и непринуждённо использовать данные/функционал другой БД в работе первой.
Однако их не поиспользуешь в джоинах, вложенных запросах и т.п. в полную силу. Оптимизация на них не действует, индексы будут использоваться не в полную силу и т.п. Именно поэтому я и отнекиваюсь от этого. Это костыли все-таки.. а хочется нормального решения.
Вот спасибо за схемы, буду пробовать с ними.
если присоединён сервер той же СУБД, что и наш, всяко будут некоторые оптимизации. Например, не просто так в MS SQL есть понятие "distributed transaction coordinator".
Оставить комментарий
oleg1331
есть ли возможность (сторонний скрипт, или простокакая-нибудь технология) по копированию таблиц между базами. Делать дамп из
одной, а потом вставлять в другую... один-два раза так, конечно, можно
делать. Но постоянно - слишком много проблем. Хотелось бы найти способ
по-лучше.
P.S. вопрос возник из необходимости делать запросы, затрагивающие сразу несколько БД, но (как я понимаю) в постгресе такое невозможно в принципе, то приходится заниматься копированием.