91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

InnoDB Insert Buffer: unable to purge a record

發布時間:2020-08-13 04:46:41 來源:ITPUB博客 閱讀:145 作者:G8bao7 欄目:MySQL數據庫
轉載: http://mysqllover.com/?p=1264
參考: InnoDB Insert Buffer實現詳解 http://hedengcheng.com/?p=94

MySQL5.6.23: fix “UNABLE TO PURGE A RECORD”

本文簡述下之前我們線上頻繁碰到的“UNABLE TO PURGE A RECORD”的原因

###################################################

線上實例錯誤日志中偶爾出現 “UNABLE TO PURGE A RECORD”,從官方bug系統來看,很多用戶都遇到了類似的問題。

當change buffer模塊以如下序列來緩存索引操作時:

  1. 記錄被標記刪除(IBUF_OP_DELETE_MARK)
  2. 隨后插入相同記錄–IBUF_OP_INSERT
  3. Purge線程需要物理刪除二級索引記錄,操作被buffer–IBUF_OP_DELETE

 

當讀入物理頁時,需要進行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線程會做如下幾件事兒:

  • 首先查詢buffer pool,看看page是否已經讀入內存;

如果不在內存中,則將page no等信息存儲到watch數組中,并插入page hash(buf_pool_watch_set)。如果隨后page被讀入內存,就會刪除watch標記。

  • 判斷該二級索引記錄是否可以被Purge(row_purge_poss_sec,當該二級索引記錄對應的聚集索引記錄沒有delete mark并且其trx id比當前的purge view還舊時,不可以做Purge操作)

 

  • 隨后,再插入IBUF_OP_DELETE類型的ibuf記錄時,還會double check下該page是否被設為sentinel (ibuf_insert_low,buf_pool_watch_occurred),如果未被設置,表明已經page已經讀入內存,就可以直接去做purge,而無需緩存了。

 

  • 對于普通的操作類型,例如IBUF_OP_INSERT和IBUF_OP_DELETE_MARK,同樣也會double check page 是否讀入了內存。在函數ibuf_insert中會調用buf_page_hash_get進行檢查, 如果page被讀入內存,則不緩存操作,如果請求的Page被設為sentinel,則從buf_page_hash_get返回NULL,因此隨后判定需要緩存操作。這也正是問題的所在:
  1. 標記刪除記錄,寫入IBUF_OP_DELETE_MARK
  2. Purge線程設置page對應的sentinel,完成合法性檢查,準備調用ibuf_insert
  3. 插入相同記錄,寫入IBUF_OP_INSERT
  4. Purge線程寫入IBUF_OP_DELETE

解決

如果記錄所在的page被設置了一個sentinel,那么對該page的并發插入操作就不應該緩存到change buffer中,而是直接去嘗試讀取物理頁。

https://github.com/mysql/mysql-server/commit/ec369cb4f363161dfbbbd662b20763b54808b7d1

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

五指山市| 临猗县| 仪陇县| 溆浦县| 乐业县| 酉阳| 秦安县| 武山县| 白水县| 龙胜| 比如县| 当阳市| 墨江| 汉寿县| 赞皇县| 嘉禾县| 兴城市| 江津市| 孝义市| 资源县| 合作市| 辽阳市| 嘉禾县| 自治县| 龙游县| 方城县| 祁东县| 湄潭县| 绥江县| 绥阳县| 兴宁市| 资溪县| 新巴尔虎右旗| 耿马| 花莲县| 宜兰县| 望谟县| 安化县| 抚顺县| 商南县| 进贤县|