目錄
概述
pg_dump
pg_dumpall
pg_basebackup
pg_restore
總結
概述
PostgreSQL 提供了一系列強大的工具來備份和恢復數據庫。這些工具包括 pg_dump, pg_restore, pg_dumpall, 和 pg_basebackup。下面是這些工具的簡要概述和一些注意事項:
1. pg_dump
pg_dump 是一個用于備份單個 PostgreSQL 數據庫的工具。它可以生成 SQL 文件或自包含的歸檔文件,其中包含了創建和填充數據庫所需的所有 SQL 命令。
用途:備份單個數據庫。
2. pg_dumpall
pg_dumpall 用于備份整個 PostgreSQL 集群,包括所有數據庫、角色、表空間等。
用途:備份整個 PostgreSQL 集群。
3. pg_basebackup
pg_basebackup 用于創建整個 PostgreSQL 數據目錄的物理備份,這對于災難恢復尤為重要。
用途:備份整個 PostgreSQL 數據目錄。
4. pg_restore
pg_restore 是一個用于從 pg_dump 創建的備份文件恢復數據的工具。
用途:恢復單個數據庫。
一、pg_dump
pg_dump參數詳解
# 通用選項
-f, --file=FILENAME # 輸出文件或目錄的名稱。
-F, --format=c|d|t|p # 輸出文件格式(自定義[c]、目錄[d]、tar[t]、純文本[p],默認為純文本)。
-j, --jobs=NUM # 使用指定數量的并行任務來執行數據庫轉儲。
-v, --verbose # 詳細模式。
-V, --version # 輸出版本信息,然后退出。
-Z, --compress=METHOD[:DETAIL] # 按指定的方式壓縮輸出。
--lock-wait-timeout=TIMEOUT # 在等待表鎖超時后失敗,超時時間為TIMEOUT。
--no-sync # 不等待更改安全地寫入磁盤。
-?, --help # 顯示幫助,然后退出。
# 控制輸出內容的選項
-a, --data-only # 只轉儲數據,不轉儲模式。
-b, --large-objects # 在轉儲中包含大對象。
--blobs # (與--large-objects相同,已棄用)
-B, --no-large-objects # 在轉儲中排除大對象。
--no-blobs # (與--no-large-objects相同,已棄用)
-c, --clean # 清理(刪除)數據庫對象后再重新創建。
-C, --create # 在轉儲中包含創建數據庫的命令。
-e, --extension=PATTERN # 只轉儲指定的擴展。
-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-and-children=PATTERN # 不轉儲指定的表及其子表和分區表。
--exclude-table-data=PATTERN # 不轉儲指定表的數據。
--exclude-table-data-and-children=PATTERN # 不轉儲指定表及其子表和分區表的數據。
--extra-float-digits=NUM # 覆蓋extra_float_digits的默認設置。
--if-exists # 在刪除對象時使用IF EXISTS。
--include-foreign-data=PATTERN # 包含與指定模式匹配的外部服務器上的外部表數據。
--inserts # 作為INSERT命令而不是COPY命令轉儲數據。
--load-via-partition-root # 通過根表加載分區。
--no-comments # 不轉儲注釋。
--no-publications # 不轉儲發布。
--no-security-labels # 不轉儲安全標簽分配。
--no-subscriptions # 不轉儲訂閱。
--no-table-access-method # 不轉儲表訪問方法。
--no-tablespaces # 不轉儲表空間分配。
--no-toast-compression # 不轉儲TOAST壓縮方法。
--no-unlogged-table-data # 不轉儲未登錄表的數據。
--on-conflict-do-nothing # 在INSERT命令中添加ON CONFLICT DO NOTHING。
--quote-all-identifiers # 引用所有標識符,即使它們不是關鍵字。
--rows-per-insert=NROWS # 每個INSERT命令中的行數;隱含--inserts。
--section=SECTION # 轉儲命名的段(預數據、數據或后數據)。
--serializable-deferrable # 等待直到可以無異常地運行轉儲。
--snapshot=SNAPSHOT # 使用給定的快照進行轉儲。
--strict-names # 要求表和/或模式包含模式至少匹配一個實體。
--table-and-children=PATTERN # 只轉儲指定的表及其子表和分區表。
--use-set-session-authorization # 使用SET SESSION AUTHORIZATION命令代替ALTER OWNER命令來設置所有權。
# 連接選項
-d, --dbname=DBNAME # 要轉儲的數據庫名稱。
-h, --host=HOSTNAME # 數據庫服務器的主機名或套接字目錄。
-p, --port=PORT # 數據庫服務器的端口號。
-U, --username=NAME # 以指定的數據庫用戶連接。
-w, --no-password # 永遠不要提示輸入密碼。
-W, --password # 強制提示輸入密碼(應自動發生)。
--role=ROLENAME # 在轉儲前執行SET ROLE。
# 如果沒有提供數據庫名稱,則使用PGDATABASE環境變量的值。
pg_dump使用示例
要將數據庫轉儲到自定義格式的存檔文件中,請執行以下操作:
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -Fc -d mydb > db.dump
要將數據庫轉儲到目錄格式存檔中,請執行以下操作:
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -Fd -d mydb -f dumpdir
要將數據庫轉儲到目錄格式存檔中,同時執行 5 個工作線程作業:
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -Fd -d mydb -j 5 -f dumpdir
轉儲名為:mytab
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -d mydb > mytab.sql
轉儲以emp開頭的所有表,排除名為 :empdetroitemployee_log集合
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -t 'detroit.emp*' -T detroit.employee_log mydb > db.sql
轉儲名稱以 east 開頭且以 gsm結尾的所有集合,排除名稱包含單詞test : 的集合
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -n 'east*gsm' -N '*test*' mydb > db.sql
同樣,使用正則表達式表示法來合并開關:
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -n '(east|west)*gsm' -N '*test*' mydb > db.sql
轉儲除名稱以ts_*開頭的集合之外的所有集合
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -T 'ts_*' mydb > db.sql
轉儲具有混合大小寫名稱的單個表,您需要類似-t
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -t "\"MixedCaseName\"" mydb > mytab.sql
備份數據庫結構(不包含數據)
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W --schema-only mydatabase > mydatabase_schema_only.sql
備份數據庫數據(不包含結構)
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W --data-only mydatabase > mydatabase_schema_only.sql
備份多個特定表
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -t table1 -t table2 mydatabase > tables_backup.sql
備份數據庫并壓縮
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -d mydb | gzip > mydatabase_backup.sql.gz
備份并導出為 INSERT 語句
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W --format=c --large-objects --inserts mydatabase > insert_statements.sql
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W --schema-only mydatabase > all_schemas_structure.sql
二、pg_dumpall
pg_dumpall參數詳解
# 使用語法
pg_dumpall [OPTION]...
# 通用選項
-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-table-access-method # 不轉儲表訪問方法
--no-tablespaces # 不轉儲表空間分配
--no-toast-compression # 不轉儲TOAST壓縮方法
--no-unlogged-table-data # 不轉儲未登錄表的數據
--on-conflict-do-nothing # 在INSERT命令中添加ON CONFLICT DO NOTHING
--quote-all-identifiers # 引用所有標識符,即使它們不是關鍵字
--rows-per-insert=NROWS # 每個INSERT語句中的行數;隱含--inserts
--use-set-session-authorization
pg_dumpall使用示例
#備份整個數據庫以及角色
pg_dumpall -U postgres -h 127.0.0.1 -p 5432 -W -f alldb_backup.sql
#備份所有數據庫角色和全局對象
pg_dumpall -U postgres -h 127.0.0.1 -p 5432 -W --globals-only -f globals_backup.sql
#僅備份角色
pg_dumpall -U postgres -h 127.0.0.1 -p 5432 -W --roles-only -f alldb_backup.sql
#僅備份數據
pg_dumpall -U postgres -h 127.0.0.1 -p 5432 -W --data-only -f alldb_backup.sql
#忽略某個庫
pg_dumpall -U postgres -h 127.0.0.1 -p 5432 -W -f alldb_backup.sql --exclude-database=mydb > alldb_backup.sql
#將數據轉儲為帶有列名的INSERT命令
pg_dumpall -U postgres -h 127.0.0.1 -p 5432 -W --column-inserts -f alldb_backup.sql
#將數據轉儲為INSERT命令
pg_dumpall -U postgres -h 127.0.0.1 -p 5432 -W --inserts -f alldb_backup.sql
#備份壓縮
pg_dumpall -U postgres -h 127.0.0.1 -p 5432 -w --inserts | gzip > alldb_backup.sql.gz
三、pg_basebackup
pg_basebackup參數詳解
# 使用語法
pg_basebackup [OPTION]...
# 控制輸出的選項
-D, --pgdata=DIRECTORY # 將基線備份接收至指定目錄
-F, --format=p|t # 輸出格式(plain(默認),tar)
-r, --max-rate=RATE # 設置數據目錄傳輸的最大速率(單位為kB/s,或使用"k"或"M"后綴)
-R, --write-recovery-conf # 寫入用于復制的配置文件
-t, --target=TARGET[:DETAIL]
# 備份目標(如果不同于客戶端)
-T, --tablespace-mapping=OLDDIR=NEWDIR
# 將位于OLDDIR的表空間重定位至NEWDIR
--waldir=WALDIR # 寫前日志(WAL)目錄的位置
-X, --wal-method=none|fetch|stream
# 使用指定的方法包含所需的WAL文件
-z, --gzip # 壓縮tar輸出
-Z, --compress=[{client|server}-]METHOD[:DETAIL]
# 按指定方式在客戶端或服務器上進行壓縮
-Z, --compress=none # 不壓縮tar輸出
# 通用選項
-c, --checkpoint=fast|spread # 設置快速或分散的檢查點
-C, --create-slot # 創建復制槽
-l, --label=LABEL # 設置備份標簽
-n, --no-clean # 出現錯誤后不清理
-N, --no-sync # 不等待更改被安全地寫入磁盤
-P, --progress # 顯示進度信息
-S, --slot=SLOTNAME # 使用的復制槽
-v, --verbose # 輸出詳細信息
-V, --version # 輸出版本信息,然后退出
--manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE
# 使用算法進行清單校驗和
--manifest-force-encode # 對清單中的所有文件名進行十六進制編碼
--no-estimate-size # 不在服務器端估計備份大小
--no-manifest # 抑制生成備份清單
--no-slot # 阻止創建臨時復制槽
--no-verify-checksums # 不驗證校驗和
-?, --help # 顯示此幫助,然后退出
# 連接選項
-d, --dbname=CONNSTR # 連接字符串
-h, --host=HOSTNAME # 數據庫服務器主機名或套接字目錄
-p, --port=PORT # 數據庫服務器端口號
-s, --status-interval=INTERVAL
# 發送至服務器的狀態包的時間間隔(單位為秒)
-U, --username=NAME # 作為指定的數據庫用戶連接
-w, --no-password # 從不提示輸入密碼
-W, --password # 強制密碼提示(應自動發生)
pg_basebackup使用示例
普通文件:
pg_basebackup -h 10.10.9.7 -U replication_user -p 5432 -Xs -v -Fp -P -r 100M -R -D /root/zz/
壓縮:
pg_basebackup -h 10.10.9.7 -U replication_user -p 5432 -Xs -v -Ft -P -r 100M -R -D /root/zz/
四、pg_restore
pg_restore參數詳解
# 使用語法
pg_restore [OPTION]... [FILE]
# 通用選項
-d, --dbname=NAME # 連接到指定的數據庫名
-f, --file=FILENAME # 輸出文件名 (- 表示標準輸出)
-F, --format=c|d|t # 備份文件格式(通常應自動識別)
-l, --list # 打印歸檔的TOC(目錄)摘要
-v, --verbose # 詳細模式
-V, --version # 輸出版本信息,然后退出
-?, --help # 顯示幫助信息,然后退出
# 控制恢復的選項
-a, --data-only # 只恢復數據,不恢復模式(schema)
-c, --clean # 清理(刪除)數據庫對象之前重新創建
-C, --create # 創建目標數據庫
-e, --exit-on-error # 出錯時退出,默認是繼續執行
-I, --index=NAME # 恢復指定名稱的索引
-j, --jobs=NUM # 使用多個并行任務來恢復
-L, --use-list=FILENAME # 使用此文件中的TOC選擇/排序輸出
-n, --schema=NAME # 只恢復此模式(schema)中的對象
-N, --exclude-schema=NAME # 不恢復此模式(schema)中的對象
-O, --no-owner # 跳過對象所有權的恢復
-P, --function=NAME(args) # 恢復指定名稱的函數
-s, --schema-only # 只恢復模式(schema),不恢復數據
-S, --superuser=NAME # 用于禁用觸發器的超級用戶名
-t, --table=NAME # 恢復指定名稱的關系(表,視圖等)
-T, --trigger=NAME # 恢復指定名稱的觸發器
-x, --no-privileges # 跳過訪問權限的恢復(grant/revoke)
-1, --single-transaction # 作為一個單一的事務恢復
--disable-triggers # 在僅數據恢復期間禁用觸發器
--enable-row-security # 啟用行級安全性
--if-exists # 在刪除對象時使用IF EXISTS
--no-comments # 不恢復注釋
--no-data-for-failed-tables # 不恢復未能創建的表的數據
--no-publications # 不恢復發布(publications)
--no-security-labels # 不恢復安全標簽
--no-subscriptions # 不恢復訂閱
--no-table-access-method # 不恢復表訪問方法
--no-tablespaces # 不恢復表空間分配
--section=SECTION # 恢復指定部分(pre-data, data, 或 post-data)
--strict-names # 要求表和/或模式包含模式至少匹配每個實體
--use-set-session-authorization
# 使用SET SESSION AUTHORIZATION命令而不是ALTER OWNER命令來設置所有權
# 連接選項
-h, --host=HOSTNAME # 數據庫服務器主機名或套接字目錄
-p, --port=PORT # 數據庫服務器端口號
-U, --username=NAME # 以指定的數據庫用戶身份連接
-w, --no-password # 從不提示輸入密碼
-W, --password # 強制密碼提示(應自動發生)
--role=ROLENAME # 在恢復前執行SET ROLE
# 注意事項
# -I, -n, -N, -P, -t, -T 和 --section 選項可以組合并多次指定以選擇多個對象。
# 如果沒有提供輸入文件名,則使用標準輸入。
pg_restore使用示例
1.恢復整個數據庫
pg_restore -U postgres -h 127.0.0.1 -p 5432 -W -d mydb db.dump
2.恢復到指定的數據庫并使用不同的用戶名
pg_restore -U username -d new_database db.dump
3.恢復部分數據庫對象
恢復指定表
pg_restore -d new_database -t table_name db.dump
恢復的模式名
pg_restore -d new_database -n schema_name db.dump
4.恢復時使用 --create 選項創建數據庫
pg_restore --create -d postgres db.dump
5.恢復到現有數據庫,并使用并行恢復
pg_restore -d new_database -j 4 db.dump
6.將恢復輸出重定向到文件
pg_restore -U postgres -h 127.0.0.1 -p 5432 -W --file=output.sql db.dump
7.只恢復數據,不恢復表結構
pg_restore -U postgres -h 127.0.0.1 -p 5432 -W -d mydb --data-only -j 4 db.dump
8.報錯時退出,默認繼續執行
pg_restore -d new_database -j 4 --exit-on-error db.dump
9.不恢復此模式(schema)中的表
pg_restore -d new_database -j 4 --exit-on-error --exclude-schema=NAME db.dump
10.跳過權限的恢復
pg_restore -d new_database -j 4 --exit-on-error --no-owner --no-privileges db.dump
11.以事務方式導入
pg_restore -U postgres -h 127.0.0.1 -p 5432 -W -d mydb --single-transaction db.dump
總結
根據備份的需求選擇合適的工具。pg_dump 用于單個數據庫的備份和恢復,pg_dumpall 用于整個集群的備份,pg_basebackup 用于物理備份。
- 備份策略:制定定期備份計劃,并測試恢復過程,確保備份文件可用。
- 安全:備份文件可能包含敏感數據,應妥善保管備份文件,并考慮使用加密。
- 測試:定期測試備份文件的恢復,以確保在需要時能夠正確恢復數據。
- 性能:對于大型數據庫,考慮使用流式備份或并行備份來提高備份和恢復的速度。
- 權限:確保執行備份和恢復的用戶具有適當的權限。
作者介紹
吳守陽,51CTO社區編輯,擁有8年DBA工作經驗,熟練管理MySQL、Redis、MongoDB等開源數據庫。精通性能優化、備份恢復和高可用性架構設計。善于故障排除和自動化運維,保障系統穩定可靠。具備良好的團隊合作和溝通能力,致力于為企業提供高效可靠的數據庫解決方案。