Я пытаюсь скопировать всю таблицу из одной базы данных в другую в Postgres. Какие-либо предложения?
Я пытаюсь скопировать всю таблицу из одной базы данных в другую в Postgres. Какие-либо предложения?
Ответы:
Извлеките таблицу и направьте ее прямо в целевую базу данных:
pg_dump -t table_to_copy source_db | psql target_db
Примечание. Если в другой базе данных уже настроена таблица, используйте этот -a
флаг только для импорта данных, в противном случае вы можете увидеть странные ошибки, такие как «Недостаточно памяти»:
pg_dump -a -t my_table my_db | psql target_db
pg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db
-a
флаг следует использовать только для данных . то есть pg_dump -a -t my_table my_db | psql target_db
. Пока я здесь, если ваша база данных находится на сервере, мне проще просто вывести базу данных в файл и затем скопировать этот файл в базу данных, а затем отправить содержимое файла в psql. например, pg_dump -a -t my_table my_db > my_file.sql
и после размещения этого на вашем сервере ->psql my_other_db < my_file.sql
pg_dump -t '"tableToCopy"' source_db | psql target_db
. Обратите внимание, что одинарные И двойные кавычки окружают имя таблицы
Вы также можете использовать функцию резервного копирования в pgAdmin II. Просто следуйте этим шагам:
Хорошо работает и может делать несколько таблиц одновременно.
Objects
разделе. На OSX, нажмите кнопку SQL или получить с SQL Editor
помощью Tools
вставить в SQL скопированный из файла резервной копии меню.
Использование 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);
Использование 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" )
PGPASSWORD=password1 psql -U ...
тогда вам даже не нужны явные субоболочки! Обычно вам нужно сначала выполнить несколько действий для настройки, поэтому в любом случае могут потребоваться вспомогательные оболочки. Кроме того, пароли не будут экспортированы в последующие процессы. Спасибо!
pg_dump -t '<table_name>' --schema-only
Сначала установите 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
);
INSERT INTO l_tbl (l_col1, l_col2, l_col3) SELECT * FROM dblink('dbname=r_db hostaddr=r_ip password=r_pass user=r_usr', 'select r_col1, r_col2, r_col3 from r_tbl where r_col1 between ''2015-10-29'' AND ''2015-10-30'' ') AS t1(col1 MACADDR, col2 TIMESTAMP, col3 NUMERIC(7,1));
(l означает local, r удаленно. Избегайте одинарных кавычек. Предоставляйте типы
Используйте pg_dump для выгрузки данных таблицы, а затем восстановите их с помощью psql.
Если у вас есть оба удаленных сервера, вы можете выполнить следующие действия:
pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase
Он скопирует упомянутую таблицу исходной базы данных в ту же именованную таблицу целевой базы данных, если у вас уже есть существующая схема.
Вы можете сделать следующее:
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>
Чтобы переместить таблицу из базы данных 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
export PGPASSWORD=<passw>
до запуска команды
Я попробовал некоторые решения здесь, и они были действительно полезны. По моему опыту лучшим решением является использование командной строки 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
)
)
Проблема этого метода заключается в том, что должны быть записаны имена полей и типы таблиц, которые вы хотите скопировать.
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"
То же, что и ответы 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
в противном случае канал запрашивает два пароля одновременно.
Вы должны использовать DbLink для копирования данных одной таблицы в другую таблицу в другой базе данных. Вы должны установить и настроить расширение DbLink для выполнения кросс-запроса к базе данных.
Я уже создал подробный пост на эту тему. Пожалуйста, посетите эту ссылку
Проверьте этот скрипт 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);
Если обе БД (от и до) защищены паролем, в этом сценарии терминал не будет запрашивать пароль для обеих БД, запрос пароля появится только один раз. Итак, чтобы это исправить, передайте пароль вместе с командами.
PGPASSWORD=<password> pg_dump -h <hostIpAddress> -U <hostDbUserName> -t <hostTable> > <hostDatabase> | PGPASSWORD=<pwd> psql -h <toHostIpAddress> -d <toDatabase> -U <toDbUser>
Я использовал DataGrip (по Intellij Idea). и было очень легко копировать данные из одной таблицы (из другой базы данных в другую).
Во-первых, убедитесь, что вы подключены к обоим источникам данных в Data Grip.
Выберите исходную таблицу и нажмите клавишу F5 или (щелкните правой кнопкой мыши -> выберите Копировать таблицу в.)
Это покажет вам список всех таблиц (вы также можете искать, используя имя таблицы во всплывающем окне). Просто выберите цель и нажмите ОК.
DataGrip позаботится обо всем остальном за вас.
Если вы запустите pgAdmin (Backup:, pg_dump
Restore :) pg_restore
из Windows, он попытается вывести файл по умолчанию, c:\Windows\System32
и именно поэтому вы получите ошибку «Разрешение / доступ запрещен», а не потому, что пользователь postgres недостаточно повышен. Запустите pgAdmin от имени администратора или просто выберите место для вывода, отличное от системных папок Windows.
В качестве альтернативы вы также можете представить свои удаленные таблицы в качестве локальных таблиц, используя расширение для сторонних данных. Затем вы можете вставить в свои таблицы, выбрав из таблиц в удаленной базе данных. Единственным недостатком является то, что это не очень быстро.