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