pg 備份恢復之 pg_dump

pg_dump
pg_dump — 把 PostgreSQL 數據庫抽取爲一個腳本文件或其他歸檔文件

大綱:

[root@pg-test ~]# pg_dump --help
pg_dump dumps a database as a text file or to other formats.

Usage:
  pg_dump [OPTION]... [DBNAME]

描述:

pg_dump 是用於備份一種 PostgreSQL 數據庫的工具。即使數據庫正在被併發使用,它也能創
建一致的備份。pg_dump不阻塞其他用戶訪問數據庫(讀取或寫入)。
pg_dump 只轉儲單個數據庫。要備份一個集簇中 對於所有數據庫公共的全局對象(例如角色
和表空間),應使用 pg_dumpall 。
轉儲可以被輸出到腳本或歸檔文件格式。腳本轉儲是包含 SQL 命令的純文本文件,它們可以
用來重構數據庫到它被轉儲時的狀態。要從這樣一個腳本恢復,將它餵給 psql 。腳本文件甚
至可以被用來在其他機器和其他架構上重構數據庫。在經過一些修改後,甚至可以在其他
SQL 數據庫產品上重構數據庫。
另一種可選的歸檔文件格式必須與 pg_restore 配合使用來重建數據庫。它們允許 pg_restore 能
選擇恢復什麼,或者甚至在恢復之前對條目重排序。歸檔文件格式被設計爲在架構之間可移
植。
當使用歸檔文件格式之一併與 pg_restore 組合時,pg_dump提供了一種靈活的歸檔和傳輸機
制。pg_dump可以被用來備份整個數據庫,然後 pg_restore 可以被用來檢查歸檔並/或選擇數據
庫的哪些部分要被恢復。最靈活的輸出文件格式是“自定義”格式( -Fc )和“目錄”格式
( -Fd )。它們允許選擇和重排序所有已歸檔項、支持並行恢復並且默認是壓縮的。“目
錄”格式是唯一一種支持並行轉儲的格式。
當運行 pg_dump 時,我們應該檢查輸出中有沒有任何警告(打印在標準錯誤上),特別是考
慮到下面列出的限制。

診斷

pg_dump 在內部執行 SELECT 語句。如果你運行 pg_dump 時出現問題,確定你能夠從正在使用
的數據庫中選擇信息,例如 psql 。此外,libpq前端-後端庫所使用的任何默認連接設置和環
境變量都將適用。
pg_dump 的數據庫活動會被統計收集器正常地收集。如果不想這樣,你可以通
過 PGOPTIONS 或 ALTER USER 命令設置參數 track_counts 爲假。

註解

如果你的數據庫集簇對於 template1 數據庫有任何本地添加,要注意將 pg_dump 的輸出恢復到
一個真正的空數據庫。否則你很可能由於以增加對象的重複定義而得到錯誤。要創建一個不
帶任何本地添加的空數據庫,從 template0 而不是 template1 複製它,例如:
CREATE DATABASE foo WITH TEMPLATE template0;
當一個只含數據的轉儲被選中並且使用了選項 --disable-triggers 時,pg_dump在開始插入數據
之前會發出命令禁用用戶表上的觸發器,並且接着在數據被插入之後發出命令重新啓用它
們。如果恢復中途被停止,系統目錄可能會停留在一種錯誤狀態。
pg_dump 產生的轉儲文件不包含優化器用來做出查詢計劃決定的統計信息。因此,在從一個
轉儲文件恢復後運行 ANALYZE 來確保最優性能是明智的
轉儲文件也不包含任何 ALTER DATABASE … SET 命令,這些設置會與數據庫用戶及其他安
裝設置一起被 pg_dumpall 轉儲。
因爲 pg_dump 被用來傳輸數據到更新版本的PostgreSQL,pg_dump的輸出被認爲可以載入到比
pg_dump 版本更新的 PostgreSQL 服務器中。pg_dump也能夠從比其版本更舊的 PostgreSQL 服務
器中轉儲(當前支持回退到版本 8.0)。不過,pg_dump無法從比起主版本號更新的
PostgreSQL 服務器中轉儲,它甚至將拒絕冒着創建一個非法轉儲的風險嘗試。還有,不保證
pg_dump 的輸出能被載入到一個更舊主版本的服務器 — 即使該轉儲是從該版本的服務器中被
取得也不行。將一個轉儲文件載入到一個更舊的服務器可能需要手工編輯該轉儲文件來移除
舊服務器無法理解的語法。在跨版本的情況下,推薦使用 --quote-all-identifiers 選項,因爲它
可以避免因爲不同 PostgreSQL 版本間的保留詞列表變化而發生問題。
在轉儲邏輯複製訂閱時,pg_dump將生成使用
NOCONNECT 選項的 CREATE
SUBSCRIPTION 命令, 以便恢復訂閱不會創建遠程連接複製插槽或初始表副本。這樣,可以
恢復轉儲, 而不需要網絡訪問遠程服務器。然後由用戶以合適的方式重新激活訂閱。 如果
涉及的主機已更改,則可能必須更改連接信息。 在啓動新的全表副本之前截斷目標表也許是
適當的。

實例

接下來我用我的測試庫來做一些實驗:
數據庫的表

  1. 要把一個數據庫 mydb 轉儲到一個 SQL 腳本文件:
pg_dump [connection-option...] [option...] [dbname]
$ pg_dump mydb > db.sql
[root@pg-test pgdb_backup]# pwd
/data/pgdb_backup
[root@pg-test pgdb_backup]# pg_dump -U postgres mydb > ./pgdb_bk_`date +%F`.sql
--當然,也可以壓縮來節省存儲空間:
[root@pg-test pgdb_backup]# pg_dump -U postgres mydb |gzip > ./pgdb_bk_`date +%F`.sql.gz

現在我測試把這個庫刪除用psql來恢復:

postgres=# drop database mydb;
ERROR:  database "mydb" is being accessed by other users
DETAIL:  There is 1 other session using the database.
postgres=# drop database mydb;
DROP DATABASE
--注意殺刪除數據庫的時候不能用會話連接到這個數據庫上;

用psql恢復:
[root@pg-test pgdb_backup]# psql -U postgres -d mydb < pgdb_bk_2019-11-04.sql
psql: FATAL: database “mydb” does not exist
報錯了,提示沒有數據庫mydb,也就是說導出的sql是沒有創建數據庫的sql的,我們給他創建上:

 CREATE DATABASE mydb
    WITH 
	TEMPLATE = template0
    OWNER = mydb
    ENCODING = 'UTF8'
    LC_COLLATE = 'zh_CN.utf8'
    LC_CTYPE = 'zh_CN.utf8'
    TABLESPACE = app_tbs
    CONNECTION LIMIT = -1;

在這裏插入圖片描述
連接到指定的庫,scaame後查看錶都回來了;

  1. 接下來再測試導出歸檔日誌文件格式的一種恢復:
    要轉儲一個數據庫到一個自定義格式歸檔文件:
$ pg_dump -U postgres -Fc mydb > db.dump
導入的時候:
$ pg_restore -U postgres -d mydb pgdb_bk_2019-11-04.dump   --需要重新創建mydb數據庫
$ pg_restore -U postgres -C -d postgres pgdb_bk_2019-11-04.dump  --不需要創建mydb

這是因爲:

-C
--create
在恢復一個數據庫之前先創建它。如果還指定了 --clean ,在連接到目標數據庫之前丟棄
並且重建它。
在使用這個選項時, -d 提到的數據庫只被用於發出初始的 DROP DATABASE 和 CREATE
DATABASE 命令。所有要恢復到該數據庫名中的數據都出現在歸檔中。
-d dbname
--dbname=dbname

連接到數據庫 dbname 並且直接恢復到該數據庫中。

以上兩種備份恢復的方法可以滿足基本的維護了,其餘的一些參數研究,有空再搞吧:

選項

下列命令選項控制輸出的內容和格式。
dbname
指定要被轉儲的數據庫名。如果沒有指定,將使用環境變量 PGDATABASE 。如果環境
變量也沒有設置,則使用指定給該連接的用戶名。
-a
–data-only
只轉儲數據,而不轉儲模式(數據定義)。表數據、大對象和序列值都會被轉儲。
這個選項類似於指定 --section=data ,但是由於歷史原因又不完全相同。
-b
–blobs
在轉儲中包括大對象。這是當 --schema 、 --table 或 --schema-only 被指定時的默認行爲,因
此 -b 開關僅對於將大對象添加到已請求特定模式或表的轉儲中時有用。 請注意,blob被
視爲數據,因此僅在使用-- data-only 時纔會包含, 但在-- schema-only 時不會包含。
-B
–no-blobs
排除轉儲中的大對象。
當給定 -b 和 -B 時,行爲是當數據被轉儲時輸出大對象
-c
–clean
在輸出創建數據庫對象的命令之前輸出清除(刪除)它們的命令 (除非也指定了 --if-
exists ,如果任何對象不存在於
目的數據庫中,恢復可能會產生一些傷害性的錯誤消
息)。
這個選項只對純文本格式有意義。對於歸檔格式,你可以在調用 pg_restore 時指定該選
項。
-C
–create
使得在輸出的開始是一個創建數據庫本身並且重新連接到被創建的數據庫的命令(通過
這種形式的一個腳本,在運行腳本之前你連接的是目標安裝中的哪個數據庫都沒有關
系)。如果也指定了 --clean ,腳本會在重新連接到目標數據庫之前先刪除它然後再重
建。
這個選項只對純文本格式有意義。對於歸檔格式,你可以在你調用 pg_restore 時指定這個
選項。
-E encoding
–encoding=encoding
以指定的字符集編碼創建轉儲。在默認情況下,該轉儲會以該數據庫的編碼創建(另一
種得到相同結果的方式是將 PGCLIENTENCODING 環境變量設置成想要的轉儲編碼)。
-f file
–file=file
將輸出發送到指定文件。對於基於輸出格式的文件這個參數可以被忽略,在那種情況下
將使用標準輸出。不過對於目錄輸出格式必須給定這個參數,在目錄輸出格式中指定的
是一個目錄而不是一個文件。在這種情況中,該目錄會由 pg_dump 創建並且不需要以前
就存在。

-F format
--format=format
選擇輸出的格式。 format 可以是下列之一:
p
plain
輸出一個純文本形式的 SQL 腳本文件(默認值)。
c
custom
輸出一個適合於作爲 pg_restore 輸入的自定義格式歸檔。和目錄輸出格式一起,這是
最靈活的輸出格式,它允許在恢復時手動選擇和排序已歸檔的項。這種格式在默認
情況還會被壓縮。
d
directory
**輸出一個適合作爲 pg_restore 輸入的目錄格式歸檔。這將創建一個目錄,其中每個被
轉儲的表和大對象都有一個文件,外加一個所謂的目錄文件,該文件以一種
pg_restore 能讀取的機器可讀格式描述被轉儲的對象。一個目錄格式歸檔能用標準Unix
工具操縱,例如一個未壓縮歸檔中的文件可以使用 gzip 工具壓縮。這種格式默
認情況下是被壓縮的並且也支持並行轉儲。

t
tar
輸出一個適合於輸入到 pg_restore 中的 tar- 格式歸檔。tar 格式可以兼容目錄格式,抽
取一個 tar 格式的歸檔會產生一個合法的目錄格式歸檔。不過,tar 格式不支持壓
縮。還有,在使用 tar 格式時,表數據項的相對順序不能在恢復過程中被更改。
-j njobs
–jobs=njobs
通過同時歸檔 njobs 個表來運行並行轉儲。這個選項縮減了轉儲的時間,但是它也增加了
數據庫服務器上的負載。你只能和目錄輸出格式一起使用這個選項,因爲這是唯一一種
讓多個進程能在同一時間寫其數據的輸出格式。
pg_dump 將打開 njobs + 1 個到該數據庫的連接,因此確保你的 max_connections 設置足夠高
以容納所有的連接。
在運行一次並行轉儲時請求數據庫對象上的排他鎖可能導致轉儲失敗。其原因
是,pg_dump主控進程會在工作者進程將要稍後轉儲的對象上請求共享鎖,以便確保在轉
儲運行時不會有人刪除它們並讓它們出錯。如果另一個客戶端接着請求一個表上的排他
鎖,那個鎖將不會被授予但是會被排入隊列等待主控進程的共享鎖被釋放。因此,任何
其他對該表的訪問將不會被授予或者將排在排他鎖請求之後。這包括嘗試轉儲該表的工
作者進程。如果沒有任何防範措施,這可能會是一種經典的死鎖情況。要檢測這種衝
突,pg_dump工作者進程使用 NOWAIT 選項請求另一個共享鎖。 如果該工作者進程沒有
被授予這個共享鎖,其他某人必定已經在同時請求了一個排他鎖並且沒有辦法繼續轉
儲,因此 pg_dump 除了中止轉儲之外別無選擇。
對於一個一致的備份,數據庫服務器需要支持同步的快照,在 PostgreSQL 9.2 中引入了一
種針對主服務器特性和 10 個針對備用服務器的特性。有了這種特性,即便數據庫客戶端
使用不同的連接,也可以保證他們看到相同的數據集。 pg_dump
-j 使用多個數據庫連
接,它用主控進程連接到數據一次,並且爲每一個工作者任務再一次連接數據庫。如果
沒有同步快照特徵,在每一個連接中不同的工作者任務將不能被保證看到相同的數據,
這可能導致一個不一致的備份。
如果你希望運行一個 9.2 之前服務器的並行轉儲,你需要確保數據庫內容從主控進程連
接到數據庫一直到最後一個工作者任務連接到數據庫之間不會改變。做這些最簡單的方
法是在開始備份之前停止任何訪問數據庫的數據修改進程(DDL 以及 DML)。當對一
個9.2之前的 PostgreSQL 服務器運行 pg_dump
-j 時,你還需要指定 --no-synchronized-
snapshots 參數。
-n schema
–schema=schema
只轉儲匹配 schema 的模式,這會選擇模式本身以及它所包含的所有對象。當沒有指定這
個選項時,目標數據庫中所有非系統模式都將被轉儲。多個模式可以通過書寫多個 -n 開
關來選擇。另外, schema 參數可以被解釋爲一種根據 psql’s \d 命令所用的相同規則(見模
式(Pattern))編寫的模式,這樣多個模式也可以通過在該模式中書寫通配字符來選
擇。在使用通配符時,如果需要阻止 shell 展開通配符需要小心引用該模式

在這裏插入圖片描述
-N schema
–exclude-schema=schema
不轉儲匹配 schema 模式的任何模式。該模式被根據 -n 所用的相同規則被解釋。 -N 可以被
給定多次來排除匹配幾個模式中任意一個的模式。
當 -n 和 -N 都被給定時,該行爲是隻轉儲匹配至少一個 -n 開關但是不匹配 -N 開關的模式。
如果只有 -N 而沒有 -n ,那麼匹配 -N 的模式會被從一個正常轉儲中排除。
-o
–oids
轉儲對象標識符(OID)作爲每個表數據的一部分。如果你的應用以某種方式引用 OID 列
(例如在一個外鍵約束中),應使用這個選項。否則,這個選項不應該被使用。
-O
–no-owner
不輸出設置對象擁有關係來匹配原始數據庫的命令。默認情況下,pg_dump會發
出 ALTER OWNER 或 SET SESSION AUTHORIZATION 語句來設置被創建的數據庫對象的
擁有關係。除非該腳本被一個超級用戶(或是擁有腳本中所有對象的同一個用戶)啓
動,這些語句都將會失敗。要使一個腳本能夠被任意用戶恢復,但把所有對象的擁有關
系都給這個用戶,可指定 -O 。
這個選項只對純文本格式有意義。對於歸檔格式,你可以在調用 pg_restore 時指定該選
項。
-R
–no-reconnect
這個選項已經廢棄,但是爲了向後兼容仍然能被接受。
-s
–schema-only
只轉儲對象定義(模式),而非數據。
這個選項是 --data-only 的逆選項。它和指定 --section=pre-data --section=post-data 相似,但
是由於歷史原因又不完全相同。
(不要把這個選項和 --schema 選項混淆,後者在 “schema” 的使用上有不同的含義)。
要爲數據庫中表的一個子集排除表數據,見 --exclude-table-data 。
-S username
–superuser=username
指定要在禁用觸發器時使用的超級用戶的用戶名。只有使用 --disable-triggers 時,這個選
項才相關(通常,最好省去這個選項,而作爲超級用戶來啓動結果腳本來取而代之)。
-t table
–table=table
只轉儲名字匹配 table 的表, “table” 還可以包括視圖、物化視圖、序列和外部表。通過寫
多個 -t 開關可以選擇多個表。另外, table 參數可以被解釋爲一種根據 psql’s \d 命令所用的
相同規則(見模式(Pattern))編寫的模式,這樣多個表也可以通過在該模式中書寫通
配字符來選擇。在使用通配符時,如果需要阻止 shell 展開通配符需要小心引用該模式,
當 -t 被使用時, -n 和 -N 開關不會有效果,因爲被 -t 選擇的表將被轉儲而無視那些開關,並
且非表對象將不會被轉儲。

-T table
–exclude-table=table
不轉儲匹配 table 模式的任何表。該模式被根據 -t 所用的相同規則被解釋。 -T 可以被給定
多次來排除匹配幾個模式中任意一個的模式。
當 -t 和 -T 都被給定時,該行爲是隻轉儲匹配至少一個 -t 開關但是不匹配 -T 開關的表。如果
只有 -T 而沒有 -t ,那麼匹配 -T 的表會被從一個正常轉儲中排除。
-v
–verbose
指定冗長模式。這將導致 pg_dump 向標準錯誤輸出詳細的對象註釋以及轉儲文件的開始/
停止時間,還有進度消息。
-V
–version
pg_dump 版本並退出。
-x
–no-privileges
–no-acl
防止轉儲訪問特權(授予/收回命令)。
-Z 0…9
–compress=0…9
指定要使用的壓縮級別。零意味着不壓縮。對於自定義歸檔格式,這會指定個體表數據
段的壓縮,並且默認是進行中等級別的壓縮。對於純文本輸出,設置一個非零壓縮級別
會導致整個輸出文件被壓縮,就好像它被 gzip 處理過一樣,但是默認是不壓縮。tar 歸檔
格式當前完全不支持壓縮。
–binary-upgrade
這個選項用於就地升級功能。我們不推薦也不支持把它用於其他目的。這個選項在未來
的發行中可能被改變而不做通知。
–column-inserts
–attribute-inserts
將數據轉儲爲帶有顯式列名的 INSERT 命令( INSERT
INTO table (column, …)
VALUES … )。這將使得恢復過程非常慢,這主要用於使轉儲能夠被載入到非
PostgreSQL 數據庫中。不過,由於這個選項爲每一行都產生一個單獨的命令,重載一行
時的一個錯誤只會導致那一行被丟失而不是整個表內容丟失。
–disable-dollar-quoting
這個選項禁止在函數體中使用美元符號引用,並且強制它們使用 SQL 標準字符串語法被
引用。
–disable-triggers
只有在創建一個只轉儲數據的轉儲時,這個選項才相關。它指示 pg_dump 包括在數據被
重新載入時能夠臨時禁用目標表上的觸發器的命令。如果你在表上有引用完整性檢查或
其他觸發器,並且你在數據重新載入期間不想調用它們,請使用這個選項。
當前,爲 --disable-triggers 發出的命令必須作爲超級用戶來執行。因此,你還應當使用 -
S 指定一個超級用戶名,或者寧可作爲一個超級用戶啓動結果腳本。
這個選項只對純文本格式有意義。對於歸檔格式,你可以在調用 pg_restore 時指定這個選
項。
–enable-row-security
只有在轉儲具有行安全性的表的內容時,這個選項才相關。默認情況下, pg_dump 將把
row_security 設置爲 off 來確保從該表中轉儲 出所有的數據。如果用戶不具有足夠能繞過
行安全性的特權,那麼會拋出 一個錯誤這個參數指示 pg_dump 將 row_security 設置爲 on,
允許用戶只轉儲該表中 它們能夠訪問到的部分內容。
請注意,如果您當前使用此選項,則可能還需要以 INSERT 格式轉儲, 因爲還原期間
的 COPY FROM 不支持行安全性。
–exclude-table-data=table
不轉儲匹配 table 模式的任何表中的數據。該模式根據 -t 的相同規則被解釋。 --exclude-
table-data 可以被給定多次來排除匹配多個模式的表。當你需要一個特定表的定義但不想
要其中的數據時,這個選項就有用了。
要排除數據庫中所有表的數據,見 --schema-only 。
–if-exists
時間條件性命令(即增加一個 IF EXISTS 子句)來清除數據庫和其他對象。 只有同時指
定了 --clean 時,這個選項纔可用。
–inserts
將數據轉儲爲 INSERT 命令(而不是 COPY )。這將使得恢復非常慢,這主要用於使轉儲
能夠被載入到非 PostgreSQL 數據庫中。不過,由於這個選項爲每一行都產生一個單獨的
命令,重載一行時的一個錯誤只會導致那一行被丟失而不是整個表內容丟失。注意如果
你已經重新安排了列序,該恢復可能會一起失敗。 --column-inserts 選項對於列序改變是
安全的,但是會更慢。
–lock-wait-timeout=timeout
在轉儲的開始從不等待共享表鎖的獲得。而是在指定的 timeout 內不能鎖定一個表時失
敗。超時時長可以用 SET statement_timeout 接受的任何格式指定(允許的格式根據你從其
轉出的服務器版本變化,但是所有版本都接受一個整數表示的毫秒數。)。
–no-publications
不轉儲發佈。
–no-security-labels
不轉儲安全標籤。
–no-subscriptions
不轉儲訂閱。
–no-sync
默認情況下, pg_dump 將等待所有文件安全寫入磁盤。 這個選項會導致 pg_dump 無需等
待而返回,這更快, 但意味着後續的操作系統崩潰可能會導致轉儲損壞。通常, 此選項
對於測試非常有用,但在從生產安裝中轉儲數據時不應使用此選項。
–no-synchronized-snapshots
這個選項允許對 9.2 以前的服務器運行 pg_dump -j ,詳見 -j 參數的文檔。
–no-tablespaces
不要輸出選擇表空間的命令。通過這個選項,在恢復期間所有的對象都會被創建在任何
作爲默認的表空間中。
這個選項只對純文本格式有意義。對於歸檔格式,你可以在調用 pg_restore 時指定該選
項。
–no-unlogged-table-data
不轉儲非日誌記錄表的內容。這個選項對於表定義(模式)是否被轉儲沒有影響,它只
會限制轉儲表數據。當從一個後備服務器轉儲時,在非日誌記錄表中的數據總是會被排
除。
–quote-all-identifiers
強制引用所有標識符。當從 PostgreSQL 主版本與 pg_dump 不同的服務器上轉儲一個數據
庫時或者當輸出準備載入到一個具有不同主版本的服務器時,推薦使用這個選項。默認
情況下,pg_dump只對在其主版本中是被保留詞的標識符加上引號。在轉儲其他版本服務
器時,這種默認行爲有時會導致兼容性問題,因爲那些版本可能具有些許不同的被保留
詞集合。使用 --quote-all-identifiers 能阻止這種問題,但代價是轉儲腳本更難閱讀。
–section=sectionname
只轉儲命名節。節的名稱可以是 pre-data 、 data 或 post-data 。這個選項可以被指定多次來
選擇多個節。默認是轉儲所有節。
數據節包含真正的表數據、大對象內容和序列值。數據後項包括索引、觸發器、規則和
除了已驗證檢查約束之外的約束的定義。數據前項包括所有其他數據定義項。
–serializable-deferrable
爲轉儲使用一個可序列化事務,以保證所使用的快照與後來的數據庫狀態是一致的。但
是這樣做是在事務流中等待一個點,在該點上不能存在異常,這樣就不會有轉儲失敗或
者導致其他事務帶着 serialization_failure 回滾的風險。關於事務隔離和併發控制
對於一個只爲災難恢復存在的轉儲,這個選項沒什麼益處。如果一個轉儲被用來在原始
數據庫持續被更新期間載入一份用於報表或其他只讀負載的數據庫拷貝時,這個選項就
有所幫助。如果沒有這個選項,轉儲可能會反映一個與最終提交事務的任何執行序列都
不一致的狀態。例如,如果使用了批處理技術,一個批處理在轉儲中可以顯示爲關閉,
而其中的所有項都不出現。
如果 pg_dump 被啓動時沒有讀寫事務在活動,則這個選項沒有什麼不同。如果有讀寫事
務在活動,該轉儲的啓動可能會被延遲一段不確定的時間。一旦開始運行,有沒有這個
開關的表現是相同的。
–snapshot=snapshotname
在做一個數據庫的轉儲時指定一個同步的快照(詳見 表 9.82 )。
在需要把轉儲和一個邏輯複製槽(見第 48 章) 或者一個併發會話同步時可以用上這個選
項。
在並行轉儲的情況下,將使用這個選項指定的快照名而不是取一個新快照。
–strict-names
要求每一個模式( -n/–schema )和表( -t/–table )限定符匹配要轉儲的數據庫中至少一個
模式/表。注意,如果沒有找到有這樣的模式/表限定符匹配,即便沒有 --strict-
names ,pg_dump也將生成一個錯誤。
這個選項對 -N/–exclude-schema 、 -T/–exclude-table 或者 --exclude-table-data 沒有效果。無
法匹配任何對象的排除模式不會被當作錯誤。
–use-set-session-authorization
輸出 SQL- 標準的 SET SESSION AUTHORIZATION 命令取代 ALTER OWNER 命令來確定
對象的所有關係。這讓該轉儲更加兼容標準,但是取決於該轉儲中對象的歷史,該轉儲
可能無法正常恢復。而且,一個使用 SET SESSION AUTHORIZATION 的轉儲將一定會要
求超級用戶特權來正確地恢復,而 ALTER OWNER 要求更少的特權。
-?
–help
顯示有關 pg_dump 命令行參數的幫助並退出。
下列命令行選項控制數據庫連接參數。
-d dbname
–dbname=dbname
指定要連接到的數據庫名。這等效於指定 dbname 爲命令行上的第一個非選項參數。
如果這個參數包含一個 = 符號或者以一個合法的 URI 前綴( postgresql:// 或 postgres:// )開
始,它將被視作一個 conninfo 字符串。詳見第 33.1 節。
-h host
–host=host
指定服務器正在運行的機器的主機名。如果該值開始於一個斜線,它被用作一個 Unix 域
套接字的目錄。默認是從 PGHOST 環境變量中取得(如果被設置),否則將嘗試一次
Unix 域套接字連接。
-p port
–port=port
指定服務器正在監聽連接的 TCP 端口或本地 Unix 域套接字文件擴展名。默認是放
在 PGPORT 環境變量中(如果被設置),否則使用編譯在程序中的默認值。
-U username
–username=username
要作爲哪個用戶連接。
-w
–no-password
從不發出一個口令提示。如果服務器要求口令認證並且沒有其他方式提供口令(例如一
個 .pgpass 文件),那麼連接嘗試將失敗。這個選項對於批處理任務和腳本有用,因爲在
其中沒有一個用戶來輸入口令。
-W
–password
強制 pg_dump 在連接到一個數據庫之前提示要求一個口令。
這個選項從來不是必須的,因爲如果服務器要求口令認證,pg_dump將自動提示要求一個
口令。但是,pg_dump將浪費一次連接嘗試來發現服務器想要一個口令。在某些情況下,
值得鍵入 -W 來避免額外的連接嘗試。
–role=rolename
指定一個用來創建該轉儲的角色名。這個選項導致 pg_dump 在連接到數據庫後發出一
個 SET ROLE rolename 命令。當已認證用戶(由 -U 指定)缺少 pg_dump 所需的特權但是能
夠切換到一個具有所需權利的角色時,這個選項很有用。一些安裝有針對直接作爲超級
用戶登錄的策略,使用這個選項可以讓轉儲在不違反該策略的前提下完成。

環境

PGDATABASE
PGHOST
PGOPTIONS
PGPORT
PGUSER
默認連接參數
和大部分其他 PostgreSQL 工具相似

要轉儲一個數據庫到一個目錄格式的歸檔:
$ pg_dump -Fd mydb -f dumpdir
要用 5 個並行的工作者任務轉儲一個數據庫到一個目錄格式的歸檔:
$ pg_dump -Fd mydb -j 5 -f dumpdir
要把一個歸檔文件重新載入到一個(新創建的)名爲 newdb 的數據庫:
$ pg_restore -d newdb db.dump
要轉儲一個名爲 mytab 的表:
$ pg_dump -t mytab mydb > db.sql
要轉儲 detroit 模式中名稱以 emp 開始的所有表,排除名爲 employee_log 的表:
$ pg_dump -t ‘detroit.emp*’ -T detroit.employee_log mydb > db.sql
要轉儲名稱以 east 或者 west 開始並且以 gsm 結束的所有模式,排除名稱包含詞 test 的任何模
式:
$ pg_dump -n ‘eastgsm’ -n 'westgsm’ -N ‘test’ mydb > db.sql
同樣,用正則表達式記號法來合併開關:
$ pg_dump -n ‘(east|west)gsm’ -N ‘test’ mydb > db.sql
要轉儲除了名稱以 ts_ 開頭的表之外的所有數據庫對象:
$ pg_dump -T 'ts_
’ mydb > db.sql
要在 -t 和相關開關中指定一個大寫形式或混合大小寫形式的名稱,你需要雙引用該名稱,否
則它會被摺疊到小寫形式(見模式(Pattern))。但是雙引號對於 shell 是特殊的,所以反
過來它們必須被引用。因此,要轉儲一個有混合大小寫名稱的表,你需要類似這樣的東西:
$ pg_dump -t ““MixedCaseName”” mydb > mytab.sql

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章