1. pg_dump 使用及示例


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 不可控,不穩定

計算機生成了可選文字: 0卻n 卉行愫 卉行領

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 二進制方式備份比較穩定 。






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM