簡體   English   中英

在 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 中的備份功能。 只需按照以下步驟操作:

  • 在 pgAdmin 中,右鍵單擊要移動的表,選擇“備份”
  • 選擇輸出文件的目錄並將格式設置為“普通”
  • 單擊“Dump Options #1”選項卡,選中“Only data”或“only Schema”(取決於您在做什么)
  • 在查詢部分下,單擊“使用列插入”和“用戶插入命令”。
  • 單擊“備份”按鈕。 這輸出到 .backup 文件
  • 使用記事本打開這個新文件。 您將看到表/數據所需的插入腳本。 將這些復制並粘貼到 pgAdmin 中的新數據庫 sql 頁面中。 作為 pgScript 運行 - 查詢->作為 pgScript F6 執行

效果很好,一次可以做多個表。

使用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 
  )
 )

這種方法的問題在於,必須寫入要復制的表的字段名稱及其類型。

user5542464Piyush 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM