2009-06-09 37 views
5

我有postgres數據庫的備份 - 整個數據庫實例在一次夜間備份。是否可以從該備份中僅恢復一個數據庫?或者,如果我想訪問單個數據庫(用於遷移或恢復),是否需要更改我的數據庫備份方案以執行單個轉儲?我可以從整個數據庫的pg_dump恢復一個模式嗎?

回答

12

您可以通過使用一些文字處理這樣的從文本格式(pg_dumpall)一個完整的數據庫集羣轉儲訪問單個數據庫:

awk '/^\\connect database_name/ {flag=1;print;next} 
    /^\\connect/ {flag=0} 
    flag { print }' \ 
    < all_databases.sql \ 
    > database_name.sql 

這從「\connect database_name」之間pg_dumpall文件都得到和未來「 \connect「。但效率不高。

但我建議單獨傾銷每個數據庫這樣的:「我可以從整個數據庫集羣的pg_dumpall恢復只是一個數據庫」

# Dumping global data (for example roles) 
pg_dumpall -g > /var/lib/pgsql/backups/globals.sql 

#Dumping indidual databases in tar (uncompressed binary) format 
for dbname in 
    ` 
    psql -qXtc " 
     select datname from pg_catalog.pg_database 
     where datname<>'template0'" template1 
    ` 
do 
    pg_dump -b -F t "$dbname" > "/var/lib/pgsql/backups/$dbname.dump" 
done 

我假設你的意思

+0

謝謝。備用備份腳本看起來就像票證。 – cnk 2009-06-22 20:59:08

2

是的,如果您的備份是"an archive created by pg_dump in one of the non-plain-text formats." - 對pg_restore使用「--schema =」選項。

另一方面,我不確定您在這裏使用了正確的術語 - 您將數據庫集羣稱爲「整個數據庫實例」;在你問「數據庫」,但在標題你寫的「模式」的解釋,等

編輯:現在,經過一番思索後,我相信你有一個集羣備份,以創建"pg_dumpall"。 「pg_dumpall」僅創建純文本(SQL命令)備份。在這種情況下,不可能只恢復一個數據庫(或者只能從數據庫中恢復一個模式)。

那麼是的,你需要改變你的備份程序來備份使用非純文本格式的個人數據庫(--format = custom是推薦的)。

實際上我在我的數據庫服務器上使用的備份程序就是這樣做的。

+0

謝謝。抱歉使用了混淆的術語。我目前在Oracle,MySQL和Postgres中有生產數據,有時候會對'數據庫','表空間','實例'等各種含義有所瞭解。 – cnk 2009-06-22 21:01:27

相關問題