精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

好險!一入職,就遇到MySQL這么大Bug!差點背鍋走人...

數據庫 MySQL
今年這種情況,有時候不找好下家還真不敢跳,這不,前段時間剛跳到新東家,剛辦入職那天,就遇上事了,真的是嚇出一身冷汗(老大一直盯著我,說要快速解決這個問題),差點被(背)開(鍋)了....

今年這種情況,有時候不找好下家還真不敢跳,這不,前段時間剛跳到新東家,剛辦入職那天,就遇上事了,真的是嚇出一身冷汗(老大一直盯著我,說要快速解決這個問題),差點被(背)開(鍋)了....

情況如何?且聽我下面慢慢道來!!!希望對大家有所幫助與借鑒。

問題描述

線上有個重要Mysql客戶的表在從5.6升級到5.7后,master上插入過程中出現"Duplicate key"的錯誤,而且是在主備及RO實例上都出現。

以其中一個表為例,遷移前通過“show create table” 命令查看的auto increment id為1758609, 遷移后變成了1758598,實際對遷移生成的新表的自增列用max求最大值為1758609。

用戶采用的是Innodb引擎,而且據運維同學介紹,之前碰到過類似問題,重啟即可恢復正常。

內核問題排查

由于用戶反饋在5.6上訪問正常,切換到5.7后就報錯。因此,首先得懷疑是5.7內核出了問題,因此第一反應是從官方bug list中搜索一下是否有類似問題存在,避免重復造車。經過搜索,發現官方有1個類似的bug,這里簡單介紹一下該bug。

背景知識1

Innodb引擎中的auto increment 相關參數及數據結構。

主要參數包括:innodb_autoinc_lock_mode用于控制獲取自增值的加鎖方式,auto_increment_increment, auto_increment_offset用于控制自增列的遞增的間隔和起始偏移。

主要涉及的結構體包括:數據字典結構體,保存整個表的當前auto increment值以及保護鎖;事務結構體,保存事務內部處理的行數;handler結構體,保存事務內部多行的循環迭代信息。

背景知識2

mysql及Innodb引擎中對autoincrement訪問及修改的流程

  •  (1) 數據字典結構體(dict_table_t)換入換出時對autoincrement值的保存和恢復。換出時將autoincrement保存在全局的的映射表中,然后淘汰內存中的dict_table_t。換入時通過查找全局映射表恢復到dict_table_t結構體中。相關的函數為dict_table_add_to_cache及dict_table_remove_from_cache_low。
  •  (2) row_import, table truncate過程更新autoincrement。
  •  (3) handler首次open的時候,會查詢當前表中最大自增列的值,并用最大列的值加1來初始化表的data_dict_t結構體中的autoinc的值。
  •  (4) insert流程。相關對autoinc修改的堆棧如下: 
  1. ha_innobase::write_row:write_row的第三步中調用handler句柄中的update_auto_increment函數更新auto increment的值。  
  2. handler::update_auto_increment: 調用Innodb接口獲取一個自增值,并根據當前的auto_increment相關變量的值調整獲取的自增值;同時設置當前handler要處理的下一個自增列的值。  
  3. ha_innobase::get_auto_increment:獲取dict_tabel中的當前auto increment值,并根據全局參數更新下一個auto increment的值到數據字典中  
  4. ha_innobase::dict_table_autoinc_initialize:更新auto increment的值,如果指定的值比當前的值大,則更新。  
  5. handler::set_next_insert_id:設置當前事務中下一個要處理的行的自增列的值。 
  •  (5) update_row。對于”INSERT INTO t (c1,c2) VALUES(x,y) ON DUPLICATE KEY UPDATE”語句,無論唯一索引列所指向的行是否存在,都需要推進auto increment的值。相關代碼如下: 
  1. if (error == DB_SUCCESS  
  2.     && table->next_number_field  
  3.     && new_row == table->record[0]  
  4.     && thd_sql_command(m_user_thd) == SQLCOM_INSERT  
  5.     && trx->duplicates)  {  
  6.     ulonglong    auto_inc; 
  7.        ……  
  8.     auto_inc = table->next_number_field->val_int();  
  9.     auto_inc = innobase_next_autoinc(auto_inc, 1, increment, offset, col_max_value);  
  10.     error = innobase_set_max_autoinc(auto_inc); 
  11.         ……  

從我們的實際業務流程來看,我們的錯誤只可能涉及insert及update流程。 

  1. BUG 76872 / 88321: "InnoDB AUTO_INCREMENT produces same value twice" 
  •  (1) bug概述:當autoinc_lock_mode大于0,且auto_increment_increment大于1時,系統剛重啟后多線程同時對表進行insert操作會產生“duplicate key”的錯誤。
  •  (2) 原因分析:重啟后innodb會把autoincrement的值設置為max(id) + 1。

此時,首次插入時,write_row流程會調用handler::update_auto_increment來設置autoinc相關的信息。首先通過ha_innobase::get_auto_increment獲取當前的autoincrement的值(即max(id) + 1),并根據autoincrement相關參數修改下一個autoincrement的值為next_id。

當auto_increment_increment大于1時,max(id) + 1 會不大于next_id。handler::update_auto_increment獲取到引擎層返回的值后為了防止有可能某些引擎計算自增值時沒有考慮到當前auto increment參數,會重新根據參數計算一遍當前行的自增值,由于Innodb內部是考慮了全局參數的,因此handle層對Innodb返回的自增id算出的自增值也為next_id,即將會插入一條自增id為next_id的行。

handler層會在write_row結束的時候根據當前行的值next_id設置下一個autoincrement值。如果在write_row尚未設置表的下一個autoincrement期間,有另外一個線程也在進行插入流程,那么它獲取到的自增值將也是next_id。這樣就產生了重復。

  •  (3) 解決辦法:引擎內部獲取自增列時考慮全局autoincrement參數,這樣重啟后第一個插入線程獲取的自增值就不是max(id) + 1,而是next_id,然后根據next_id設置下一個autoincrement的值。由于這個過程是加鎖保護的,其他線程再獲取autoincrement的時候就不會獲取到重復的值。

通過上述分析,這個bug僅在autoinc_lock_mode > 0 并且auto_increment_increment > 1的情況下會發生。實際線上業務對這兩個參數都設置為1,因此,可以排除這個bug造成線上問題的可能性。

現場分析及復現驗證

既然官方bug未能解決我們的問題,那就得自食其力,從錯誤現象開始分析了。

(1) 分析max id及autoincrement的規律 由于用戶的表設置了ON UPDATE CURRENT_TIMESTAMP列,因此可以把所有的出錯的表的max id、autoincrement及最近更新的幾條記錄抓取出來,看看是否有什么規律。抓取的信息如下:

乍看起來,這個錯誤還是很有規律的,update time這一列是最后插入或者修改的時間,結合auto increment及max id的值,現象很像是最后一批事務只更新了行的自增id,沒有更新auto increment的值。

聯想到【官方文檔】中對auto increment用法的介紹,update操作是可以只更新自增id但不觸發auto increment推進的。按照這個思路,我嘗試復現了用戶的現場。復現方法如下:

同時在binlog中,我們也看到有update自增列的操作。如圖:

不過,由于binlog是ROW格式,我們也無法判斷這是內核出問題導致了自增列的變化還是用戶自己更新所致。因此我們聯系了客戶進行確認,結果用戶很確定沒有進行更新自增列的操作。

那么這些自增列到底是怎么來的呢?

(2) 分析用戶的表及sql語句 繼續分析,發現用戶總共有三種類型的表 

  1. hz_notice_stat_sharding  
  2. hz_notice_group_stat_sharding  
  3. hz_freeze_balance_sharding 

這三種表都有自增主鍵。

但是前面兩種都出現了autoinc錯誤,唯獨hz_freeze_balance_sharding表沒有出錯。難道是用戶對這兩種表的訪問方式不一樣?抓取用戶的sql語句,果然,前兩種表用的都是replace into操作,最后一種表用的是update操作。難道是replace into語句導致的問題?搜索官方bug, 又發現了一個疑似bug。 

  1. bug #87861: “Replace into causes master/slave have different auto_increment offset values” 

原因:

  •  (1) Mysql對于replace into實際是通過delete + insert語句實現,但是在ROW binlog格式下,會向binlog記錄update類型日志。Insert語句會同步更新autoincrement,update則不會。
  •  (2) replace into在Master上按照delete+insert方式操作, autoincrement就是正常的。基于ROW格式復制到slave后,slave機上按照update操作回放,只更新行中自增鍵的值,不會更新autoincrement。

因此在slave機上就會出現max(id)大于autoincrement的情況。此時在ROW模式下對于insert操作binlog記錄了所有的列的值,在slave上回放時并不會重新分配自增id,因此不會報錯。但是如果slave切master,遇到Insert操作就會出現”Duplicate key”的錯誤。

  •  (3) 由于用戶是從5.6遷移到5.7,然后直接在5.7上進行插入操作,相當于是slave切主,因此會報錯。

解決方案

業務側的可能解決方案:

  •  (1) binlog改為mixed或者statement格式。
  •  (2) 用Insert on duplicate key update代替replace into。

內核側可能解決方案:

  •  (1) 在ROW格式下如果遇到replace into語句,則記錄statement格式的logevent,將原始語句記錄到binlog。
  •  (2) 在ROW格式下將replace into語句的logevent記錄為一個delete event和一個insert event。

心得

  •  (1) autoincrement的autoinc_lock_mode及auto_increment_increment這兩個參數變化容易導致出現重復的key,使用過程中要盡量避免動態的去修改。
  •  (2) 在碰到線上的問題時,首先應該做好現場分析,明確故障發生的場景、用戶的SQL語句、故障發生的范圍等信息,同時要對涉及實例的配置信息、binlog甚至實例數據等做好備份以防過期丟失。

只有這樣才能在找官方bug時精準的匹配場景,如果官方沒有相關bug,也能通過已有線索獨立分析。 

責任編輯:龐桂玉 來源: java版web項目
相關推薦

2020-04-08 07:55:08

MySQLSLA數據

2021-05-17 08:11:44

MySQL數據庫索引

2019-12-03 13:57:38

CIO背鍋IT

2021-07-19 08:41:49

藍屏用戶Bug

2022-12-28 10:52:34

Etcd備份

2022-12-09 09:43:41

前端測試

2021-10-08 07:50:57

軟件設計程序

2017-09-25 10:52:27

2024-04-22 00:00:01

Redis集群

2019-09-17 10:31:51

崗位產品程序員

2018-12-26 17:36:37

開發者技能阿里

2020-06-16 18:09:54

Windows 10Windows電池驅動

2019-01-04 10:13:22

蘋果中國市場iPhone

2019-01-16 18:11:28

程序員技能開發者

2018-10-19 16:35:20

運維

2025-03-28 09:22:33

2019-12-10 10:28:47

運維架構技術

2017-09-12 16:18:22

ICO區塊鏈互聯網+

2020-04-09 10:43:12

長事務P0故障

2021-04-30 07:09:48

SQLP0事故
點贊
收藏

51CTO技術棧公眾號

福利一区二区| 成人激情小说网站| av播放在线| 久久久久久久蜜桃| 久久国产精品黑丝| 91女厕偷拍女厕偷拍高清| 欧美一区第一页| 91激情视频在线观看| 亚洲色图图片| 亚洲不卡在线观看| 亚洲电影网站| 后入内射欧美99二区视频| 性欧美xxxx大乳国产app| www.美女亚洲精品| 黄色在线免费播放| 日本午夜精品久久久久| 五月激情六月综合| 色乱码一区二区三区熟女| 亚洲欧美日韩动漫| 韩国午夜理伦三级不卡影院| 2019中文字幕免费视频| 污污的视频在线免费观看| 久久a爱视频| 91精品黄色片免费大全| 最近免费中文字幕中文高清百度| а√天堂资源地址在线下载| 久久理论电影网| 福利视频一区二区三区| 亚洲网站在线免费观看| 国产日韩视频| 久久久久久久久久久亚洲| 三级黄色录像视频| 欧美日韩中文字幕一区二区三区| 亚洲精品久久久久中文字幕欢迎你 | 中文字幕欧美人妻精品| 亚洲一区图片| 国外成人在线播放| 波多野结衣亚洲色图| 97欧美在线视频| 亚洲午夜色婷婷在线| 性高潮免费视频| 国产精品免费精品自在线观看| 欧美主播一区二区三区美女| av观看免费在线| 国产在线看片免费视频在线观看| 一区二区在线观看视频 | 国产精品一区二区无码对白| 精品99re| 欧美一区二区三区在线视频| 亚洲va综合va国产va中文| 欧美色网在线| 欧亚洲嫩模精品一区三区| 日本新janpanese乱熟| 亚洲黄色免费av| 日韩欧美aaa| 欧美 国产 小说 另类| 中文一区一区三区高中清不卡免费| 亚洲不卡一区二区三区| 丁香花在线影院观看在线播放| 欧洲成人综合网| 午夜av区久久| 国产精品-区区久久久狼 | 国产日韩精品在线播放| 影音先锋黄色网址| 久草这里只有精品视频| 成人福利网站在线观看| 国产成人免费看一级大黄| 国产成人免费xxxxxxxx| 国产亚洲精品久久飘花| 天天操天天操天天干| 久久亚洲一区二区三区明星换脸 | 成人资源www网在线最新版| 国产精品午夜春色av| 亚洲综合视频一区| 主播国产精品| 午夜亚洲福利老司机| 青青草原av在线播放| 全球最大av网站久久| 欧美片在线播放| 国产免费a级片| 亚洲宅男网av| 久久久91精品国产| 日本熟伦人妇xxxx| 老司机亚洲精品| 91精品久久久久久久| 99久久久久久久| 成人少妇影院yyyy| 日韩免费中文专区| 看女生喷水的网站在线观看| 亚洲一区二区综合| 无码人妻h动漫| 国产一区二区视频在线看| 精品欧美一区二区久久 | 国产麻豆精品久久| 久久天天躁狠狠躁夜夜爽蜜月| 国产亚洲精品码| 久久午夜影视| 亚洲一区二区三区久久 | 日韩在线视频观看| www..com国产| 紧缚捆绑精品一区二区| 精品乱子伦一区二区三区| 在线观看免费黄视频| 亚洲午夜电影在线| 婷婷免费在线观看| 男人的天堂久久| 久久精品国产清自在天天线| 久久久久99精品成人片三人毛片| 免费看欧美女人艹b| 国产一区二区精品在线| 精品51国产黑色丝袜高跟鞋| 色综合久久中文综合久久97| 久久6免费视频| 综合伊思人在钱三区| 欧美放荡办公室videos4k| 五月婷婷六月婷婷| 不卡av免费在线观看| 亚洲国产精品视频一区| 蜜桃麻豆av在线| 日韩午夜激情av| 337人体粉嫩噜噜噜| 亚洲激情二区| 亚洲r级在线观看| av在线二区| 一本到一区二区三区| 亚洲欧美日韩色| 五月精品视频| 国产欧美日韩最新| 经典三级在线| 日本成人伦理电影| 国产丝袜欧美中文另类| 欧美高清中文字幕| 欧美成人xxxx| 伊人青青综合网站| 日韩精品手机在线| 成人黄页在线观看| 中文字幕日韩精品无码内射| 亚洲综合资源| 中文字幕在线观看亚洲| 国产情侣免费视频| 国产亚洲一区字幕| 欧在线一二三四区| 免费成人网www| 8050国产精品久久久久久| 黄色av中文字幕| 亚洲成a人片在线观看中文| 91精产国品一二三| 国产一区观看| 国产精品二区三区| 黑人玩欧美人三根一起进| 日韩精品一区二区三区蜜臀 | 成人黄色在线观看视频| 亚洲免费成人av| 国产精品igao网网址不卡| 亚洲综合专区| 97av自拍| 爱福利在线视频| 亚洲精品456在线播放狼人| 亚州国产精品视频| 91网页版在线| 成人一区二区三| 成人网18免费网站| 成人精品在线观看| 欧美韩日亚洲| 日韩精品免费在线视频观看| 国产免费av一区| 国产视频一区二区在线| 中文字幕成人免费视频| 在线免费观看日本欧美爱情大片| 99re资源| 厕沟全景美女厕沟精品| 在线视频欧美日韩精品| 国产精品久久影视| 中文字幕综合网| 久久久久亚洲无码| 日本亚洲三级在线| 精品一区二区成人免费视频 | 日本视频在线一区| 中文字幕av导航| 国产调教精品| 国产成人鲁鲁免费视频a| 性开放的欧美大片| 精品欧美一区二区三区精品久久| av黄色在线播放| 中文字幕在线免费不卡| 任你躁av一区二区三区| 三级在线观看一区二区| 玖玖精品在线视频| 欧美91在线| 成人精品一区二区三区电影免费 | 欧美性xxxxx极品娇小| 日本少妇xxxxx| 国产福利精品导航| 日韩欧美在线播放视频| 亚洲综合小说| 欧美一区1区三区3区公司| 精品国产亚洲一区二区三区在线| 午夜精品三级视频福利| 天堂中文а√在线| 亚洲精品久久视频| 一级片在线免费观看视频| 亚洲大片免费看| 娇小11一12╳yⅹ╳毛片| www.亚洲国产| 日韩欧美色视频| 日韩av一二三| 国产成人无码a区在线观看视频| 久久伦理在线| 欧美日韩视频在线一区二区观看视频 | 国产精品伦理久久久久久| 国产午夜精品一区| 精品视频在线观看免费观看| 国产精品视频白浆免费视频| 日本不卡网站| 欧美激情videos| 免费人成在线观看播放视频| 国产婷婷97碰碰久久人人蜜臀 | 成人在线高清| 秋霞午夜一区二区| missav|免费高清av在线看| 日韩在线观看免费| 大片免费播放在线视频| 亚洲久久久久久久久久| 国模人体一区二区| 日韩亚洲欧美高清| 国产精品久久久久久免费播放| 在线观看日韩毛片| 中文字幕激情小说| 亚洲不卡av一区二区三区| 久久久国产精品黄毛片| 亚洲色图欧洲色图婷婷| 青青青手机在线视频| 国产欧美综合在线| 亚洲区自拍偷拍| 91婷婷韩国欧美一区二区| 亚洲婷婷在线观看| 粉嫩一区二区三区在线看| 99999精品| 国产精品亚洲专一区二区三区| 色91精品久久久久久久久| 欧美aaaaaa午夜精品| 日本成人中文字幕在线| 丝袜美腿亚洲色图| 国产v亚洲v天堂无码久久久| 亚洲免费网站| 国产成人亚洲精品无码h在线| 国产精品免费看| 女人扒开屁股爽桶30分钟| 亚洲女人av| www.国产区| 蜜臀精品一区二区三区在线观看| 男女爽爽爽视频| 蜜臀精品久久久久久蜜臀| 色婷婷.com| 国产麻豆午夜三级精品| 欧美人与性动交α欧美精品| 国产99精品在线观看| 最新版天堂资源在线| 97精品超碰一区二区三区| 人妻丰满熟妇aⅴ无码| 久久久久久电影| 极品久久久久久久| 自拍偷拍欧美精品| 久久国产精品二区| 婷婷成人综合网| 日韩黄色片网站| 欧美精品第一页| 精品人妻一区二区三区日产乱码 | 国产精品videosex极品| 久久综合久久久久| 视频一区免费在线观看| 亚洲免费999| 成人综合在线视频| 日韩人妻无码一区二区三区| 国产欧美一区二区精品忘忧草| 久久久免费看片| 一区二区三区在线视频免费 | 国产在线观看a| 高清欧美一区二区三区| 欧洲亚洲两性| 91九色视频导航| 狼人精品一区二区三区在线| 日韩.欧美.亚洲| 亚洲欧洲中文字幕| 国模无码视频一区二区三区| 美女爽到高潮91| 91成人在线观看喷潮蘑菇| 久久你懂得1024| 永久看片925tv| 日韩欧美在线视频| 国产精品久久久久久在线| 日韩精品视频在线观看免费| 午夜免费福利在线观看| 91成品人片a无限观看| 欧美成人三级| 久久久99爱| 综合国产精品| 国产精品视频黄色| 成人av免费观看| 夫妻性生活毛片| 欧美性高潮床叫视频| 国产av无码专区亚洲av| 亚洲欧美制服综合另类| 青草青在线视频| 成人免费观看网址| 久久99国产成人小视频| 欧美日韩激情四射| 麻豆91在线播放| 99久久久无码国产精品性| 亚洲一线二线三线久久久| 中文字幕在线播出| 亚洲精品视频二区| 人交獸av完整版在线观看| 国产在线视频不卡| 一本色道久久综合亚洲精品酒店| 国产视频在线观看网站| 老司机免费视频一区二区三区| 无遮挡aaaaa大片免费看| 亚洲最大的成人av| 国产精品久久久久久久成人午夜| 亚洲免费人成在线视频观看| 高清电影在线观看免费| 91久久国产综合久久蜜月精品| 成人高清电影网站| 国产第一页视频| 99精品国产一区二区三区不卡 | 欧美性猛交xxxx富婆| 亚洲成人黄色片| 欧美老女人性视频| 精品午夜视频| 肉大捧一出免费观看网站在线播放| 麻豆成人av在线| 五月天精品在线| 日本韩国精品在线| 欧美男男同志| 欧洲成人免费aa| 亚洲成在人线免费观看| 日本少妇高潮喷水视频| 99热国产精品| www.99re7.com| 亚洲第一福利网站| 波多野结衣中文字幕久久| 国产精品久久精品国产| 亚洲视频久久| 国产chinese中国hdxxxx| 亚洲成人自拍偷拍| 少妇人妻一区二区| 555www成人网| 国产欧美一区二区三区精品观看| 日韩精品视频久久| 久久久久久久久久久黄色| 欧美日韩综合一区二区三区| 亚洲欧美中文字幕在线一区| 中文字幕av一区二区三区佐山爱| 日韩.欧美.亚洲| 麻豆一区二区三| 国产一二三四区| 欧美mv日韩mv国产网站| 色戒汤唯在线观看| 欧洲精品久久| 麻豆极品一区二区三区| 日韩高清dvd碟片| 日韩一区二区麻豆国产| 91黄页在线观看| 免费一区二区三区在在线视频| 蜜桃av一区| 日本一级片免费| 亚洲第一男人av| 成人在线爆射| 中文字幕一区二区三区乱码| 国产精品白丝jk白祙喷水网站| 69精品久久久| 国产亚洲精品一区二区| 色999韩欧美国产综合俺来也| 中文字幕色呦呦| 91婷婷韩国欧美一区二区| 一区二区视频播放| 欧美激情国产精品| 国产精品最新| 亚洲综合伊人久久| 五月天激情综合| 福利成人在线观看| 2020国产精品久久精品不卡| 99香蕉国产精品偷在线观看| 美国美女黄色片| 日韩精品中午字幕| 国产一区二区三区朝在线观看| 午夜啪啪福利视频| 91视频观看免费| 99国产精品99| 国产97在线亚洲| 欧美激情视频一区二区三区在线播放| 国产伦精品一区二区三区88av| 91黄视频在线| 精品日韩av| 一区二区三区在线视频看| av在线这里只有精品| 一级日韩一级欧美| 57pao精品| 欧美福利一区|