POSTGRESS Database Backup、恢複

來源:互聯網
上載者:User

pg_dump
Name
pg_dump --  將一個PostgreSQL資料庫抽出到一個指令檔 或者其它歸檔檔案中
Synopsis
pg_dump [options...] [dbname]

描述
pg_dump 是一個將 PostgreSQL 資料庫儲存到一個指令碼或者歸檔檔案中的工具. 這個指令檔的格式是純文字,它包含許多 SQL 命令, 這些 SQL 命令可以用於重建該資料庫並將之恢複到儲存成指令碼的時候的狀態. 要恢複這些指令碼,使用 psql。 它們甚至可以用於在其它機器甚至是其它硬體體系的機器上 重建該資料庫,通過對指令碼進行一些修改,甚至可以在其它 SQL 資料庫產品 上重建該資料庫.

另外,還有候選的歸檔檔案格式可以和 pg_restore 一起使用重建資料庫, 並且它們也允許 pg_restore 對恢複什麼東西進行選擇, 或者甚至是在恢複之前對需要恢複的條目進行重新排序. 歸檔檔案也是設計成可以跨平台移植的.

pg_dump 將儲存用於重建所有使用者定義的類型,函數,表, 索引聚集和操作符所必須的資訊.另外, 所有資料是用文字格式設定拷貝出來的,因而也可以很容易地拷貝回去, 也很容易用工具編輯.

如果一種候選檔案格式和 pg_restore 結合,那麼pg_dump就能提供一種靈活的歸檔和傳輸機制. pg_dump 可以用於備份整個資料庫, 然後就可以使用 pg_restore 檢查 這個歸檔和/或選擇要恢複的資料庫部分. 最靈活等輸出檔案格式是"custom(客戶化)"格式 (-Fc).它允許對歸檔元素進行選取和重新排列, 並且預設時是壓縮的.tar 格式 (-Ft) 不是壓縮的並且我們在裝載等時候不可能重排列, 不過它也很靈活;還有,它可以用其它工具,比如 tar 處理.

在運行 pg_dump 的時候,我們應該檢查 輸出,看看是否有任何警告存在(在標準錯誤上列印), 特別是下面列出的限制.

即使資料庫在並行使用著的時候,pg_dump 也製作出連貫的備份.pg_dump 並不阻塞其它 使用者對資料庫的訪問(讀或寫).

選項
下面的命令列參數用於控制輸出格式。

dbname
聲明將要轉儲的資料庫名. 如果沒有聲明這個參數,那麼使用環境變數 PGDATABASE。 如果那個環境變數也沒聲明,那麼用發起串連的使用者名稱。

-a
--data-only
只輸出資料,不輸出結構(表定義).

這個選項只是對純文字格式有意義.對於其它格式,你可以在調用 pg_restore 的時候聲明選項.

-b
--blobs
轉儲資料和 BLOB 資料.

-c
--clean
輸出在建立資料庫建立命令之前先清理(刪除) 該資料庫物件的命令.

這個選項只是對純文字格式有意義.對於其它格式,你可以在調用 pg_restore 的時候聲明選項.

-C
--create
以一條建立該資料庫本身並且與這個資料庫聯結等命令開頭進行輸出. (如果是這種形式的指令碼,那麼你在運行指令碼之前和哪個資料庫聯結就 不重要了.)

這個選項只對純文字格式有意義.對於其它格式,你可以在調用 pg_restore 的時候聲明該選項.

-d
--inserts
將資料輸出為的INSERT命令 (而不是 COPY). 這樣會導致恢複非常緩慢.但卻令歸檔更容易移植到其它 SQL 資料庫.

-D
--column-inserts
--attribute-inserts
把資料轉儲為帶有明確欄位名的 INSERT 命令. 這樣會導致恢複非常緩慢, 但是如果你想重新排欄欄位的順序,那麼它是必須的.

-f file
--file=file
把輸出發往指定的檔案.如果忽略這些,則使用標準輸出.

-F format
--format=format
選擇輸出的格式. format可以是下列之一:

p
輸出純文字SQL指令檔(預設)

t
輸出適合輸入到 pg_restore 裡的tar歸檔檔案. 使用這個歸檔允許在恢複資料庫時重新排序和/或把表結構排除在外. 同時也可能可以在恢複的時候限制對哪些資料進行恢複.

c
輸出適於給 pg_restore 用的客戶化歸檔. 這是最靈活的格式,它允許對裝載的資料和綱要元素進行重新排列. 這個格式預設的時候是壓縮的.

-i
--ignore-version
忽略在 pg_dump 和資料庫伺服器之間的版本差別.

pg_dump 可以處理來自以前版本的PostgreSQL 的資料庫,但是太老的版本則不被支援了(目前是支援到 7.0)。 如果你需要跨越版本檢查時才使用這個選項( 而且如 pg_dump 失效,別說我沒警告你).

-o
--oids
為每個表都輸出對象標識(OID). 如果你的應用在某種程度上引用了OID欄位的話,(比如,在外鍵約束中 用到). 那麼使用這個選項. 否則,不應該使用這個選項.

-O
--no-owner
不把對象的所有權設定為對應來源資料庫. 通常, pg_dump 發出 (psql特有的) \connect 語句以設定綱要元素的所有權. 又見 -R 和 -X use-set-session-authorization 選項. 請注意 -O 並不防止所有對資料庫的重新聯結, 只是防止那些為調整許可權進行的排它聯結.

這個選項只是對純文字格式有意義.對於其它格式,在你調用 pg_restore 的時候你可以聲明該選項.

-R
--no-reconnect
禁止 pg_dump 發出任何 \connect 語句.

在純文字輸出模式下,禁止 pg_dump 輸出那種需要在恢複資料庫的過程中重新聯結資料庫的指令碼. 一般的恢複指令碼通常需要以不同的使用者與伺服器聯結多次以設定 該對象最初的所有權.這個選項是一個相當粗糙的指令,因為 它令 pg_dump 失去了這個許可權資訊, 除非你使用 -X use-set-session-authorization 選項.

我們不想在恢複的過程中重新聯結的一個可能原因是也許對 資料庫的訪問需要手工幹涉(也就是說,口令).

這個選項只是對純文字格式有意義.對於其它格式, 你在調用 pg_restore 的時候可以聲明選項.

-s
--schema-only
只輸出表綱要(定義),不輸出資料.

-S username
--superuser=username
在某些場合,pg_dump 建立的指令碼或者歸檔需要有 超級使用者訪問的許可權,比如在關閉觸發器或者為大綱元素甚至所有屬性時. 這個選項聲明在這些場合時使用的使用者名稱.

-t table
--table=table
只輸出表 table的資料.

-v
--verbose
聲明冗餘模式。 這樣將令 pg_dump 在標準錯誤上列印 進度資訊。

-x
--no-privileges
--no-acl
避免輸出 ACL(賦予/撤消 命令)和表的所有者關係資訊.

-X use-set-session-authorization
--use-set-session-authorization
通常,如果一個 pg_dump 產生的(純文字模式)指令碼 必須更改當前的資料庫使用者(比如,設定正確的對象所有權)的時候, 它使用 psql \connect 命令. 這條命令實際上開啟一個新的聯結,這個時候可能需要收工幹涉 (比如,輸入口令).如果你使用 -X use-set-session-authorization,那麼 pg_dump 則會輸出 SET SESSION AUTHORIZATION 命令.這麼做效果相同, 但是它要求使用產生的指令碼做資料庫恢複的使用者是資料庫超級使用者. 這個選項有效地覆蓋了 -R 選項.

因為 SET SESSION AUTHORIZATION 是一個 標準的 SQL 命令,而 \connect 只能用於 psql,因此這個選項同時還在理論上增加 了輸出指令碼的可移植性.

這個選項只對純文字格式有意義.對於其它格式,你可以在你調用 pg_restore 的時候聲明該選項.

-Z 0..9
--compress=0..9
聲明在那些支援壓縮的格式中使用的壓縮層級. (目前只有客戶化格式支援壓縮).

下面的命令列參數控制資料庫為聯結參數。

-h host
--host=host
聲明運行伺服器 的機器的主機名稱.預設是使用本地Unix主控通訊端,而不是一個 IP 聯結. 如果主機名稱以斜扛開頭,則它被用做到 Unix 域通訊端的路徑.

-p port
--port=port
聲明伺服器 正在偵聽並等待聯結的TCP/IP 連接埠或本地 Unix 主控通訊端檔案控制代碼. 預設的連接埠號碼是5432,或者環境變數 PGPORT 的值(如果存在).

-U username
以給出使用者身分聯結.

-W
強制口令提示.如果伺服器需要口令認證,那麼這個動作應該自動發生.

只有在一些平台上才有長選項形式。

環境

PGDATABASE
PGHOST
PGPORT
PGUSER
預設串連參數

診斷
Connection to database 'template1' failed.
connectDBStart() -- connect() failed: No such file or directory
       Is the postmaster running locally
       and accepting connections on Unix socket '/tmp/.s.PGSQL.5432'?
pg_dump 無法與指定主機和連接埠上的 PostgreSQL 伺服器 相聯.如果看到這條資訊,確認 伺服器 正在給定的主機上你所聲明的連接埠上運行.
dumpSequence(table): SELECT failed
你沒有讀取資料庫的許可權. 和你的 PostgreSQL 節點管理員聯絡.
注意: pg_dump 在內部使用 SELECT 語句.如果你運行 pg_dump 時碰到問題,確認你能夠使用象 psql 這樣的程式從資料 庫選擇.

注意
如果你的安裝給 template1 資料庫增加了任何你自己的東西, 那麼請注意把 pg_dump 的輸出恢複到一個 真正空的資料庫中;否則你可能會收到因為重複定義所追加的對象 而造成的錯誤資訊.要製作一個沒有任何本地附屬物的資料庫, 可以從 template0 而不是 template1 拷貝,比如∶

CREATE DATABASE foo WITH TEMPLATE template0;

pg_dump 有幾個限制∶

在轉儲一個表或者作為純文字轉儲時,pg_dump 無法操作 大對象.大對象必須整體地使用二進位歸檔格式中的一種進行轉儲.

在進行純資料轉儲時,pg_dump 發出一些查詢先關閉在使用者 表上面的觸發器,然後插入資料,資料插入完成後再發出查詢開啟觸發器. 如果恢複動作在中間停止,那麼系統資料表可能就會處於一種錯誤狀態.

tar 歸檔的成員的大小限制於 8 GB。(這個限制是 tar 檔案格式 的固有限制。)因此這個格式無法用於那些一個表的大小超過這個 尺寸的原文表現。tar 歸檔和任何其它輸出格式的總大小是不受 限制的,只是可能會又作業系統的限制。

例子
轉儲一個資料庫∶

$ pg_dump mydb > db.out

重載這個資料庫∶

$ psql -d database -f db.out

輸出一個叫 mydb 的包含BLOB 的資料庫到一個 tar 檔案:

$ pg_dump -Ft -b mydb > db.tar

把這個資料庫(連同BLOB) 一起恢複到一個現有的叫 newdb 的資料庫:

$ pg_restore -d newdb db.tar

曆史
pg_dump 工具最早出現在 Postgres95 版本0.02. 非純文字輸出格式在 PostgreSQL 版本 7.1 時引入.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.