PostgreSQL數(shù)據(jù)庫培訓(xùn)(PG DBA Part02)
2023-08-04 11:02 作者:bili_93891819972 | 我要投稿
在T1,數(shù)據(jù)庫成功執(zhí)行checkpoint;
在T2,執(zhí)行DML語句,這時(shí)候相關(guān)的數(shù)據(jù)會寫入到WAL中(此處忽略了WAL buffer);
在T3,提交該事務(wù);
在T4,bgwriter把dirty pages寫入到Data file中,但在寫入過程中機(jī)器出現(xiàn)故障導(dǎo)致Crash(如掉電等),出現(xiàn)了部分寫的情況。
為了應(yīng)對這種情況,PG在T2寫入WAL的時(shí)候,會把出現(xiàn)變化的page整頁寫入到WAL中,而不僅僅是tuple data。在數(shù)據(jù)庫重啟執(zhí)行恢復(fù)的時(shí)候,在Redo point開始回放WAL時(shí),如發(fā)現(xiàn)XLOG Record是FPI(full-page-image),則整頁替換,通過這種機(jī)制解決了部分寫的問題。
二、full-page-write的代價(jià)
當(dāng)然這種機(jī)制不是免費(fèi)的,其主要的負(fù)面影響是寫放大。
由于整頁寫,不可避免的出現(xiàn)冗余數(shù)據(jù);考慮這么一種情況:如果數(shù)據(jù)庫很繁忙,而且數(shù)據(jù)的熱點(diǎn)分散在不同的table上,同時(shí)checkpoint執(zhí)行間隔較短,那非常多的page就會通過full-page-write寫入的WAL中,導(dǎo)致日志空間快速膨脹。在極端情況下,page“滿載”(基本沒有空閑空間)的情況下更新其中一條記錄都會導(dǎo)致整頁寫入WAL。
標(biāo)簽: