2012-10-18 40 views
1

我正在嘗試設置一個腳本以將數據庫的副本從一臺服務器轉移到另一臺服務器。使用pg_dump拍攝數據庫的快照

感謝這篇文章Copying PostgreSQL database to another server我找到了一種方法來做到這一點。

但我需要做的是在複製期間更改數據庫的名稱。 我想過使用sed並做一個簡單的文本替換。但我擔心這可能會破壞數據庫。

有沒有人知道這樣做的正確方法?

如這裏要求是我使用

pg_dump -C -U remoteuser -h remoteServer dbname | psql -h localhost -U localadmin template1 

回答

4

剛恢復到不同的數據庫中的命令。從pg_dump的自定義格式-Fcpg_restore轉儲:

createdb newdbname 
pg_restore --dbname newdbname database.dump 

對於SQL格式轉儲不是創建-C選項pg_dump

createdb newdbname 
psql -f database_dump.sql newdbname 

如果你從流轉儲遠程主機,因爲轉儲數據來自stdin,所以只需省略-f database_dump.sql

您不能輕鬆CREATE DATABASE與恢復相同的命令,因爲您需要連接到不同的數據庫,如template1爲了創建新的數據庫。因此,在您例如,您可能:

psql -h localhost -U localadmin template1 -c 'CREATE DATABASE newdb;' 
pg_dump -U remoteuser -h remoteServer dbname | psql -h localhost -U localadmin newdb 

注意-C標誌的遺漏pg_dump

第一個命令只是寫作createdb -h localhost -U localadmin newdb的一種長效方式。


更新:如果你堅持與-C標誌創建一個pg_dump你的確可以只sed轉儲,只要你是非常小心。在文件的開頭應該只有四行(一個註釋)引用數據庫名稱。對於數據庫名稱「迴歸」與PG 9.1的pg_dump -C傾倒:

-- 
-- Name: regress; Type: DATABASE; Schema: -; Owner: craig 
-- 

CREATE DATABASE regress WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8'; 


ALTER DATABASE regress OWNER TO craig; 

\connect regress 

這可以很安全地用三個(或四個,如果你想重寫評論)非常具體sed命令轉化。不過不是只是做一個全局查找並替換數據庫名稱。

sed \ 
    -e 's/^CREATE DATABASE regress/CREATE DATABASE newdbname/' \ 
    -e 's/^ALTER DATABASE regress/ALTER DATABASE newdbname/' \ 
    -e 's/^\\connect regress/\\connect newdbname/' \ 
    -e 's/^--Name: regress/--Name: newdbname/' 

這應該是最後的手段;沒有-C就更好了。