![](/img/trans.png)
[英]How to copy an table from one database to another database in Postgres
[英]Copy a table from one database to another in 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
您還可以使用 pgAdmin II 中的備份功能。 只需按照以下步驟操作:
效果很好,一次可以做多個表。
使用dblink會更方便!
truncate table tableA;
insert into tableA
select *
from dblink('hostaddr=xxx.xxx.xxx.xxx dbname=mydb user=postgres',
'select a,b from tableA')
as t1(a text,b text);
在連接到兩台服務器的 linux 主機上使用 psql
( 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" )
首先安裝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
);
如果您有兩個遠程服務器,那么您可以按照以下步驟操作:
pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase
如果您已經擁有現有架構,它會將源數據庫的上述表復制到目標數據庫的同名表中。
使用pg_dump轉儲表數據,然后用psql恢復。
您可以執行以下操作:
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
這對我有用。 首先轉儲到文件:
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
我在這里嘗試了一些解決方案,它們真的很有幫助。 根據我的經驗,最好的解決方案是使用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
)
)
這種方法的問題在於,必須寫入要復制的表的字段名稱及其類型。
與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
否則管道會同時詢問兩個密碼。
pg_dump
並不總是有效。
鑒於您在兩個數據庫中有相同的表 ddl,您可以按如下方式從 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"
作為替代方案,您還可以使用外部數據包裝器擴展將遠程表公開為本地表。 然后,您可以通過從遠程數據庫中的表中進行選擇來插入到您的表中。 唯一的缺點是速度不是很快。
檢查這個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);
您必須使用 DbLink 將一個表數據復制到不同數據庫的另一個表中。 您必須安裝和配置 DbLink 擴展才能執行跨數據庫查詢。
我已經創建了關於這個主題的詳細帖子。 請訪問此鏈接
如果兩個數據庫(從和到)都受密碼保護,在這種情況下終端不會要求兩個數據庫的密碼,密碼提示只會出現一次。 因此,要解決此問題,請將密碼與命令一起傳遞。
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 或(右鍵單擊 -> 選擇將表復制到。)
這將顯示所有表格的列表(您也可以在彈出窗口中使用表格名稱進行搜索)。 只需選擇您的目標,然后按 OK。
DataGrip 將為您處理其他一切。
如果您從 Windows 運行 pgAdmin(備份: pg_dump
,還原: pg_restore
),它會默認嘗試將文件輸出到c:\\Windows\\System32
這就是為什么您會收到 Permission/Access denied 錯誤而不是因為用戶 postgres 不是夠高。 以管理員身份運行pgAdmin或僅選擇 Windows 系統文件夾以外的輸出位置。
對於DBeaver 工具用戶,您可以“導出數據”到另一個數據庫中的表。
我一直面臨的唯一錯誤是因為錯誤的 postgres 驅動程序。
SQL Error [34000]: ERROR: portal "c_2" does not exist
ERROR: Invalid protocol sequence 'P' while in PortalSuspended state.
這是關於如何導出數據的官方維基: https : //github.com/dbeaver/dbeaver/wiki/Data-transfer
您可以通過兩個簡單的步驟來完成:
# dump the database in custom-format archive
pg_dump -Fc mydb > db.dump
# restore the database
pg_restore -d newdb db.dump
如果是遠程數據庫:
# dump the database in custom-format archive
pg_dump -U mydb_user -h mydb_host -t table_name -Fc mydb > db.dump
# restore the database
pg_restore -U newdb_user -h newdb_host -d newdb db.dump
如果你想將數據從一個服務器數據庫復制到另一個服務器數據庫,那么你已經創建了兩個數據庫的dblink連接,否則你可以導出 csv 中的表數據並導入其他數據庫表中的數據,表字段應與主表相同。
沒有任何管道,在 Windows 上,您可以使用:
轉儲 - 將其編輯為一行
"C:\Program Files\PostgreSQL\14\bin\pg_dump.exe"
--host="host-postgres01"
--port="1234"
--username="user01"
-t "schema01.table01"
--format=c
-f "C:\Users\user\Downloads\table01_format_c.sql"
"DB-01"
恢復 - 將其編輯為一行
"C:\Program Files\PostgreSQL\14\bin\pg_restore.exe"
--host="host-postgres02"
--port="5678"
--username="user02"
-1
--dbname="DB-02"
"C:\Users\user\Downloads\table01_format_c.sql"
系統將提示您輸入用戶密碼。
此解決方案會將新表放入具有相同名稱 ( schema01
) 的模式中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.