前言
PostgreSQL 使用 pg_dump 和 pg_dumpall 進行數據庫的邏輯備份,使用 pg_restore 導入數據,pg_dumpall 是對整個數據庫集群進行備份,pg_dump 可以選擇一個數據庫或者部分表進行備份。
關於 pg_dump:
-
pg_dump 將表結構及數據以 SQL 語句的形式導出到 sql 文件或其他格式文件,恢復數據時,將導出的文件作為輸入,執行其中的 SQL 語句,即可恢復數據。
-
pg_dump 能夠對正在使用的 PostgreSQL 數據庫進行備份,並且不影響正常業務的讀寫。
-
pg_dump 是一個客戶端工具,可以遠程或本地導出邏輯數據,恢復數據至導出時間點。
-
pg_dump 一次只轉儲一個數據庫,並不會轉儲有關角色或表空間的信息 (因為那些是群集范圍而不是每個數據庫)。
關於 pg_dumpall:
-
如果要備份 Cluster 中數據庫共有的全局對象,例如角色和表空間,需要使用 pg_dumpall。
-
備份文件以文本或存檔文件格式輸出。
-
Script dumps 是一個普通文本文件,包含將數據庫重構到保存時的狀態所需的 SQL 命令。
-
pg_dumpall 在給定的群集中備份每個數據庫, 並保留群集范圍內的數據, 如角色和表空間定義。
pg_dump 常用參數
- -h host,指定數據庫主機名,或者IP
- -p port,指定端口號
- -U user,指定連接使用的用戶名
- -W,按提示輸入密碼
- dbname,指定連接的數據庫名稱,實際上也是要備份的數據庫名稱。
- -a,–data-only,只導出數據,不導出表結構
- -c,–clean,是否生成清理該數據庫對象的語句,比如drop table
- -C,–create,是否輸出一條創建數據庫語句
- -f file,–file=file,輸出到指定文件中
- -n schema,–schema=schema,只轉存匹配schema的模式內容
- -N schema,–exclude-schema=schema,不轉存匹配schema的模式內容
- -O,–no-owner,不設置導出對象的所有權
- -s,–schema-only,只導致對象定義模式,不導出數據
- -t table,–table=table,只轉存匹配到的表,視圖,序列,可以使用多個-t匹配多個表
- -T table,–exclude-table=table,不轉存匹配到的表。
- –inserts,使用insert命令形式導出數據,這種方式比默認的copy方式慢很多,但是可用於將數據導入到非PostgreSQL數據庫。
- –column-inserts,導出的數據,有顯式列名
pg_dump 常用示例
1.1 導出單表數據
pg_dump -h 127.0.0.1 -U admin -p 5432 -W db -t t1 –inserts > bak.sql
1.2 導出多個表數據
pg_dump -h 127.0.0.1 -U admin -p 5432 -W db -t t1 -t t2 –inserts > bak.sql
1.3 導出整個數據庫
pg_dump -h 127.0.0.1 -U admin -p 5432 -W db –inserts > bak.sql
1.4 只導出表結構,不導出數據
pg_dump -h 127.0.0.1 -U admin -p 5432 -W db -s > bak.sql
1.5 只導出數據,不導出表結構
pg_dump -h 127.0.0.1 -U admin -p 5432 -W db –inserts -a > bak.sql
pg_dump 工具參數
pg_dump --help
pg_dump 把一個數據庫轉儲為純文本文件或者是其它格式.
用法:
pg_dump [選項]... [數據庫名字]
一般選項:
-f, --file=FILENAME 輸出文件或目錄名
-F, --format=c|d|t|p 輸出文件格式 (定制, 目錄, tar)
明文 (默認值))
-j, --jobs=NUM 執行多個並行任務進行備份轉儲工作
-v, --verbose 詳細模式
-V, --version 輸出版本信息,然后退出
-Z, --compress=0-9 被壓縮格式的壓縮級別
--lock-wait-timeout=TIMEOUT 在等待表鎖超時后操作失敗
--no-sync do not wait for changes to be written safely to disk
-?, --help 顯示此幫助, 然后退出
控制輸出內容選項:
-a, --data-only 只轉儲數據,不包括模式
-b, --blobs 在轉儲中包括大對象
-B, --no-blobs exclude large objects in dump
-c, --clean 在重新創建之前,先清除(刪除)數據庫對象
-C, --create 在轉儲中包括命令,以便創建數據庫
-E, --encoding=ENCODING 轉儲以ENCODING形式編碼的數據
-n, --schema=SCHEMA 只轉儲指定名稱的模式
-N, --exclude-schema=SCHEMA 不轉儲已命名的模式
-o, --oids 在轉儲中包括 OID
-O, --no-owner 在明文格式中, 忽略恢復對象所屬者
-s, --schema-only 只轉儲模式, 不包括數據
-S, --superuser=NAME 在明文格式中使用指定的超級用戶名
-t, --table=TABLE 只轉儲指定名稱的表
-T, --exclude-table=TABLE 不轉儲指定名稱的表
-x, --no-privileges 不要轉儲權限 (grant/revoke)
--binary-upgrade 只能由升級工具使用
--column-inserts 以帶有列名的INSERT命令形式轉儲數據
--disable-dollar-quoting 取消美元 (符號) 引號, 使用 SQL 標准引號
--disable-triggers 在只恢復數據的過程中禁用觸發器
--enable-row-security 啟用行安全性(只轉儲用戶能夠訪問的內容)
--exclude-table-data=TABLE 不轉儲指定名稱的表中的數據
--if-exists 當刪除對象時使用IF EXISTS
--inserts 以INSERT命令,而不是COPY命令的形式轉儲數據
--load-via-partition-root load partitions via the root table
--no-comments do not dump comments
--no-publications do not dump publications
--no-security-labels 不轉儲安全標簽的分配
--no-subscriptions do not dump subscriptions
--no-synchronized-snapshots 在並行工作集中不使用同步快照
--no-tablespaces 不轉儲表空間分配信息
--no-unlogged-table-data 不轉儲沒有日志的表數據
--quote-all-identifiers 所有標識符加引號,即使不是關鍵字
--section=SECTION 備份命名的節 (數據前, 數據, 及 數據后)
--serializable-deferrable 等到備份可以無異常運行
--snapshot=SNAPSHOT 為轉儲使用給定的快照
--strict-names 要求每個表和/或schema包括模式以匹配至少一個實體
--use-set-session-authorization
使用 SESSION AUTHORIZATION 命令代替
ALTER OWNER 命令來設置所有權
聯接選項:
-d, --dbname=DBNAME 對數據庫 DBNAME備份
-h, --host=主機名 數據庫服務器的主機名或套接字目錄
-p, --port=端口號 數據庫服務器的端口號
-U, --username=名字 以指定的數據庫用戶聯接
-w, --no-password 永遠不提示輸入口令
-W, --password 強制口令提示 (自動)
--role=ROLENAME 在轉儲前運行SET ROLE
如果沒有提供數據庫名字, 那么使用 PGDATABASE 環境變量
的數值.
pg_dumpall
pg_dump 只能備份單個庫,pg_dumpall 可以備份整個 postgresql 實例中所有的數據,包括角色和表空間定義。
示例如下:
pg_dumpall -h 127.0.0.1 -U admin -p 5432 -W –inserts > bak.sql
pg_dumpall 工具參數
pg_dumpall --help
pg_dumpall 抽取一個 PostgreSQL 數據庫簇進一個 SQL 腳本文件.
用法:
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, --oids 在轉儲中包括 OID
-O, --no-owner 不恢復對象所屬者
-r, --roles-only 只轉儲角色,不包括數據庫或表空間
-s, --schema-only 只轉儲模式, 不包括數據
-S, --superuser=NAME 在轉儲中, 指定的超級用戶名
-t, --tablespaces-only 只轉儲表空間,而不轉儲數據庫或角色
-x, --no-privileges 不要轉儲權限 (grant/revoke)
--binary-upgrade 只能由升級工具使用
--column-inserts 以帶有列名的INSERT命令形式轉儲數據
--disable-dollar-quoting 取消美元 (符號) 引號, 使用 SQL 標准引號
--disable-triggers 在只恢復數據的過程中禁用觸發器
--if-exists 當刪除對象時使用IF EXISTS
--inserts 以INSERT命令,而不是COPY命令的形式轉儲數據
--load-via-partition-root load partitions via the root table
--no-comments do not dump comments
--no-publications do not dump publications
--no-role-passwords do not dump passwords for roles
--no-security-labels 不轉儲安全標簽的分配
--no-subscriptions do not dump subscriptions
--no-sync do not wait for changes to be written safely to disk
--no-tablespaces 不轉儲表空間分配信息
--no-unlogged-table-data 不轉儲沒有日志的表數據
--quote-all-identifiers 所有標識符加引號,即使不是關鍵字
--use-set-session-authorization
使用 SESSION AUTHORIZATION 命令代替
ALTER OWNER 命令來設置所有權
聯接選項:
-d, --dbname=CONNSTR 連接數據庫使用的連接串
-h, --host=主機名 數據庫服務器的主機名或套接字目錄
-l, --database=DBNAME 另一個缺省數據庫
-p, --port=端口號 數據庫服務器的端口號
-U, --username=名字 以指定的數據庫用戶聯接
-w, --no-password 永遠不提示輸入口令
-W, --password 強制口令提示 (自動)
--role=ROLENAME 在轉儲前運行SET ROLE
pg_restore 實例
#pg_restore恢復示例
pg_restore -h 192.168.0.100 -p 5432 -U postgres -W -d us2011 -v "/root/us2010.backup"
也可以直接使用 psql 執行 sql 文件
./psql -d databaseName -U postgres -f /Users/xxx/xx_dump.sql
-d 后面緊跟的為 數據庫名
-U 后面緊跟的為 數據庫用戶名
-f 后面緊跟的為 sql文件路徑,也就是備份的SQL語句。
pg_restore 數據導入工具
pg_restore --help
pg_restore 從一個歸檔中恢復一個由 pg_dump 創建的 PostgreSQL 數據庫.
用法:
pg_restore [選項]... [文件名]
一般選項:
-d, --dbname=名字 連接數據庫名字
-f, --file=文件名 輸出文件名
-F, --format=c|d|t 備份文件格式(應該自動進行)
-l, --list 打印歸檔文件的 TOC 概述
-v, --verbose 詳細模式
-V, --version 輸出版本信息, 然后退出
-?, --help 顯示此幫助, 然后退出
恢復控制選項:
-a, --data-only 只恢復數據, 不包括模式
-c, --clean 在重新創建之前,先清除(刪除)數據庫對象
-C, --create 創建目標數據庫
-e, --exit-on-error 發生錯誤退出, 默認為繼續
-I, --index=NAME 恢復指定名稱的索引
-j, --jobs=NUM 執行多個並行任務進行恢復工作
-L, --use-list=FILENAME 從這個文件中使用指定的內容表排序
輸出
-n, --schema=NAME 在這個模式中只恢復對象
-N, --exclude-schema=NAME do not restore objects in this schema
-O, --no-owner 不恢復對象所屬者
-P, --function=NAME(args) 恢復指定名字的函數
-s, --schema-only 只恢復模式, 不包括數據
-S, --superuser=NAME 使用指定的超級用戶來禁用觸發器
-t, --table=NAME restore named relation (table, view, etc.)
-T, --trigger=NAME 恢復指定名字的觸發器
-x, --no-privileges 跳過處理權限的恢復 (grant/revoke)
-1, --single-transaction 作為單個事務恢復
--disable-triggers 在只恢復數據的過程中禁用觸發器
--enable-row-security 啟用行安全性
--if-exists 當刪除對象時使用IF EXISTS
--no-comments do not restore comments
--no-data-for-failed-tables 對那些無法創建的表不進行
數據恢復
--no-publications do not restore publications
--no-security-labels 不恢復安全標簽信息
--no-subscriptions do not restore subscriptions
--no-tablespaces 不恢復表空間的分配信息
--section=SECTION 恢復命名節 (數據前、數據及數據后)
--strict-names 要求每個表和/或schema包括模式以匹配至少一個實體
--use-set-session-authorization
使用 SESSION AUTHORIZATION 命令代替
ALTER OWNER 命令來設置所有權
聯接選項:
-h, --host=主機名 數據庫服務器的主機名或套接字目錄
-p, --port=端口號 數據庫服務器的端口號
-U, --username=名字 以指定的數據庫用戶聯接
-w, --no-password 永遠不提示輸入口令
-W, --password 強制口令提示 (自動)
--role=ROLENAME 在恢復前執行SET ROLE操作
The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified
multiple times to select multiple objects.