Postgresql

如何在單次執行中轉儲同一集群的多個數據庫?

  • October 23, 2021

我的集群中有 100 個數據庫。我需要備份 30 個數據庫(作為單個文件或多個文件,什麼都可以)。我可以為使用pg_dumpwith的表格做到這一點-t

有沒有辦法做這樣的事情(虛擬碼):

pg_dump -d db1 -d db2 -d db3 -Fc > dbs_backup.backup

pg_dump只能轉儲單個**數據庫。手冊:

pg_dump 只轉儲單個數據庫。要備份整個集群,或備份集群中所有數據庫共有的全域對象(例如角色和表空間),請使用pg_dumpall

Postgres 12將開關添加**--exclude-databasepg_dumpall**. 手冊:

--exclude-database=pattern

不要轉儲名稱與模式匹配的數據庫。

$$ … $$

Postgres 11 之前pg_dumpall只能轉儲集群中的所有數據庫,即使您在連接字元串中提供了特定的數據庫名稱。手冊:

-d connstr

--dbname=connstr

指定用於連接到伺服器的參數,作為連接字元串。有關詳細資訊,請參閱第 34.1.1 節

呼叫該選項是--dbname為了與其他客戶端應用程序保持一致,但由於 pg_dumpall 需要連接到許多數據庫,連接字元串中的數據庫名稱將被忽略。使用該-l選項指定用於初始連接的數據庫的名稱,這將轉儲全域對象並發現應轉儲的其他數據庫。

要轉儲一些DB,但不是全部,請使用 shell 腳本,就像建議的那樣。您可能希望包含在轉儲中創建每個數據庫的命令:

使用數據庫名稱創建一個 txt 文件,每行一個,如:

db1
db2
db3

等等所有數據庫,然後從外殼:

for a in  `cat filename.txt`; do pg_dump -d $a > /tmp/${a}_backup.out; done

由 M.

PS 我無法正確書寫(不明白為什麼),但 filename.txt 必須用“重音”括起來(程式碼 U+0060)

引用自:https://dba.stackexchange.com/questions/223830