2009-08-06 154 views

回答

487

你並不需要創建一箇中間文件。您可以

pg_dump -C -h localhost -U localuser dbname | psql -h remotehost -U remoteuser dbname 

pg_dump -C -h remotehost -U remoteuser dbname | psql -h localhost -U localuser dbname 

使用psqlpg_dump連接到遠程主機做。

對於大型數據庫或連接速度較慢的情況,轉儲文件和傳輸壓縮文件可能會更快。

由於科內爾說沒有必要轉儲到一箇中間文件,如果你想工作壓縮就可以使用壓縮隧道

pg_dump -C dbname | bzip2 | ssh [email protected] "bunzip2 | psql dbname" 

pg_dump -C dbname | ssh -C [email protected] "psql dbname" 

但這種解決方案還需要在兩端得到一個會話。

+22

有沒有需要中間文件 - 你可以使用壓縮的SSH隧道或者簡單地使用管道:pg_dump | bzip2 | ssh「bunzip2 | pg_restore」 – Kornel 2009-08-06 12:46:17

+2

如果您使用bzip2,請關閉ssh壓縮以加快傳輸速度! – lzap 2012-06-19 09:34:08

+0

命令ssh默認已禁用壓縮。在使用ssh壓縮的例子中,我沒有使用bzip2,當使用bzip2時,我沒有使用ssh壓縮。 – Ferran 2012-06-19 16:07:44

97
pg_dump the_db_name > the_backup.sql 

然後複製備份到你的開發服務器,恢復使用:

psql the_new_dev_db < the_backup.sql 
+2

有人告訴我,這可能是有問題的修改一般使用類似的腳本? – 2009-08-06 09:26:41

+9

@rmbarnes:如果有問題 - 他們必須修復。如果沒有詳細瞭解這個「某個人」做了什麼 - 沒有人可以確認也不會駁回這一說法。 – 2009-08-06 10:06:57

+2

在pg_dump中使用--no-owner標誌。這跳過了這個問題,這篇文章的第一次編輯使用它 - 但後來我認爲你可能需要更精確的原始數據庫保真度。 – unmounted 2009-08-06 17:05:43

33

使用pg_dump,後來psqlpg_restore - 這取決於您是否選擇-FP或-Fc選項pg_dump的。用法

例子:

ssh production 
pg_dump -C -Fp -f dump.sql -U postgres some_database_name 
scp dump.sql development: 
rm dump.sql 
ssh development 
psql -U postgres -f dump.sql 
2

我掙扎了很多,最終的方法,讓我使其與軌道4的工作是:

您的舊服務器上

sudo su - postgres 
pg_dump -c --inserts old_db_name > dump.sql 

我不得不使用Postgres的Linux用戶創建轉儲。還必須使用-c強制在新服務器上創建數據庫。 --inserts告訴它使用INSERT()語法,否則不會爲我工作:(

然後,在新服務器上,的simpy:

sudo su - postgres 
psql new_database_name < dump.sql 

傳輸服務器之間的dump.sql文件我只是使用「貓」來打印內容,而不是「nano」來重新創建內容副本。

另外,我在兩個數據庫上使用的角色不同,所以我必須找到 - 替換所有者在轉儲中的名稱。

13

pg_basebackup似乎是th現在做這個更好的方法,特別是對於大型數據庫。

+7

你能否在答案中提供更多詳細信息,如示例? – Magnilex 2015-02-04 21:46:23

+4

但是,這僅適用於兩臺機器具有相同的PG版本。 – 2016-03-03 14:00:06

+0

機會很小,您可能會使用不同的數據庫版本進行開發和生產。 上次我和一位隊友發生了一些不愉快的對話,因爲她試圖提出一個問題,那就是當時我們已經在生產中使用了9.5版本,但有些代碼與PG 9.6不兼容。 基礎備份要快得多。然後pg_upgrade是需要的時候走的路。 – Zorg 2018-01-18 04:25:22

3

運行帶有數據庫名稱的此命令,要備份數據庫的轉儲。

pg_dump -U {user-name} {source_db} -f {dumpfilename.sql} 

eg. pg_dump -U postgres mydbname -f mydbnamedump.sql 

現在scp這個轉儲文件到您想要複製數據庫的遠程機器上。

eg. scp mydbnamedump.sql [email protected]:~/some/folder/ 

在遠程機器上運行〜/ some /文件夾中的以下命令來恢復數據庫。

psql -U {user-name} -d {desintation_db}-f {dumpfilename.sql} 

eg. psql -U postgres -d mynewdb -f mydbnamedump.sql 
16

如果你正在尋找的版本之間進行遷移(例如,你更新的Postgres,並運行在localhost 9.1:5432和9.3在本地主機上運行:5434),你可以運行:

pg_dumpall -p 5432 -U myuser91 | psql -U myuser94 -d postgres -p 5434 

時退房migration docs

+0

我被多次詢問(myuser91/postgres)-password,有沒有辦法讓我只需輸入一次密碼? – 2017-12-15 10:50:29

+0

@MartinWeber根據此文檔創建一個pgpass文件https://www.postgresql.org/docs/9.4/static/libpq-pgpass.html – 2017-12-21 04:06:30

1

讓我分享一個Linux shell腳本從一個服務器複製你的表中的數據到另一個PostgreSQL服務器。

Reference taken from this blog:

的Linux的Bash shell腳本對PostgreSQL服務器之間的數據遷移:

#!/bin/bash 
psql \ 
    -X \ 
    -U user_name \ 
    -h host_name1 \ 
    -d database_name \ 
    -c "\\copy tbl_Students to stdout" \ 
| \ 
psql \ 
    -X \ 
    -U user_name \ 
    -h host_name2 \ 
    -d database_name \ 
    -c "\\copy tbl_Students from stdin" 

我只是遷移數據;請在目標/第二個數據庫服務器上創建一個空白表。

這是一個實用程序腳本。導致無論是轉儲或恢復權限問題,當它擊中觸發死 - 而且,你可以通過增加對HOST_NAME,數據庫名稱,表名和參數等

相關問題