pg_dump是一個用於備份PostgreSQL數據庫的工具。它甚至可以在數據庫正在併發使用時進行完整一致的備份,而不會阻塞其它用戶對數據庫的訪問。該工具生成的轉儲格式可以分爲兩種,腳本和歸檔文件。其中腳本格式是包含許多SQL命令的純文本格式,這些SQL命令可以用於重建該數據庫並將之恢復到生成此腳本時的狀態,該操作需要使用psql來完成。至於歸檔格式,如果需要重建數據庫就必須和pg_restore工具一起使用。在重建過程中,可以對恢復的對象進行選擇,甚至可以在恢復之前對需要恢復的條目進行重新排序。該命令的使用方式如下:
pg_dump [option...] [dbname]
1. 命令行選項列表:
選項 | 說明 |
-a(--data-only) | 只輸出數據,不輸出模式(數據對象的定義)。這個選項只是對純文本格式有意義。對於歸檔格式,你可以在調用pg_restore時指定選項。 |
-b(--blobs) | 在dump中包含大對象。 |
-c(--clean) | 在輸出創建數據庫對象的SQL命令之前,先輸出刪除該數據庫對象的SQL命令。這個選項只是對純文本格式有意義。對於歸檔格式,你可以在調用 pg_restore時指定選項。 |
-C(--create) | 先輸出創建數據庫的命令,之後再重新連接新創建的數據庫。對於此種格式的腳本,在運行之前是和哪個數據庫進行連接就不這麼重要了。這個選項只是對純文本格式有意義。對於歸檔格式,你可以在調用pg_restore時指定選項。 |
-Eencoding | 以指定的字符集創建該dump文件。 |
-ffile | 輸出到指定文件,如果沒有該選項,則輸出到標準輸出。 |
-Fformat | p(plain): 純文本格式的SQL腳本文件(缺省)。c(custom): 輸出適合於pg_restore的自定義歸檔格式。這是最靈活的格式,它允許對裝載的數據和對象定義進行重新排列。這個格式缺省的時候是壓縮的。t(tar): 輸出適合於 pg_restore的tar歸檔文件。使用這個歸檔允許在恢復數據庫時重新排序和/或把數據庫對象排除在外。同i時也可能可以在恢復的時候限制對哪些數據進行恢復。 |
-n schema | 只轉儲schema的內容。如果沒有聲明該選項,目標數據庫中的所有非系統模式都會被轉儲。該選項也可以被多次指定,以指定不同pattern的模式。 |
-Nschema | 不轉儲匹配schema的內容,其他規則和-n一致。 |
-o(--oids) | 作爲數據的一部分,爲每個表都輸出對象標識(OID)。 |
-O(--no-owner) | 不輸出設置對象所有權的SQL命令。 |
-s(--schema-only) | 只輸出對象定義(模式),不輸出數據。 |
-Susername | 指定關閉觸發器時需要用到的超級用戶名。它只有在使用--disable-triggers的時候纔有關係。 |
-ttable | 只輸出表的數據。很可能在不同模式裏面有多個同名表,如果這樣,那麼所有匹配的表都將被轉儲。通過多次指定該參數,可以一次轉儲多張表。這裏還可以指定和psql一樣的pattern,以便匹配更多的表。(關於pattern,基本的使用方式是可以將它視爲unix的通配符,即*表示任意字符,?表示任意單個字符,.(dot)表示schema和object之間的分隔符,如a*.b*,表示以a開頭的schema和以b開頭的數據庫對象。如果沒有.(dot),將只是表示數據庫對象。這裏也可以使用基本的正則表達式,如[0-9]表示數字。) |
-Ttable | 排除指定的表,其他規則和-t選項一致。 |
-x(--no-privileges) | 不導出訪問權限信息(grant/revoke命令)。 |
-Z0..9 | 聲明在那些支持壓縮的格式中使用的壓縮級別。 (目前只有自定義格式支持壓縮) |
--column-inserts | 導出數據用insert into table_name(columns_list) values(values_list)命令表示,這樣的操作相對其它操作而言是比較慢的,但是在特殊情況下,如數據表字段的位置有可能發生變化或有新的字段插入到原有字段列表的中間等。由於columns_list被明確指定,因此在導入時不會出現數據被導入到錯誤字段的問題。 |
--inserts | 導出的數據用insert命令表示,而不是copy命令。即便使用insert要比copy慢一些,但是對於今後導入到其他非PostgreSQL的數據庫是比較有意義的。 |
--no-tablespaces | 不輸出設置表空間的命令,如果帶有這個選項,所有的對象都將恢復到執行pg_restore時的缺省表空間中。 |
--no-unlogged-table-data | 對於不計入日誌(unlogged)的數據表,不會導出它的數據,至於是否導出其Schema信息,需要依賴其他的選項而定。 |
-h(--host=host) | 指定PostgreSQL服務器的主機名。 |
-p(--port=port) | 指定服務器的偵聽端口,如不指定,則爲缺省的5432。 |
-U(--username=username) | 本次操作的登錄用戶名,如果-O選項沒有指定,此數據庫的Owner將爲該登錄用戶。 |
-w(--no-password) | 如果當前登錄用戶沒有密碼,可以指定該選項直接登錄。 |
2. 應用示例:
# -h: PostgreSQL服務器的主機爲192.168.149.137。
# -U: 登錄用戶爲postgres。
# -t: 導出表名以test開頭的數據表,如testtable。
# -a: 僅僅導出數據,不導出對象的schema信息。
# -f: 輸出文件是當前目錄下的my_dump.sql
# mydatabase是此次操作的目標數據庫。
/> pg_dump -h 192.168.149.137 -U postgres -t test*-a -f ./my_dump.sql mydatabase
#-c: 先輸出刪除數據庫對象的SQL命令,在輸出創建數據庫對象的SQL命令,這對於部署乾淨的初始系統或是搭建測試環境都非常方便。
/> pg_dump -h 192.168.220.136 -U postgres -c -f./my_dump.sql mydatabase
#導出mydatabase數據庫的信息。在通過psql命令導入時可以重新指定數據庫,如:/> psql -dnewdb -f my_dump.sql
/> pg_dump -h 192.168.220.136 -U postgres -f./my_dump.sql mydatabase
#導出模式爲my_schema和以test開頭的數據庫對象名,但是不包括my_schema.employee_log對象。
/> pg_dump -t 'my_schema.test*' -Tmy_schema.employee_log mydatabase > my_dump.sql
#導出east和west模式下的所有數據庫對象。下面兩個命令是等同的,只是後者使用了正則。
/> pg_dump -n 'east' -n 'west' mydatabase -fmy_dump.sql
/> pg_dump -n '(east|west)' mydatabase -fmy_dump.sql