14.4. 如果您是在升級

新版本的PostgreSQL的內部資料儲存格式可能會發生改變。因此, 如果您正在升級一個版本不像"8.0.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 8.0.0 的 pg_dumpall,因為這個版本包含對老版本的錯誤修補以及改進。 雖然這個建議看起來好像很愚蠢,因為您還沒有安裝新版本,但如果您準備安裝新版本, 我們還是建議您遵循這個建議。這個時候您可以按照平常那樣完成安裝, 然後再轉換資料。這樣將降低停業時間。

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

    pg_ctl stop

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

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

    是可以用的。

    非常老的版本上可能沒有 pg_ctl。如果您找不到它或者它不能運轉, 那麼可以找出老伺服器的進程 ID,比如,用下面命令

    ps ax | grep postmaster

    然後給它發信號讓他停止:

    kill -INT processID

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

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

當您裝完 PostgreSQL 8.0.0,建立一個新的資料庫目錄, 然後啟動新伺服器。要記住您必須用特殊的資料庫用戶登錄後才能執行這些命令(如果您是升級的話這個帳戶應該已經存在了)。

/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.4,, 不管怎樣,我們都建議您好好讀一下。