HGDB重建控制文件
1、文檔用途
當控制文件損壞時,重建控制文件
2、詳細信息
(1) 介紹
如果控制文件$PGDATA/global/pg_control損壞或丟失, 數(shù)據(jù)庫將運行異常, 無法啟動.
pg_resetwal會清除預(yù)寫式日志(WAL)并且有選擇地重置存儲在pg_control文件中的一些其他控制信息。如果這些文件已經(jīng)被損壞,某些時候就需要這個功能。當服務(wù)器由于這樣的損壞而無法啟動時,這只應(yīng)該被用作最后的手段。
使用此方法后數(shù)據(jù)庫可能包含由于部分提交事務(wù)產(chǎn)生的不一致數(shù)據(jù)。應(yīng)當立刻轉(zhuǎn)儲你的數(shù)據(jù),即將數(shù)據(jù)導(dǎo)入一個新庫中。
這個工具只能被安裝服務(wù)器的用戶運行,因為它要求對數(shù)據(jù)目錄的讀寫訪問。
出于安全原因,必須在命令行中指定數(shù)據(jù)目錄。pg_resetwal不使用環(huán)境變量PGDATA。
如果無法為pg_control決定合法數(shù)據(jù),可以通過指定-f(強制)選項強制它繼續(xù)。但恢復(fù)的數(shù)據(jù)庫可能存在損壞,且需要立即轉(zhuǎn)儲數(shù)據(jù)。
(2) 使用方法
pg_resetwal --help |
-l walfile
通過指定下一個WAL段文件名稱來手工設(shè)置WAL開始位置。下一個WAL段文件的名稱應(yīng)該比當前存在于數(shù)據(jù)目錄下pg_wal目錄中的任意 WAL 段文件名更大。如果00000001000000320000004A是pg_wal中最大的項,則使用-l 00000001000000320000004B或更高的值。pg_resetwal本身查看pg_wal中的文件并選擇一個超出最新現(xiàn)存文件名的默認-l設(shè)置。因此,只有當你知道 WAL 段文件當前不在pg_wal中時,或者當pg_wal的內(nèi)容完全丟失時,才需要對-l的手工調(diào)整,例如一個離線歸檔中的項。
-m mxid,mxid
手工設(shè)置下一個和最老的多事務(wù) ID。確定下一個多事務(wù) ID(第一部分)的安全值的方法:在數(shù)據(jù)目錄下的pg_multixact/offsets目錄中查找最大的數(shù)字文件名,adding one, and then multiplying by 65536 (0x10000)。反過來,確定最老的多事務(wù) ID(-m的第二部分)的方法:在同一個目錄中查找最小的數(shù)字文件名并且乘以 65536。文件名是十六進制的數(shù)字,因此實現(xiàn)上述方法最簡單的方式是以十六進制指定文件名并且追加四個零。例如做大的文件是0002,最小文件是0001,則安全值是0x30000,0x10000
-O mxoff
手工設(shè)置下一個多事務(wù)偏移量。確定安全值的方法:查找數(shù)據(jù)目錄下pg_multixact/members目錄中最大的數(shù)字文件名,adding one, and then multiplying by 52352 (0xCC80)。文件名是十六進制數(shù)字。沒有像其他選項那樣追加零的簡單方法。例如最大文件名是0002,則安全值是3*52352=157056,轉(zhuǎn)換成十六進制0x26580-x xid
手工設(shè)置下一個事務(wù) ID。確定安全值的方法:在數(shù)據(jù)目錄下的pg_xact目錄中查找最大的數(shù)字文件名,然后在它的基礎(chǔ)上 adding one, and then multiplying by 1048576 (0x100000).注意文件名是十六進制的數(shù)字。通常以十六進制的形式指定該選項值也是最容易的。例如,如果0011是pg_xact中的最大項,-x 0x1200000就可以(五個尾部的零就表示了前面說的乘數(shù))。(十進制算法,12轉(zhuǎn)成十進制是18也就是18*1048576=18,874,368 轉(zhuǎn)成十六進制是1200000)
注意, 這個命令不能在服務(wù)器正在運行時被使用。如果在數(shù)據(jù)目錄中發(fā)現(xiàn)一個服務(wù)器鎖文件,pg_resetwal將拒絕啟動。這種情況下可以移除該鎖文件來讓pg_resetwal運行。
(3) 問題
如果數(shù)據(jù)庫使用了sm4加密,此方法不適用。會有如下錯誤信息
[root@0253a756e869 members]# pg_ctl start |
查看是否啟用加密命令
# pg_controldata |grep encryption |