將 PostgreSQL 9.1 數據庫遷移到 Ubuntu 14.04
我想將數據庫從安裝在舊 Debian 系統上的 PostgreSQL 9.1 遷移到 Ubuntu 14.04。數據庫正在使用觸發器,並且要求也遷移觸發器,但是在遷移到新數據庫時沒有在每一行上執行觸發器,導致新數據庫包含原始數據的亂碼版本.
Ubuntu 14.04 儲存庫中的 PostgreSQL 版本是 9.3。
有什麼方法可以將
/var/lib/postgresql/9.1
舊系統上的數據轉換為可在 PostgreSQL 9.3 上使用?到目前為止我嘗試過的
我找到了關於如何從 9.1 遷移到 9.3的舊答案。但我沒有太多運氣使用它。
據我了解,使用
pg_dump
will 需要在轉儲數據時執行舊數據庫,這可能導致轉儲期間寫入的更新從新數據庫中失去。使用
pg_upgrade
需要同時安裝兩個 PostgreSQL 版本。但是 Ubuntu 14.04 儲存庫中沒有 9.1。我考慮將舊系統複製到新機器上的 chroot 中,但我不知道這是否能很好地與如何pg_upgrade
創建硬連結一起使用。到目前為止,還有另一個障礙阻止我進行測試
pg_upgrade
。當我嘗試執行pg_upgrade
時,我被告知該命令位於postgres-xc
未安裝的包中。如果我嘗試安裝
postgres-xc
它會告訴我這postgres-xc
取決於postgres-xc-client
.如果我嘗試安裝
postgres-xc-client
,我會被告知這樣做會解除安裝 posgres-9.3。所以看起來它甚至不可能同時安裝pg_upgrade
和 PostgreSQL 9.3。
command-not-found
包中告訴我需要安裝的消息postgres-xc
被證明具有誤導性。實際上pg_upgrade
是預設安裝的一部分,但它不在預設安裝中,PATH
而是位於/usr/lib/postgresql/9.3/bin/pg_upgrade
.因為
pg_upgrade
沒有在PATH
搜尋可用包中執行並且postgres-xc
包恰好有一個/usr/bin/pg_upgrade
執行檔。然而,那不是pg_upgrade
我想要的。唉
pg_upgrade
,除非我能夠啟動一個 PostgreSQL 實例來提供/var/lib/postgresql/9.1
我無法使用 Ubuntu 14.04 儲存庫中可用的包的文件,否則將無法工作。所以我得出結論,我的問題的答案很可能是:不,使用 Ubuntu 14.04 儲存庫中的軟體無法轉換 /var/lib/postgresql/9.1 中的文件。
我最終所做的是
pg_dump
在數據庫起源的 Debian 系統上使用。我對在執行時進行更改的擔憂pg_dump
已通過設置default_transaction_read_only
./etc/postgresql/9.1/main/postgresql.conf
為了確保在我啟動後不會送出目前正在執行的事務,我在啟用和啟動pg_dump
之間重新啟動了 PostgreSQL 。default_transaction_read_only``pg_dump
這種方法還有一個額外的好處,即在遷移過程中至少讓系統保持在只讀模式下執行,從而最大限度地減少使用者可見的停機時間。
在我開始這個操作之前,我使用
pg_dump
正在執行的數據庫上執行的命令的輸出驗證了這個過程。特別是,我驗證了:
- 數據庫觸發器已正確遷移。
- 數據中的異常 unicode 字元已正確遷移。
我決定使用
pg_dump
要導入的文本輸出psql
而不是二進制輸出格式,因為這使我可以輕鬆地對在兩個數據庫之間遷移的文件執行一些手動完整性檢查。