14.4. 如果你是在升級

新版本的PostgreSQL的內部數據存儲格式可能會發生改變.因此, 如果你正在升級一個版本號不象"7.4.x"這樣的系統, 你就必須按照這裡說的方法備份和恢復你的數據. 這些指導假設你現有的安裝在 /usr/local/pgsql 目錄裡面, 並且數據區在 /usr/local/pgsql/data. 根據你的情況修改這些路徑.

  1. 確保你在備過程中和備份後沒有更新. 雖然即使有數據更新也不會影響備份的完整性,但是很明顯更新的數據會被排除在備份之外, 而它是應該包括進來的.如果有必要, 可以編輯文件/usr/local/pgsql/data/pg_hba.conf (或等效的)文件中的權限以禁止除你之外的所有人的訪問.

  2. 要備份出你的數據庫安裝,敲入:

    pg_dumpall > outputfile

    如果你需要保留 OID(比如說當你用到它們做外鍵時),那麼在運行pg_dumpall時帶 -o 選項.

    pg_dumpall 並不保存大對象. 如果你要保存大對象,請檢查 Section 22.1.4

    要做一個備份,你可以使用你當前正在運行的版本的 pg_dumpall 命令。不過,要獲取最好的結果,最好使用來自 PostgreSQL 7.4 的 pg_dumpall,因為這個版本包含對老版本的錯誤修補以及改進。 雖然這個建議看起來好像很愚蠢,因為你還沒有安裝新版本,但如果你準備安裝新版本, 我們還是建議你遵循這個建議。這個時候你可以按照平常那樣完成安裝, 然後再轉換數據。這樣將降低停業時間。

  3. 如果你準備把新版本的數據庫裝在與舊數據庫相同的位置,那麼關閉舊的數據庫服務器,(至少在安裝新文件之前如此):

    kill -INT `cat /usr/local/pgsql/data/postmaster.pid`

    在 7.0 以前的版本沒有這個 postmaster.pid 文件. 如果你用的是這樣的版本,那你就得自己把數據庫服務器的進程號找出來,比如通過這樣的命令 ps ax | grep postmaster,然後把進程號交給 kill命令.

    在那些在引導的時候就啟動 PostgreSQL 的系統上,可能已經有一個啟動文件可以幹這件事. 例如,在一台Red Hat Linux 系統上我們可以找到

    /etc/rc.d/init.d/postgresql stop

    是可以用的.另外一個可能是 pg_ctl stop

  4. 如果你準備裝在老版本的地盤,那麼把它們挪走也是一條好計策, 以便你碰到麻煩後還能退回去.用這樣的命令:

    mv /usr/local/pgsql /usr/local/pgsql.old

當你裝完 PostgreSQL 7.4,創建一個新的數據庫目錄, 然後啟動新服務器.要記住你必須用特殊的數據庫用戶登錄後才能執行這些命令(如果你是升級的話這個帳戶應該已經存在了).

/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
/usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data

最後,使用新的 psql, 用下面命令恢復你的數據:

/usr/local/pgsql/bin/psql -d template1 -f outputfile

下面這些文章比較詳細地討論了這個問題: Section 22.3,, 不管你是否一定需要這樣做,我們都建議你好好讀一下.