您好,登錄后才能下訂單哦!
本文簡述下之前我們線上頻繁碰到的“UNABLE TO PURGE A RECORD”的原因
###################################################
線上實例錯誤日志中偶爾出現(xiàn) “UNABLE TO PURGE A RECORD”,從官方bug系統(tǒng)來看,很多用戶都遇到了類似的問題。
當(dāng)change buffer模塊以如下序列來緩存索引操作時:
當(dāng)讀入物理頁時,需要進(jìn)行ibuf merge,當(dāng)執(zhí)行到IBUF_OP_DELETE時,發(fā)現(xiàn)記錄并沒有被標(biāo)記刪除,導(dǎo)致錯誤日志報錯。
顯然上述的操作序列是不合理的,正確的序列應(yīng)該是IBUF_OP_DELETE_MARK,IBUF_OP_DELETE,IBUF_OP_INSERT。
為了理清邏輯,我們簡單的理一下相關(guān)代碼
注意IBUF_OP_DELETE是由第一步的標(biāo)記刪除操作觸發(fā),Purge線程發(fā)起;在每個buffer pool的控制結(jié)構(gòu)體中,有一個成員buf_pool->watch[BUF_POOL_WATCH_SIZE],BUF_POOL_WATCH_SIZE的值為purge線程個數(shù),用于輔助Purge操作。
假定內(nèi)存中沒有對應(yīng)的Page,Purge線程會做如下幾件事兒:
如果不在內(nèi)存中,則將page no等信息存儲到watch數(shù)組中,并插入page hash(buf_pool_watch_set)。如果隨后page被讀入內(nèi)存,就會刪除watch標(biāo)記。
解決
如果記錄所在的page被設(shè)置了一個sentinel,那么對該page的并發(fā)插入操作就不應(yīng)該緩存到change buffer中,而是直接去嘗試讀取物理頁。
https://github.com/mysql/mysql-server/commit/ec369cb4f363161dfbbbd662b20763b54808b7d1
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。