1 (03 Dec 2013 23:04:39 отредактировано crazy_man)

Тема: Как из одной БД перенести данные в другую (pgsql)

Всем привет! Сегодня я расскажу, как в pgsql пероенести данные из одной базы данных в другую. Например вы восстановили базу из бэкапа и часть нужных данных осталась в старой БД. Казалос бы всё просто:

выполняем

INSERT INTO DB2.dbo.table_name (f1,f2,f3) SELECT f1,f2,f3 FROM DB1.dbo.table_name

и всё.

А вот фиг там! Postgree  зараза выполняет запросы не на сервере, а в конретной базе данных..

Но если долго мучится .... wink

Итак.
Нам понадобится процедурка dblink, которая умеет коннектится к доугим бд, даже если они принадлежат другим юзерам или располагаюся на разных хостах, что очень удобно. Но... ее нужно добавить в БД самостоятельно.

Под виндами заходим в папку C:\Program Files (x86)\PostgreSQL\8.4\share\contrib и через pgAdmin импортируем скрипт dblink.sql в нашу базу (в которую будем копировать данные)
Под никсами достаточно выполнить

psql -U dbuser -d dbname <  /usr/pgsql-9.0/share/contrib/dblink.sql , 
где
dbuser и dbname - пользователь и имя бд соответственно

Дальше заходим в pgAdmin и в конечной БД пишем запрос

INSERT INTO dst_table (id, time) 
SELECT * FROM dblink('dbname=src_db','SELECT id, time FROM src_table')
AS t2(id integer, time integer)
WHERE time>=1000;

где:
dst_table = конечная таблица (в которую будут вставлены записи)
src_table = исходная табличка  (с которой будут копироватся данные по условию)
where time>=1000; - условие по которому отбираются данные в  src_table

Profit!

P.S. незабудьте перечислить типы данных исходной таблички!

P.P.S. Если нужен коннект к другой бд на другом хосте, можно попробовать написать так

INSERT INTO tableA
SELECT *
FROM dblink('dbname=postgres hostaddr=xxx.xxx.xxx.xxx dbname=mydb user=postgres',
            'select a,b from tableB')
       AS t1(a text,b text);

Офф. мануал по dblink: http://www.postgresql.org/docs/9.1/stat … ction.html