PostgreSQL11.2數據恢復記錄(From Physical Files)


PostgreSQL11.2數據恢復記錄(From Physical Files)

記錄一下PostgreSQL11.2的數據恢復,場景是這樣的,我們在A主機(windows server 2008)上安裝一個PostgreSQL11.2,突然有一天A主機壞掉了,只能將磁盤卸載下來掛載到新的主機上,但是如何才能快速有效的將之前磁盤中的數據恢復呢?

重新注冊為windows服務(失敗)

這里我使用主機B(windows server 2012 R2)進行重新注冊

參考重新注冊PostgreSQL服務

  1. 找到並PostgreSQL的安裝路徑,在此啟動命令行工具
  2. 使用pg_ctl命令將PostgreSQL11.2重新注冊為服務,該命令的具體用法和寫法可以查看pg_ctl幫助文檔(pg_ctl --help)

結果很現實,沒有能夠成功,具體的原因未知,返回提示消息為:無法注冊服務,錯誤碼1783

此路不通,那我只能換一種方式。

替換PostgreSQL的數據目錄(成功)

PostgreSQL的數據是存儲到data目錄下,具體的目錄是服務安裝的時候指定的,默認是在服務的安裝目錄下。只要你還擁有完整的data目錄,那么你是完全可以從這一份原始物理文件進行數據恢復的。

在這里我使用主機C(windows10)作為測試機
  1. 先在C主機上安裝PostgreSQL11.2
  2. 將原始data目錄拷貝到C主機PostgreSQL數據存在目錄(即data)的同級目錄,並重命名為data-bak(命名隨意,符合規則且不沖突就行)
  3. 然后參照Change the default PGDATA directory on Windows完成剩余替換步驟
    • 停止C主機的PostgreSQl11.2服務
    • 修改注冊表,用意為重新指定服務使用的data目錄,替換為我拷貝的data-bak目錄,注冊表路徑:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\pgsql-some version,修改ImagePath項的value值中 -D 參數
    • 到windows服務管理中查看PostgreSQL服務屬性,檢驗可執行文件路徑中是否已經指向了data-bak路徑
    • 重啟PostgreSQL服務

這里有坑,請注意!
如果出現服務啟動后停止,請進行以下檢查:

1、檢查 data-bak 目錄權限,確保該目錄和同級的 data 目錄的權限一致

2、檢查 是否存在 postmaster.pid 文件,如果存在將其刪除(這個未測試,聽說可以哦)

3、檢查 postgresql.conf 文件,保持端口號、語言環境(lc_messages、lc_monetary、lc_numeric、lc_time)等基礎配置和當前的服務一致,避免配置異常導致啟動失敗

4、檢查 pg_hba.conf 文件

我按照步驟完成了以上操作,但是發現還是無法在服務管理中啟動服務,我通過事件查看器查看日志,也只是看到超時導致啟動失敗,遂又google+baidu一把,獲取鏈接一個postgresql 在等待服務器啟動時超時

在這里提到需要執行一個命令:pg_resetwal -f E:\Server\PostgreSQL\11\data-bak
執行成功會得到打印信息:Write-ahead log reset

然后可以直接在命令行驗證是否可以正常啟動:pg_ctl -D E:\Server\PostgreSQL\11\data-bak

登錄密碼應該是舊的密碼,我這里是直接使用剛安裝PostgreSQL產生的postgresql.conf 替換了data-bak中的postgresql.conf ,所以我的登錄密碼是新設置的,你實在不知道你就改嘛

我到這里已經能夠成功啟動了,但是還有坑,還是因為語言環境導致的,如果你的語言環境都一致,那么應該沒啥問題了,問題解決方案看后記,最下面

以下部分為pg_resetwal命令的網絡解釋pg_resetwal

pg_resetwal — 重置一個PostgreSQL數據庫集簇的預寫式日志以及其他控制信息

pg_resetwal [-f] [-n] [option...] {[-D] datadir}


pg_resetwal會清除預寫式日志(WAL)並且有選擇地重置存儲在 pg_control文件中的一些其他控制信息。如果這些文件已經被損壞, 某些時候就需要這個功能。當服務器由於這樣的損壞而無法啟動時, 這只應該被用作最后的手段。在運行這個命令之后,就應該可以啟動服務器, 但是記住數據庫可能包含由於部分提交事務產生的不一致數據。 你應當立刻轉儲你的數據、運行initdb並且重新載入。重新載入后, 檢查不一致並且根據需要修復之。這個工具只能被安裝服務器的用戶運行,因為它要求對數據目錄的讀寫訪問。 出於安全原因,你必須在命令行中指定數據目錄。pg_resetwal 不使用環境變量PGDATA。如果pg_resetwal抱怨它無法為pg_control 決定合法數據,你可以通過指定-f(強制)選項強制它繼續。 在這種情況下,丟失的數據將被替換為看似合理的值。可以期望大部分域是匹配的, 但是下一個 OID、下一個事務 ID 和紀元、下一個多事務 ID 和偏移以及 WAL 開始地址域可能還是需要人工協助。這些域可以使用下面討論的選項設置。 如果你不能為所有這些域決定正確的值,-f還是可以被使用, 但是恢復的數據庫還是值得懷疑:一次立即的轉儲和重新載入是勢在必行的。 在你轉儲之前不要在該數據庫中執行任何數據修改操作, 因為任何這樣的動作都可能使破壞更嚴重。

后記

通過替換data目錄的方式,我已經成功啟動了PostgreSQL服務,但是我在登錄的時候出現了錯誤,提示信息如下:
數據庫集群是以 LC_COLLATE "Chinese (Simplified)_People's Republic of China.936"來初始化的,這個排序規則無法由setlocale()識別

沒錯,我之前確實是將postgresql.conf配置文件中的語言環境從Chinese (Simplified)_People's Republic of China.936修改為Chinese (Simplified)_China.936,不然服務沒有辦法啟動。

我......,就差這臨門一腳,怎么辦,先看看能不能在我的windows10筆記本上切換語言環境。

然后 ...... ...... ...... ......

算了,這個肯定不是什么好辦法,我不能設置環境,那我找一個支持的環境總行了吧,原始環境我是沒治了,好像win7的語言環境和原始環境一致(Chinese (Simplified)_People's Republic of China.936),好好好,看到了希望的曙光

咳咳,搜索引擎誠不欺我也,哈哈哈!恢復完成。

其實,一開始就可以先看看官方的文檔的......,Mark一下PostgreSQL 11.2 手冊


參考鏈接:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM