MySQL:HASH_SCAN BUG 之迷惑行為大賞

前言

我們知道窟她,MySQL有一個老問題陈症,當表上無主鍵時,那么對于在該表上做的DML震糖,如果是以ROW模式復制录肯,則每一個行記錄前鏡像在備庫都可能產(chǎn)生一次全表掃描(或者二級索引掃描),大多數(shù)情況下吊说,這種開銷都是非常不可接受的论咏,并且產(chǎn)生大量的延遲。

在MySQL5.6中提供了一個新的參數(shù):slave_rows_search_algorithms, 可以部分解決無主鍵表導致的復制延遲問題颁井,其基本思路是對于在一個ROWS EVENT中的所有前鏡像收集起來厅贪,然后在一次掃描全表時,判斷HASH中的每一條記錄進行更新雅宾。

以上摘自印風大神的文章养涮,具體效果和使用方式可以查看文章:https://yq.aliyun.com/articles/41058

本文不是要繼續(xù)討論 slave_rows_search_algorithms 的原理秀又,而是在使用?slave_rows_search_algorithms 參數(shù)時遇到一個坑单寂,撲朔迷離的地方在于這不像一個bug贬芥,這又是一個bug吐辙,最后官方的操作更是讓人看不懂...

問題描述

row-based replication,主從數(shù)據(jù)一致情況下蘸劈,slave sql 線程報錯 Can't find record昏苏。

如何復現(xiàn)

相關配置參數(shù):

slave_rows_search_algorithms = 'INDEX_SCAN,HASH_SCAN'

binlog_format = ROW

在主庫上:

1. CREATE TABLE t1 ( A INT UNIQUE KEY, B INT ); insert into t1 values (1,2);

2. replace into t1 values (1,3),(1,4);

3. 然后從庫就會報錯了

4. 在從庫上:set global slave_rows_search_algorithms='INDEX_SCAN,TABLE_SCAN'; start slave;? 問題解決

或者用如下方法避免:

1. 將 UNIQUE KEY 調整為 PRIMARY KEY;

2. 將 replace into tt.t1 values (1,3),(1,4); 調整為 replace into tt.t1 values (1,3);replace into tt.t1 values (1,4);

分析過程

1. 查看 slave_rows_search_algorithms 參數(shù)定義:

The default value is?INDEX_SCAN,TABLE_SCAN, which means that all searches that can use indexes do use them, and searches without any indexes use table scans.

To use hashing for any searches that do not use a primary or unique key, set?INDEX_SCAN,HASH_SCAN. Specifying?INDEX_SCAN,HASH_SCANhas the same effect as specifying?INDEX_SCAN,TABLE_SCAN,HASH_SCAN, which is allowed.

Do not use the combination?TABLE_SCAN,HASH_SCAN. This setting forces hashing for all searches. It has no advantage over?INDEX_SCAN,HASH_SCAN, and it can lead to?“record not found”?errors or duplicate key errors in the case of a single event containing multiple updates to the same row, or updates that are order-dependent.

根據(jù)手冊描述,可以理解為:

1. 從庫定位數(shù)據(jù)可選項有?INDEX_SCAN贤惯、HASH_SCAN洼专、TABLE_SCAN,優(yōu)先級是依次遞減的孵构。也就是說如果有主鍵屁商,走?INDEX_SCAN,沒主鍵則根據(jù)設置走?HASH_SCAN?還是?TABLE_SCAN(而且如果兩者都配了颈墅,則優(yōu)先?HASH_SCAN)蜡镶;

2. 無主鍵設置?INDEX_SCAN,HASH_SCAN,可以提升從庫回訪效率恤筛,降低延遲官还;

3. 如果走了?HASH_SCAN,當對同一行數(shù)據(jù)同時更新多次時毒坛,會導致無法找到行記錄望伦。

看到這里,手冊已經(jīng)說明原因了煎殷。但是矛盾的地方在于手冊有推薦使用?INDEX_SCAN,HASH_SCAN?的意思屯伞,并且 8.0.2 版本開始的默認值已經(jīng)修改為:INDEX_SCAN,HASH_SCAN。

2. 針對上面的疑問提交SR

Oracle 工程師回應這是 HASH_SCAN 的 bug豪直,修復到了 MySQL8.0.17(還沒有正式發(fā)布):

It happens when one row is updated twice within an Update_rows_log_event. HASH_SCAN will put both rows in a hash map. Then it iterates over the rows of the table, looks up each row in the hash. If any row is found, it applies the update. Since it only makes one lookup per row, it will miss the second update. In the end, it checks that all rows in the hash were applied and generates an error otherwise. This is what is seen in the bug report.

等等愕掏,為什么只修復到 8.0 而沒在 5.7 修復?再根據(jù)之前就有的疑問顶伞,我來腦補一波:

1. 文檔寫了在某些情況 HASH_SCAN 有這個問題(吐槽:HASH_SCAN 就是優(yōu)化無主鍵情況從庫復制效率的饵撑,但是無主鍵且對同一行數(shù)據(jù)同時更新多次時 HASH_SCAN 又會導致從庫無法找到記錄,那我用還是不用呢唆貌?黑人問號.gif)滑潘,所以暫時我先假設“這不是個 bug”;

2. Oracle 工程師反手甩給我一個 bug 報告锨咙,啪啪打臉语卤,官方承認這就是一個 bug;

3. 官方好像也認為有點不對勁酪刀,一拍腦袋粹舵,咱們只在 8.0 修復,把鍋甩給 “8.0.2 的默認值修改成了 HASH_SCAN”骂倘。

這個迷惑行為可以用一句經(jīng)典總結:it's not a bug,it's a feature!

解決方案

1. 給表添加主鍵(規(guī)范必須有主鍵才是王道)眼滤;

2. 修改參數(shù) slave_rows_search_algorithms='INDEX_SCAN,TABLE_SCAN';

3. 最符合初衷的做法是升級到 8.0.17历涝,可惜這步子對于絕大多數(shù)生產(chǎn)環(huán)境來說都太大了诅需。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末漾唉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子堰塌,更是在濱河造成了極大的恐慌赵刑,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件场刑,死亡現(xiàn)場離奇詭異般此,居然都是意外死亡,警方通過查閱死者的電腦和手機牵现,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門恤煞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人施籍,你說我怎么就攤上這事居扒。” “怎么了丑慎?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵喜喂,是天一觀的道長。 經(jīng)常有香客問我竿裂,道長玉吁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任腻异,我火速辦了婚禮进副,結果婚禮上,老公的妹妹穿的比我還像新娘悔常。我一直安慰自己影斑,他們只是感情好,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布机打。 她就那樣靜靜地躺著矫户,像睡著了一般。 火紅的嫁衣襯著肌膚如雪残邀。 梳的紋絲不亂的頭發(fā)上皆辽,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機與錄音芥挣,去河邊找鬼驱闷。 笑死,一個胖子當著我的面吹牛空免,可吹牛的內(nèi)容都是我干的空另。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鼓蜒,長吁一口氣:“原來是場噩夢啊……” “哼痹换!你這毒婦竟也來了?” 一聲冷哼從身側響起都弹,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤娇豫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后畅厢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冯痢,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年框杜,在試婚紗的時候發(fā)現(xiàn)自己被綠了浦楣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡咪辱,死狀恐怖振劳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情油狂,我是刑警寧澤历恐,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站专筷,受9級特大地震影響弱贼,放射性物質發(fā)生泄漏。R本人自食惡果不足惜磷蛹,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一吮旅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧味咳,春花似錦庇勃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至捺檬,卻和暖如春再层,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背堡纬。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工聂受, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烤镐。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓蛋济,卻偏偏與公主長得像,于是被迫代替她去往敵國和親炮叶。 傳聞我的和親對象是個殘疾皇子碗旅,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容

  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,456評論 0 13
  • 1.A simple master-to-slave replication is currently being...
    Kevin關大大閱讀 5,969評論 0 3
  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,332評論 0 10
  • 這段時間是我職業(yè)中最艱難的時段渡处,所有的困苦全部在這段時間爆發(fā),我開始懷疑自己是不是真的沒有能力祟辟?是不是職業(yè)就此走下...
    天涼好個秋123閱讀 178評論 0 0
  • 今天媽媽帶我回家医瘫,媽媽告訴我姥爺來了,我好開心旧困,急匆匆地回家了醇份,到家之后我看見了姥爺和姥姥,好興奮吶吼具。爸爸出...
    18級李欣陽閱讀 226評論 0 0