1.pg_dumpall 概述
1.1 pg_dumpall 介紹
https://www.postgresql.org/docs/14/app-pg-dumpall.html
用於將集群的所有PostgreSQL數據庫寫入( “轉儲” )到一個腳本文件中。該腳本文件包含可用作psql的輸入以恢復數據庫的SQL命令。它通過為集群中的每個數據庫調用pg_dump來做到這一點。pg_dumpall還轉儲所有數據庫共有的全局對象,即數據庫角色和表空間。(pg_dump不保存這些對象。)
由於pg_dumpall從所有數據庫中讀取表,您很可能必須以數據庫超級用戶身份連接才能生成完整的轉儲。此外,您需要超級用戶權限才能執行保存的腳本,以便允許添加角色和創建數據庫。
pg_dumpall需要多次連接到PostgreSQL服務器(每個數據庫一次)。如果您使用密碼身份驗證,它將每次都要求輸入密碼。~/.pgpass
在這種情況下,有一個文件很方便。有關詳細信息,請參閱第 34.16 節。
1.2 優缺點
* 優點:*
- 它轉儲全局 的東西——角色和表空間,這些不能被pg_dump轉儲。
- 單個命令,你可以獲得整個集群的結果
- 常用來備份全局對象而非全庫數據
* 缺點: *
- 轉儲很大,因為它未壓縮
- 轉儲非常慢,因為它是順序完成的,只有一個工作程序
- 僅恢復部分轉儲很難
- 生成psql腳本,pg_dumpall 只支持文本格式
- 它在內部調用pg_dump
2.pg_dumpall 使用
# pg_dump --help
用法:
pg_dumpall [選項] ...
常規選項:
-f, --file=FILENAME 輸出文件名
-v, --verbose 詳細模式
-V, --version 輸出版本信息,然后退出
--lock-wait-timeout=TIMEOUT 等待表鎖超時后失敗
-?, --help 顯示此幫助,然后退出
控制輸出內容的選項:
-a, --data-only 只轉儲數據,不轉儲模式
-c, --clean 在重新創建之前清理(刪除)數據庫
-E, --encoding=ENCODING 轉儲編碼 ENCODING 中的數據
-g, --globals-only 只轉儲全局對象,不轉儲數據庫
-O, --no-owner 跳過恢復對象所有權
-r, --roles-only 只轉儲角色,不轉儲數據庫或表空間
-s, --schema-only 只轉儲模式,不轉儲數據
-S, --superuser=NAME 在轉儲中使用的超級用戶用戶名
-t, --tablespaces-only 只轉儲表空間,不轉儲數據庫或角色
-x, --no-privileges 不轉儲權限(授予/撤銷)
--binary-upgrade 僅供升級實用程序使用
--column-inserts 將數據轉儲為帶有列名的 INSERT 命令
--disable-dollar-quoting 禁用美元報價,使用 SQL 標准報價
--disable-triggers 在僅數據還原期間禁用觸發器
--exclude-database=PATTERN 排除名稱與 PATTERN 匹配的數據庫
--extra-float-digits=NUM 覆蓋 extra_float_digits 的默認設置
--if-exists 在刪除對象時使用 IF EXISTS
--inserts 將數據轉儲為 INSERT 命令,而不是 COPY
--load-via-partition-root 通過根表加載分區
--no-comments 不轉儲評論
--no-publications 不轉儲出版物
--no-role-passwords 不轉儲角色的密碼
--no-security-labels 不轉儲安全標簽分配
--no-subscriptions 不轉儲訂閱
--no-sync 不等待更改安全寫入磁盤
--no-tablespaces 不轉儲表空間分配
--no-unlogged-table-data 不轉儲未記錄的表數據
--on-conflict-do-nothing 添加 ON CONFLICT DO NOTHING 到 INSERT 命令
--quote-all-identifiers 引用所有標識符,即使不是關鍵字
--rows-per-insert=NROWS 每個插入的行數;暗示 --inserts
--use-set-session-authorization
使用 SET SESSION AUTHORIZATION 命令而不是 ALTER OWNER 命令來設置所有權
連接選項:
-d, --dbname=CONNSTR 使用連接字符串連接
-h, --host=HOSTNAME 數據庫服務器主機或套接字目錄
-l, --database=DBNAME 替代默認數據庫
-p, --port=PORT 數據庫服務器端口號
-U, --username=NAME 以指定的數據庫用戶連接
-w, --no-password 從不提示輸入密碼
-W, --password 強制密碼提示(應該自動發生)
--role=ROLENAME 在轉儲前做 SET ROLE
3. pg_dumpall 示例
3.1 導出所有數據庫
$ pg_dumpall >pg_all.sql
3.2導出所有Role 和Tablespace
pg_dumpall -g >pg_globle.sql
pg_dumpall -g -h 127.0.0.1 > pg_globle.sql
#僅導出Role:
pg_dumpall -r >pg_roles.sql
# 僅導出Tablespace:
pg_dumpall -t >pg_tablespace.sql
3.3恢復
# 導入 :不存在的會導入,存在的不導入
psql -f pg_roles.sql
psql -f pg_roles.sql -h 127.0.0.1