PostgreSQL熱備份時pg_start_backup() 做了什麼?

尊重原創:http://blog.csdn.net/guoxianqi2012/article/details/7356999

PostgreSQL熱備份的過程一般爲:

  1. 數據庫中執行:pg_start_backup() ;
  2. 然後使用操作系統的tar或 cp命令拷貝 PostgreSQL數據文件。
  3. 數據庫中執行:pg_stop_backup()  ;

有人可能會問爲什麼我們開始用操作系統備份數據庫前需要執行pg_start_backup()?

實際上pg_start_backup()主要做了以下兩個工作:

  1. 置寫日誌標誌爲:XLogCtl->Insert.forcePageWrites = true,也就是把這個標誌設置爲true後,數據庫會把變化的整個數據塊都記錄到數據庫中,而不僅僅是塊中記錄的變化。
  2. 強制發生一次checkpoint點。

爲什麼要強制WAL日誌把整個塊都寫入WAL中呢?

想象一下: 如果你用cp命令拷貝文件時,數據庫也可能會同時寫這個文件,那麼可能會出現,一個數據塊,數據庫正在寫,cp命令正在讀,這樣有可能拷貝的數據塊的前半部分是新數據,後半部分是舊數據,也就是單個數據塊的數據不一致,這時,如果後面使用WAL日誌把數據推到一個一致點時,如果WAL日誌中只記錄是塊中行的變化,那麼對於這種不一致塊就無法恢復。但這時如果WAL日誌中記錄的是整個新數據塊的內容,那麼後面重演WAL日誌時,把整個新塊的內容寫到這個塊中後,這個塊的內容就達到了一致點了,這樣就沒有問題了。

強制發生一次checkpoint,也是爲了把前面的髒數據都刷到磁盤中,這樣從這之後產生的日誌都是記錄了整個數據塊,這樣就可以保證恢復的正確。

其實這個原理與oracle數據庫對錶空間做熱備份時做的“ALTER TABLESPACE users BEGIN BACKUP;” 是一樣的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章