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

crazy_man

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

выполняем
Код: sql
insert into DB2.dbo.table_name (f1,f2,f3) select f1,f2,f3 from DB1.dbo.table_name
и всё.

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

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

Итак.
Нам понадобится процедурка 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 и в конечной БД пишем запрос

Код: sql
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. Если нужен коннект к другой бд на другом хосте, можно попробовать написать так
Код: sql
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/static/contrib-dblink-function.html