Скопируйте таблицу из одной базы данных в другую в Postgres

Я пытаюсь скопировать всю таблицу из одной базы данных в другую в Postgres. Любые предложения?

Ответ 1

Извлеките таблицу и подключите ее непосредственно к целевой базе данных:

pg_dump -t table_to_copy source_db | psql target_db

Ответ 2

Вы также можете использовать функции резервного копирования в pgAdmin II. Просто выполните следующие действия:

  • В pgAdmin щелкните правой кнопкой мыши таблицу, которую вы хотите переместить, выберите "Резервное копирование"
  • Выберите каталог для выходного файла и установите формат "plain"
  • Перейдите на вкладку "Параметры дампа №1", установите флажок "Только данные" или "Только схема" (в зависимости от того, что вы делаете)
  • В разделе "Запросы" нажмите "Использовать вставки столбцов" и "Команды ввода пользователя".
  • Нажмите кнопку "Резервное копирование". Это выводит файл .backup
  • Откройте этот новый файл с помощью блокнота. Вы увидите скрипты вставки, необходимые для таблицы/данных. Скопируйте и вставьте их на новую страницу sql базы данных в pgAdmin. Выполнить как pgScript - Query- > Выполнить как pgScript F6

Хорошо работает и может выполнять несколько таблиц за раз.

Ответ 3

Использование dblink было бы более удобным!

truncate table tableA;

insert into tableA
select *
from dblink('dbname=postgres hostaddr=xxx.xxx.xxx.xxx dbname=mydb user=postgres',
            'select a,b from tableA')
       as t1(a text,b text);

Ответ 4

Использование psql на Linux-хосте, который имеет подключение к обоим серверам

( export PGPASSWORD=password1 
  psql -U user1 -h host1 database1 \
  -c "copy (select field1,field2 from table1) to stdout with csv" ) \
| 
( export PGPASSWORD=password2 
  psql -U user2 -h host2 database2 \ 
   -c "copy table2 (field1, field2) from stdin csv" )

Ответ 5

Сначала установите dblink

Затем вы бы сделали что-то вроде:

INSERT INTO t2 select * from 
dblink('host=1.2.3.4
 user=*****
 password=******
 dbname=D1', 'select * t1') tt(
       id int,
  col_1 character varying,
  col_2 character varying,
  col_3 int,
  col_4 varchar 
);

Ответ 6

Используйте pg_dump для вывода данных таблицы, а затем восстановите его с помощью psql.

Ответ 7

Если у вас есть и удаленный сервер, вы можете следовать этому:

pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase

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

Ответ 8

Вот что сработало для меня. Первый дамп файла:

pg_dump -h localhost -U myuser -C -t my_table -d first_db>/tmp/table_dump

затем загрузите сбрасываемый файл:

psql -U myuser -d second_db</tmp/table_dump

Ответ 9

Вы можете сделать следующее:

pg_dump -h <host ip address> -U <host db user name> -t <host table> > <host database> | psql -h localhost -d <local database> -U <local db user>

Ответ 10

Чтобы переместить таблицу из базы данных A в базу данных B при локальной настройке, используйте следующую команду:

pg_dump -h localhost -U owner-name -p 5432 -C -t table-name database1 | psql -U owner-name -h localhost -p 5432 database2

Ответ 11

Я попробовал некоторые из решений здесь, и они были действительно полезны. По моему опыту лучшим решением является использование командной строки psql, но иногда мне не нравится использовать командную строку psql. Итак, вот еще одно решение для pgAdminIII

create table table1 as(
 select t1.* 
 from dblink(
   'dbname=dbSource user=user1 password=passwordUser1',
   'select * from table1'  
  ) as t1(
    fieldName1 as bigserial,
    fieldName2 as text,
    fieldName3 as double precision 
  )
 )

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

Ответ 12

pg_dump не работает всегда.

Учитывая, что у вас есть одна и та же таблица ddl в обоих dbs, вы можете взломать ее из stdout и stdin следующим образом:

 # grab the list of cols straight from bash

 psql -d "$src_db" -t -c \
 "SELECT column_name 
 FROM information_schema.columns 
 WHERE 1=1 
 AND table_name='"$table_to_copy"'"
 # ^^^ filter autogenerated cols if needed     

 psql -d "$src_db" -c  \
 "copy ( SELECT col_1 , col2 FROM table_to_copy) TO STDOUT" |\
 psql -d "$tgt_db" -c "\copy table_to_copy (col_1 , col2) FROM STDIN"

Ответ 13

То же, что и ответы user5542464 и Piyush S. Wanare, но разделить на два этапа:

pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase > dump
cat dump | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase

в противном случае труба запрашивает два пароля одновременно.

Ответ 14

Вы должны использовать DbLink для копирования одной таблицы данных в другую таблицу в другой базе данных. Вы должны установить и настроить расширение DbLink для выполнения запроса кросс-базы данных.

Я уже создал подробное сообщение на эту тему. Пожалуйста, перейдите по этой ссылке

Ответ 15

Проверьте этот скрипт Python

python db_copy_table.py "host=192.168.1.1 port=5432 user=admin password=admin dbname=mydb" "host=localhost port=5432 user=admin password=admin dbname=mydb" alarmrules -w "WHERE id=19" -v
Source number of rows = 2
INSERT INTO alarmrules (id,login,notifybyemail,notifybysms) VALUES (19,'mister1',true,false);
INSERT INTO alarmrules (id,login,notifybyemail,notifybysms) VALUES (19,'mister2',true,false);

Ответ 16

Если обе БД (от и до) защищены паролем, в этом сценарии терминал не будет запрашивать пароль для обеих БД, запрос пароля появится только один раз. Итак, чтобы это исправить, передайте пароль вместе с командами.

PGPASSWORD=<password> pg_dump -h <hostIpAddress> -U <hostDbUserName> -t <hostTable> > <hostDatabase> | PGPASSWORD=<pwd> psql -h <toHostIpAddress> -d <toDatabase> -U <toDbUser>

Ответ 17

Если вы запустите pgAdmin (Backup: pg_dump, Restore: pg_restore) из Windows, он попытается вывести файл по умолчанию в c:\Windows\System32 и именно поэтому вы получите ошибку "Отказ в доступе/доступе", а не потому, что пользователь postgres не является достаточно возвышен. Запустите pgAdmin от имени администратора или просто выберите место для вывода, отличное от системных папок Windows.

Ответ 18

В качестве альтернативы вы также можете представить свои удаленные таблицы как локальные таблицы, используя расширение для сторонних данных. Затем вы можете вставить в свои таблицы, выбрав из таблиц в удаленной базе данных. Единственным недостатком является то, что это не очень быстро.