大數據“復活”記
844
2025-03-31
對于數據庫的設計,數據庫的數據安全最為重要,如何才能保證數據庫的數據不丟失。PG是使用WAL(Write Ahead Logging)來實現的,即數據頁寫入磁盤前務必要將對應的Xlog寫入磁盤,這句話就是整個數據庫實現數據不丟失的核心思想。在PG中主要要做到以下兩點:
1. 數據頁落盤前必須要保證對應的XLog刷盤。即數據頁落盤前要查看PageHeader中存儲的LSN對應的日志是否落盤,若沒有落盤一定要等此LSN落盤后才可以將數據頁落盤。
2.為了防止數據頁的半寫問題(操作系統的刷盤的原子操作的最小單位是4K,而一個page頁面的大小是8K,所以一個數據頁落盤時可能出現機器宕機等情況,導致數據寫了一半,另一半沒有寫下去),PG使用full Page write機制來應對此問題,即checkpoint后,第一次修改頁面時將頁面的所有信息存儲在XLog中,這樣當出現上述情況后就可以使用Xlog中保存的頁面數據來恢復數據頁面。
然而上面的描述很顯然有一個場景沒有解決,如果Xlog頁面壞掉怎么辦,因為我們需要使用Xlog來恢復數據頁面,Xlog壞掉了沒法修復了。這種情況PG提供了一個有損恢復的工具,貌似叫做pg_xlogreset。
其還有一種場景就是某個Xlog頁面壞掉了,且對應的數據頁面同事出現半寫的問題,這種情況使用pg_xlogreset可以讓數據庫起來,但是這個半寫的頁面沒有修復,一旦讀取此頁面就會出現CRC校驗報錯或者其他的問題,總之會報錯或者直接Painc掉。這種情況PG又提供了一個GUC參數zero_damaged_pages,即遇到此頁面先跳過,使其可以讀取其它頁面。
WAL基本原理大概就是這樣,詳細還是要看代碼滴。
數據倉庫服務 GaussDB(DWS)
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。