1.pg_dump 概述
1.1 pg_dump 介紹
https://www.postgresql.org/docs/14/app-pgdump.html
pg_dump是用於備份一種PostgreSQL數據庫的工具。即使數據庫正在被並發使用,它也能創建一致的備份。pg_dump不阻塞其他用戶訪問數據庫(讀取或寫入)。
pg_dump只轉儲單個數據庫。要備份一個集簇或者集簇中 對於所有數據庫公共的全局對象(例如角色和表空間),應使用 pg_dumpall。
可以選擇一個數據庫或部分表進行備份,恢復過程可以跨平台遷移
可以在數據庫正在使用時進行完整一致的備份,並不阻塞其它用戶對數據庫的訪問
只能備份單個數據庫,不會導出角色和表空間相關的信息
1.2 pg_dump四種轉儲格式
Plain、custom、directory、tar
Plain 是純文本格式跟pg_dumpall轉儲一樣。你可以用psql加載它,如果轉儲很大,提取部分可能會很復雜。
使用pg_restore程序恢復所有其他格式(custom,directory和tar)
Pg_dump四種轉儲格式:
-F t tar格式的轉儲輸出格式,不支持壓縮,在早期版本有單表8G限制,目前版本已經改善
-F d 以目錄的格式創建備份,備份出來的是一個包含若干個目錄的備份文件,可以指定並行備份-j
-F c 備份為二進制格式, 壓縮存儲. 並且可被pg_restore用於精細還原,輸出輸入 IO 比較穩定
-F p 備份為文本, 大庫不推薦, 文本方式 ,對 IO 不可控,不穩定
2.pg_dump 使用
pg_dump --help
2.1 Usage:
pg_dump [OPTION]... [DBNAME]
2.2 General
一般選項:
-f, --file=FILENAME 輸出文件或目錄名
-F, --format=c|d|t|p 輸出文件格式 (custom, dir, tar) tezt(默認值))
-j, --jobs=NUM 執行多個並行任務進行備份轉儲工作
-v, --verbose 詳細模式
-V, --version 輸出版本信息,然后退出
-Z, --compress=0-9 被壓縮格式的壓縮級別
--lock-wait-timeout=TIMEOUT 在等待表鎖超時后操作失敗
--no-sync 不需要等待,執行刷盤
-?, --help 顯示此幫助, 然后退出
2.3 output content
控制輸出內容選項:
-a, --data-only 只轉儲數據,不包括模式
-b, --blobs 在轉儲中包括大對象
-B, --no-blobs 在轉儲中排除大對象
-c, --clean 在重新創建之前,先清除(刪除)數據庫對象 *****
-C, --create 在轉儲中包括命令,以便創建數據庫
-E, --encoding=ENCODING 轉儲以ENCODING形式編碼的數據
-n, --schema=PATTERN 只轉儲指定名稱的模式
-N, --exclude-schema=PATTERN 不轉儲已命名的模式
-O, --no-owner 在明文格式中, 忽略恢復對象所屬者
-s, --schema-only 只轉儲模式, 不包括數據
-S, --superuser=NAME 在明文格式中使用指定的超級用戶名
-t, --table=PATTERN 只轉儲指定名稱的表
-T, --exclude-table=PATTERN 不轉儲指定名稱的表
-x, --no-privileges 不要轉儲權限 (grant/revoke)
--binary-upgrade 僅供升級實用程序使用
--column-inserts 以帶有列名的INSERT命令形式轉儲數據
--disable-dollar-quoting 取消美元 (符號) 引號, 使用 SQL 標准引號
--disable-triggers 在恢復數據的過程中禁用觸發器
--enable-row-security 啟用行安全性(只轉儲用戶能夠訪問的內容)
--exclude-table-data=PATTERN 不轉儲指定名稱的表中的數據
--extra-float-digits=NUM 覆蓋 extra_float_digits 的默認設置
--if-exists 當刪除對象時使用IF EXISTS
--inserts 以INSERT命令,而不是COPY命令的形式轉儲數據
--load-via-partition-root 通過根表加載分區
--no-comments 不轉儲評論
--no-publications 不轉儲出版物
--no-security-labels 不轉儲安全標簽分配
--no-subscriptions 不轉儲訂閱
--no-synchronized-snapshots 在並行作業中不使用同步快照
--no-tablespaces 不轉儲表空間分配
--no-unlogged-table-data 不轉儲未記錄的表數據
--on-conflict-do-nothing 添加 ON CONFLICT DO NOTHING 到 INSERT 命令
--quote-all-identifiers 引用所有標識符,即使不是關鍵字
--rows-per-insert=NROWS 每個插入的行數;暗示 --inserts
--section=SECTION 轉儲命名節(前數據、數據或后數據)
--serializable-deferable 等到轉儲可以無異常運行
--snapshot=SNAPSHOT 使用給定的快照進行轉儲
--strict-names 要求表和/或模式包含模式以匹配每個至少一個實體
--use-set-session-authorization
使用 SET SESSION AUTHORIZATION 命令而不是 ALTER OWNER 命令來設置所有權
2.4 Connection options
Connection options
-d, --dbname=DBNAME 對數據庫 DBNAME備份
-h, --host=HOSTNAME 數據庫服務器的主機名或套接字目錄
-p, --port=PORT 數據庫服務器的端口號
-U, --username=NAME 以指定的數據庫用戶聯接
-w, --no-password 永遠不提示輸入口令
-W, --password 強制口令提示 (自動)
--role=ROLENAME 在轉儲前運行SET ROLE
3. pg_dump 示例
3.1 默認的文本方式
# 備份數據庫
pg_dump -Fp-f/tmp/testdb.sql -C -E UTF8 -h 127.0.0.1 -U postgres testdb
#或 簡單語法 ,默認就是文本的方式
pg_dump testdb >/tmp/testdb.sql
# 將數據恢復到 testdb1 , 導入數據時首先創建數據庫
createdb testdb1
psql testdb1</tmp/testdb.sql
3.2 二進制備份文件
#二進制格式備份文件, 指定類開 -F c
pg_dump -F c -f /tmp/testdb.dmp -C -EUTF8 -h 127.0.0.1 -U postgres testdb
#可選,解析二進制格式的備份文件 ,查看二進制文件的備份內容
pg_restore -f /tmp/a.log /tmp/testdb.dmp
#可選,-l 生成備份集的toc例表,可以編輯該toc文件 ,注釋其中的表,恢復部份對象
pg_restore -l -f /tmp/a.toc /tmp/testdb.dmp
# 二進制格式 ,tar 格式 ,目錄格式 ,都需要用pg_restore 來恢復
pg_restore -d testdb1 /tmp/testdb.dmp #需要先創建目標庫,還原恢復
4.pg_dump 擴展
4.1.生成toc文件進行選擇性恢復
1)根據二進制備份文件生成toc文件
pg_restore -l -f /tmp/toc1 /tmp/testdb.dmp
2)修改 toc文件,以首行加分號“;”的方式注釋掉不用還原的內容
vi /tmp/toc1
265; 1259 25280 TABLE public postgres_log postgres
266; 1259 25293 TABLE public t2 postgres
213; 1259 16385 TABLE public test postgres
3660; 0 25280 TABLE DATA public postgres_log postgres
;3661; 0 25293 TABLE DATA public t2 postgres # 這個表用; 注釋了,不會恢復
;3659; 0 16385 TABLE DATA public test postgres # 這個表用; 注釋了,不會恢復
3520; 2606 25287 CONSTRAINT public postgres_log postgres_log_pkey postgres
3442; 1259 25269 INDEX public idx_test postgres
3)以toc文件列表做恢復
pg_restore –F c -L /tmp/toc -d testdb /tmp/testdb.dmp
4.2使用unix管道備份恢復
1. 壓縮與解壓
pg_dump testdb| gzip > /tmp/testdbbak.sql.gz #操作系統壓縮
gunzip -c /tmp/testdbbak.sql.gz | psql testdb2 #解壓縮恢復
2.備份恢復數據不落盤
pg_dump testdb | psql testdb1 #備份testdb ,馬上又還原到 testdb1,testdb1庫要先創建, 數據不落盤,這路對小數據進行測試是非常方便的。
3.分割備份文件
備份: pg_dump dbname | split-b1m- filename
恢復: catfilename* | psql dbname
4.3.並行處理
pg_dump -Fd -j4 -f /tmp/db.dir testdb #-F d 以目錄的格式創建備份
pg_restore -d testdb3 -j4 /tmp/db.dir
-j 參數指定同時幾個進程來同時執行,每個進程同時只處理一個表的數據。
5.補充
邏輯備份,相對靈活,可以排除大表。 可以結合物理備份使用。
如果備份以默認的明文方式保存,輸出輸入 IO 不可控,生產環境中建議使用 -F c 二進制方式備份比較穩定 。
