Postgresql 備份與恢復

l1xnan發表於2018-04-08

pg_dump

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命令的形式轉儲資料
  --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 環境變數的數值.

psql

psql是PostgreSQL 的互動式客戶端工具。
使用方法:

psql [選項]... [資料庫名稱 [使用者名稱稱]]

通用選項:

  -c,--command=命令        執行單一命令(SQL或內部指令)然後結束
 -d, --dbname=資料庫名稱   指定要連線的資料庫 (預設:"l1xnan")
  -f, --file=檔名      從檔案中執行命令然後退出
  -l, --list             列出所有可用的資料庫,然後退出
  -v, --set=, --variable=NAME=VALUE
                           設定psql變數NAME為VALUE
                           (例如,-v ON_ERROR_STOP=1)
  -V, --version            輸出版本資訊, 然後退出
  -X, --no-psqlrc         不讀取啟動文件(~/.psqlrc)
  -1 ("one"), --single-transaction
                          作為一個單一事務來執行命令檔案(如果是非互動型的)
  -?, --help[=options]     顯示此幫助,然後退出
      --help=commands      列出反斜線命令,然後退出
      --help=variables     列出特殊變數,然後退出

輸入和輸出選項:

  -a, --echo-all          顯示所有來自於指令碼的輸入
  -b, --echo-errors        回顯失敗的命令
  -e, --echo-queries      顯示傳送給伺服器的命令
 -E, --echo-hidden        顯示內部命令產生的查詢
  -L, --log-file=檔名  將會話日誌寫入檔案
  -n, --no-readline       禁用增強命令列編輯功能(readline)
  -o, --output=FILENAME 將查詢結果寫入檔案(或 |管道)
  -q, --quiet             以沉默模式執行(不顯示訊息,只有查詢結果)
  -s, --single-step       單步模式 (確認每個查詢)
  -S, --single-line        單行模式 (一行就是一條 SQL 命令)

輸出格式選項 :

 -A, --no-align           使用非對齊表格輸出模式
  -F, --field-separator=STRING
             為欄位設定分隔符,用於不整齊的輸出(預設:"|")
  -H, --html             HTML 表格輸出模式
  -P, --pset=變數[=引數]    設定將變數列印到引數的選項(查閱 pset 命令)
  -R, --record-separator=STRING
             為不整齊的輸出設定字錄的分隔符(預設:換行符號)
  -t, --tuples-only      只列印記錄i
  -T, --table-attr=文字   設定 HTML 表格標記屬性(例如,寬度,邊界)
  -x, --expanded           開啟擴充套件表格輸出
  -z, --field-separator-zero
                           為不整齊的輸出設定欄位分隔符為位元組0
  -0, --record-separator-zero
                           為不整齊的輸出設定記錄分隔符為位元組0

聯接選項:

  -h, --host=主機名        資料庫伺服器主機或socket目錄(預設:"本地介面")
  -p, --port=埠        資料庫伺服器的埠(預設:"5432")
  -U, --username=使用者名稱    指定資料庫使用者名稱(預設:"l1xnan")
  -w, --no-password       永遠不提示輸入口令
  -W, --password           強制口令提示 (自動)

更多資訊,請在psql中輸入 ?(用於內部指令)或者 help(用於SQL命令),或者參考PostgreSQL文件中的psql章節.

pg_restore

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-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操作

選項 -I, -n, -P, -t, -T, 以及 --section 可以組合使用和指定
多次用於選擇多個物件.

如果沒有提供輸入檔名, 則使用標準輸入.

自動備份

.pgpass

在連線 PostgreSQL 資料庫時,如果想不用手動輸入密碼,官方利用密碼檔案(Password File)提供了一種解決方案:

  • Unix/Linux 在使用者目錄建立一個 ~/.pgpass 隱藏檔案或者是建立一個環境變數 PGPASSFILE 引用一個含有密碼資訊的檔案(檔案內容同 .pgpass 檔案,此處檔名可隨意,隱不隱藏都行)
  • Windows 對應的是 %APPDATA%postgresqlpgpass.conf 檔案( %APPDATA% 指的是使用者配置中的應用資料子目錄)。
PGPASSFILE 指定要用於查詢的口令檔案的名稱。如果沒有設定,預設為 ~/.pgpass

該檔案記錄著連線資料庫需要的所有資訊,按下面資料格式,每行一條記錄資訊:

hostname:port:database:username:password

該檔案中可以有註釋內容,註釋符號是 #
前四個欄位可以是確定的字面值,也可以使用萬用字元 * 匹配所有。
連線資料庫的時候,系統自動從前到後遍歷該檔案,使用最先匹配到的記錄,因此,當你在檔案中使用了萬用字元 * 的時候,應該優先把最具體的資訊放在檔案的最前面。

如果記錄資訊中包含 : 這兩個符號,需要對其進行轉義,就是在字元前面加轉義符號

在 Unix/Linux 系統中 .pgpass 檔案許可權只能對使用者自己開放,不能對使用者組和其他人開放,就是說 .pgpass 檔案對使用者組和其他人是”不可讀,不可寫,不可執行”的,通常會賦予 .pgpass 檔案許可權 600 ,命令如下:

chmod 0600 ~/.pgpass

如果任何一個許可權對使用者組或其他人開放了,該檔案就會被忽略。

利用環境變數 PGPASSFILE 引用的檔案許可權也要滿足這個要求,否則同樣會被忽略。
在 Windows 上,該檔案被假定儲存在一個安全的目錄中,因此不會進行特別的許可權檢查。

至此,資料庫對應的 .pgpass 檔案設定完成,以後再連線資料庫就不需要手動輸入密碼了,Shell Script 也能夠實現真正意義上的自動化管理。

pg_dump --clean -U <username> -d <example_db> -T <exclude_table_name> | gzip > example_db.bak

PGPASSWORD 環境變數

export PGPASSWORD="123456"
pg_dump  -U test testdb > /backup/testdb.bak

參見:

相關文章