PG_RESTORE(1)

NAME
pg_restore - 從一個由 pg_dump 創建的備份檔案中恢復 PostgreSQL 數據庫。

SYNOPSIS

pg_restore [ option... ] [ filename ]

DESCRIPTION 描述

pg_restore 是一種用於恢復由 pg_dump(1) 創建的任何非純文本輸出格式中的 PostgreSQL 數據庫的應用。 它將發出必要的命令來重新構造數據庫，以便於把它恢復成保存它的時候的樣子。 歸檔（備份）檔案還允許pg_restore 有選擇地進行恢復， 甚至在恢復前重新排列條目的順序。歸檔的檔案設計成可以在不同的硬體體系之間移植。

pg_restore 可以以兩種模式操作：如果聲明了數據庫名字， 那麼歸檔是直接恢復到數據庫裏。大對象只能用直接數據庫聯接進行恢復。 否則，先創建一個包含重建數據庫所必須的 SQL 命令的稿本（並且寫入到一個檔案或者標準輸出）， 類似 pg_dump 輸出純文字格式的時候創建的那種稿本。 因此，一些控制稿本輸出的選項就是摹擬 pg_dump 的操作。

顯然，pg_restore 無法恢復那些不存在歸檔檔案中的信息； 比如，如果歸檔是用"把數據轉儲為 INSERT命令"選項製作的， 那麼 pg_restore 將不能使用 COPY 語句裝載數據。

OPTIONS 選項

pg_restore 接受下列命令行參數。

filename
     聲明要恢復的備份檔案的位置。如果沒有聲明，則使用標準輸入。

-a

--data-only
     只恢復數據，而不恢復表模式（數據定義）。

-c

--clean
     創建數據庫對象前先清理（刪除）它們。

-C

--create
     在恢復數據庫之前先創建它。（如果出現了這個選項，和 -d 在一起的數據庫名只是用於發出最初的 CREATE DATABASE 命令。 所有數據都恢復到名字出現在歸檔中的數據庫中去。）

-d dbname

--dbname=dbname
     與數據庫 dbname 聯接並且直接恢復到該數據庫中。

-f filename

--file=filename
     聲明生成的稿本的輸出檔案，或者出現 -l 選項時用於列表的檔案，預設是標準輸出。

-F format

--format=format
     聲明備份檔案的格式。因為pg_restore 會自動判斷格式，所以如果聲明了，它可以是下面之一：

    t
         備份是一個 tar 歸檔。 使用這個格式允許在恢復數據庫的時候重新排序和/或把表模式元素排除出去。 同時還可能在恢復的時候限制裝載的數據。

    c
         備份的格式是來自 pg_dump 的客戶化格式。 這是最靈活的格式，因為它允許重新對數據排序，也允許重載表模式元素。 預設時這個格式是壓縮的。

-i

--ignore-version
     忽略數據庫版本檢查。

-I index

--index=index
     只恢復命名的索引。

-l

--list
     列出備份的內容。這個操作的輸出可以用 -L 選項限制和重排所恢復的項目。

-L list-file

--use-list=list-file
     只恢復在 list-file 裏面的元素，以它們在檔案中出現的順序。 你可以移動各個行並且也可以通過在行開頭放 ';' 的方式注釋。（見下文獲取例子。）

-N

--orig-order
     以最初在 pg_dump 裏生成的轉儲順序恢復項目。 這個選項沒有什麼實際的用途，因為 pg_dump 會以自己方便的順序生成項， 這個順序不可能是恢復這些數據的安全順序。 （這個順序不是項最後在歸檔的內容列表中列出的順序。） 又見 -r。

-o

--oid-order
     以 OID 順序恢復項目。這個選項用處很小， 因為 OID 只是最初創建順序的一個近似指示。 如果還聲明了 -N，那麼這個選項還覆蓋它。又見 -r。

-O

--no-owner
     不要輸出設置對象的權限，以便與最初的數據庫匹配的命令。 預設時，pg_restore 發出 SET SESSION AUTHORIZATION 語句設置創建出來的模式元素的所有者權限。 如果最初的數據庫連接不是由超級使用者（或者是擁有所有創建出來的對象的同一個使用者）發起的，那麼這些語句將失敗。 使用 -O，那麼任何使用者都可以用於初始的連接，並且這個使用者將擁有所有創建出來的對象。

-P function-name(argtype [, ...])

--function=function-name(argtype [, ...])
     只恢復指定的命名函數。請注意仔細拼寫函數名及其參數，應該和轉儲的內容列表中的完全一樣。

-r

--rearrange
     以對象類型重排項目（這個發生在以 -N 或者 -o 排序之後）。 重排是為了給出最大可能的性能。 如果沒有 -N, -o, 和-r，那麼 pg_restore 以項目出現在歸檔 的內容列表中的順序恢復他們， 或者按照他們在 list-file 裏面的順序恢復他們 — 假如給出了 -L 的話。 -o 和 -r 的組合複製了 pg_dump 在創建歸檔的內容列表 之前進行的排序， 因此，這個選項通常沒必要聲明。

-R

--no-reconnect
     這個選項已經廢棄了，但是為了保持向下相容仍然接受。

-s

--schema-only
     只恢復表結構（數據定義）。不恢復數據，序列值將重置。

-S username

--superuser=username
     設置關閉觸發器時聲明超級使用者的使用者名。 只有在設置了 --disable-triggers 的時候才有用。

-t table

--table=table
     只恢復表指定的表的定義和/或數據。

-T trigger

--trigger=trigger
     只恢復指定的觸發器。

-v

--verbose
     聲明冗餘模式。

-x

--no-privileges

--no-acl
     避免 ACL 的恢復（grant/revoke 命令）。

-X use-set-session-authorization

--use-set-session-authorization
     這個選項已經廢棄了，但是出於向下相容，仍然接受。 pg_restore 現在總是表現得像以前選中這個選項一樣。

-X disable-triggers

--disable-triggers
     這個選項只有在執行僅恢復數據的時候才相關。它告訴 pg_restore 在裝載數據的時候執行一些命令臨時關閉在目標表上的觸發器。 如果你在表上有完整性檢查或者其它觸發器， 而你又不希望在裝載數據的時候激活它們，那麼可以使用這個選項。
     目前，為 --disable-triggers 發出的命令必須以超級使用者發出。 因此，你應該也要用 -S 聲明一個超級使用者名，或者更好是設置 --use-set-session-authorization 並且以 PostgreSQL 超級使用者身份運行 pg_restore。

pg_restore 還接受下面的命令行參數做為聯接參數：

-h host

--host=host
     聲明伺服器運行的機器的主機名。 如果數值以斜扛開頭，那麼它被用做 Unix 域套接字的目錄。 預設是從 PGHOST 環境變量中獲取的（如果設置了）， 否則將嘗試進行 Unix 域套接字。

-p port

--port=port
     聲明伺服器偵聽的 TCP 端口或者本地的 Unix 域套接字檔案擴展。 預設是環境變量 PGPORT 的值（如果設置了的話）， 否則就說編譯的預設。

-U username
     以給出使用者身分聯接。

-W
     強制給出口令提示。如果伺服器要求口令認証，那麼這個應該自動發生。

ENVIRONMENT 環境

PGHOST

PGPORT

PGUSER
     預設連接參數。

DIAGNOSTICS 診斷

 當使用-d選項聲明了直接數據庫聯接時， pg_restore 在內部執行 SQL 語句。如果你運行 pg_restore 出了毛病， 請確保你能用類似 psql(1) 這樣的東西從數據庫中選取信息。

NOTES 注意

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

CREATE DATABASE foo WITH TEMPLATE template0;

pg_restore 的局限在下面列出。

•
     當向一個已經存在的表恢復數據，並且還使用了 --disable-triggers 選項時， pg_restore 在插入數據前放出一些查詢關閉使用者表上的觸發器， 在數據插入完成後重新打開它們。如果恢復的中途停止，那麼系統表可能處於錯誤狀態。

•   pg_restore 將不會為單一的表恢復大對象。 如果一個歸檔包含大對象，那麼所有大對象都將被恢復。

 又見參閱 pg_dump(1) 的文擋獲取有關 pg_dump 的局限的細節。

 一旦完成恢復，最好在每個恢復的對象上運行 ANALYZE， 以便給優化器有用的統計。

EXAMPLES 例子

 把一個包含大對象的叫 mydb 的數據庫轉儲到一個tar檔案：

$ pg_dump -Ft -b mydb > db.tar

 把這個數據庫恢復到現有的叫 newdb 的數據庫中（連同BLOB）：

$ pg_restore -d newdb db.tar

 要對項目重新排序，首先必須轉儲歸檔的目錄：

$ pg_restore -l archive.file > archive.list

 這個檔案由一行頭和每個項目一行組成，比如。

;
; Archive created at Fri Jul 28 22:28:36 2000
;     dbname: birds
;     TOC Entries: 74
;     Compression: 0
;     Dump Version: 1.4-0
;     Format: CUSTOM
;
;
; Selected TOC Entries:
;
2; 145344 TABLE species postgres
3; 145344 ACL species
4; 145359 TABLE nt_header postgres
5; 145359 ACL nt_header
6; 145402 TABLE species_records postgres
7; 145402 ACL species_records
8; 145416 TABLE ss_old postgres
9; 145416 ACL ss_old
10; 145433 TABLE map_resolutions postgres
11; 145433 ACL map_resolutions
12; 145443 TABLE hs_old postgres
13; 145443 ACL hs_old

 這裏分號是注釋分隔符，而行開頭的數字代表賦給每個項目的內部歸檔 ID。

 檔案內的行可以注釋掉，刪除和/或重新排列。比如，

10; 145433 TABLE map_resolutions postgres
;2; 145344 TABLE species postgres
;4; 145359 TABLE nt_header postgres
6; 145402 TABLE species_records postgres
;8; 145416 TABLE ss_old postgres

 可以用做 pg_restore 的輸入並且只會恢復項目 10 和 6，（以這個順序）：

$ pg_restore -L archive.list archive.file

HISTORY 歷史

pg_restore 工具第一次出現在 PostgreSQL 7.1。

SEE ALSO 參見
pg_dump(1), pg_dumpall(1), psql(1)

譯者
Postgresql 中文網站 何偉平 <laser@pgsqldb.org>