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

MySQL的這個bug,坑了多少人?

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

問題描述

近期,線上有個重要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訪問及修改的流程
  • 數據字典結構體(dict_table_t)換入換出時對autoincrement值的保存和恢復。換出時將autoincrement保存在全局的的映射表中,然后淘汰內存中的dict_table_t。換入時通過查找全局映射表恢復到dict_table_t結構體中。相關的函數為dict_table_add_to_cache及dict_table_remove_from_cache_low。
  • row_import, table truncate過程更新autoincrement。
  • handler首次open的時候,會查詢當前表中最大自增列的值,并用最大列的值加1來初始化表的data_dict_t結構體中的autoinc的值。
  • 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.               …… 
  12.   } 

從我們的實際業務流程來看,我們的錯誤只可能涉及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及最近更新的幾條記錄抓取出來,看看是否有什么規律。抓取的信息如下:

 

MySQL的這個bug,坑了多少人?

乍看起來,這個錯誤還是很有規律的,update time這一列是最后插入或者修改的時間,結合auto increment及max id的值,現象很像是最后一批事務只更新了行的自增id,沒有更新auto increment的值。聯想到【官方文檔】中對auto increment用法的介紹,update操作是可以只更新自增id但不觸發auto increment推進的。按照這個思路,我嘗試復現了用戶的現場。復現方法如下:

 

MySQL的這個bug,坑了多少人?

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

 

MySQL的這個bug,坑了多少人?

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

(2) 分析用戶的表及sql語句 繼續分析,發現用戶總共有三種類型的表(hz_notice_stat_sharding, hz_notice_group_stat_sharding,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” 

原因:

  • Mysql對于replace into實際是通過delete + insert語句實現,但是在ROW binlog格式下,會向binlog記錄update類型日志。Insert語句會同步更新autoincrement,update則不會。
  • 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”的錯誤。
  • 由于用戶是從5.6遷移到5.7,然后直接在5.7上進行插入操作,相當于是slave切主,因此會報錯。

解決方案

業務側的可能解決方案:

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

內核側可能解決方案:

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

心得

  • autoincrement的autoinc_lock_mode及auto_increment_increment這兩個參數變化容易導致出現重復的key,使用過程中要盡量避免動態的去修改。
  • 在碰到線上的問題時,首先應該做好現場分析,明確故障發生的場景、用戶的SQL語句、故障發生的范圍等信息,同時要對涉及實例的配置信息、binlog甚至實例數據等做好備份以防過期丟失。只有這樣才能在找官方bug時精準的匹配場景,如果官方沒有相關bug,也能通過已有線索獨立分析。

 

責任編輯:未麗燕 來源: 今日頭條
相關推薦

2020-07-20 09:40:49

MySQLBUG數據庫

2013-08-20 15:27:59

Linux操作系統

2021-09-25 13:05:10

MYSQL開發數據庫

2025-02-11 08:00:00

閉包JavaScript開發

2024-02-20 08:23:35

LookupSpringbeans

2010-07-01 14:35:57

Windows 7

2023-04-09 15:23:58

Python編程開發

2019-08-08 16:27:36

自動駕駛無人駕駛駕駛

2019-01-23 11:08:13

Windows微軟操作系統

2022-05-10 12:20:04

JDKversion故障

2022-10-11 16:28:42

比特幣加密貨幣資產

2021-07-29 06:28:13

網絡網工網絡中斷

2021-04-15 11:07:01

比特幣貨幣加密貨幣

2022-11-12 12:32:39

.NET微軟

2018-06-21 07:40:23

無線充電無線供電無線輸電

2021-10-15 06:49:37

MySQL

2021-12-20 09:46:26

代碼開發GitHub

2021-02-24 09:43:36

MySQL數據庫雙引號

2020-11-13 10:25:41

人臉數據

2024-07-04 11:44:02

點贊
收藏

51CTO技術棧公眾號

欧美激情喷水| 国产乱色精品成人免费视频| 99热这里只有精品首页 | 男插女视频网站| 在线看一级片| 97se亚洲国产综合在线| 91成人精品网站| 99久久人妻无码精品系列| 国外成人福利视频| 亚洲男人天堂av网| 国产精品视频免费一区二区三区| 久久不卡免费视频| 成人网18免费网站| 日韩久久久精品| 国产亚洲综合视频| 婷婷在线视频| 成人精品电影在线观看| 日本成人免费在线| 69xx绿帽三人行| 成人在线日韩| 性欧美疯狂xxxxbbbb| 欧美性大战久久久久| 中文字幕免费在线看| 欧美日韩亚洲一区| 亚洲精品网站在线播放gif| 91精品无人成人www| 51xtv成人影院| 久久你懂得1024| 成人黄色激情网| 国产午夜精品无码一区二区| 男男gay无套免费视频欧美| 欧美日韩1234| 日韩av综合在线观看| 久久bbxx| 久久精品欧美日韩精品| 18成人在线| 日韩免费av网站| 国产精品99免费看| 色小说视频一区| 丰满大乳奶做爰ⅹxx视频| 日韩色性视频| 91久久奴性调教| 男人添女荫道口女人有什么感觉| 你懂的视频在线观看| 国产一区91精品张津瑜| 国产91露脸中文字幕在线| 久久精品一级片| 婷婷久久一区| 精品无人区太爽高潮在线播放| 中文 日韩 欧美| 欧美男女交配| 午夜伊人狠狠久久| 免费人成在线观看视频播放| 日本中文字幕在线2020| 不卡的av中国片| 成人毛片网站| 黄色一级视频片| 日韩免费啪啪| 亚洲国产经典视频| 美乳视频一区二区| 五月婷婷六月色| 成人激情视频网站| 99久久久精品免费观看国产| 国产色综合视频| 经典一区二区三区| 国产一区欧美二区三区| 波多野结衣激情视频| 亚洲视频1区| 欧美第一黄网免费网站| 在线看的片片片免费| 无码少妇一区二区三区| 日韩风俗一区 二区| 国产免费一区二区三区最新6| 欧美大片91| 欧美日韩色一区| 冲田杏梨av在线| 黄色成人在线视频| 欧美性xxxxxxxx| 99视频在线免费播放| 678在线观看视频| 精品久久久久久久久久久| 日本丰满少妇xxxx| 最新欧美色图| 在线观看一区二区精品视频| 国产精品igao| 欧美久久久网站| 欧美一区二区三区在线看| 在线成人免费av| 日韩精品中文字幕吗一区二区| 欧美一区欧美二区| 伊人av在线播放| 欧美福利在线播放网址导航| 日韩国产一区三区| www.黄色在线| 欧美肥老太太性生活| 国产午夜精品一区二区三区| 手机av在线不卡| 伊人久久大香线| 国内自拍欧美激情| 久热这里只有精品6| 免费日韩av片| 成人精品久久av网站| 国产av精国产传媒| 99久久国产综合精品色伊| 日本精品一区二区三区高清 久久| 99中文字幕一区| 亚洲欧美激情小说另类| 免费成人午夜视频| 欧美日韩va| 亚洲а∨天堂久久精品喷水| 久久精品国产亚洲av麻豆| 欧美成免费一区二区视频| 欧美高清在线观看| 久草热在线观看| 国产成人免费在线视频| 蜜桃av久久久亚洲精品| 毛片在线看片| 粉嫩av一区二区三区免费野| 一道本在线免费视频| 风间由美性色一区二区三区四区 | 99riav国产| 9i在线看片成人免费| 欧美日韩国产三区| 国产网友自拍视频导航网站在线观看| 一区二区三区高清不卡| 日日噜噜夜夜狠狠| 亚洲欧洲国产精品一区| 亚洲午夜激情免费视频| 久久久久香蕉视频| 免费成人在线观看| 精品欧美一区二区在线观看视频| 五月天婷婷在线视频| 懂色av一区二区三区| 丁香婷婷激情网| 国产精品任我爽爆在线播放| 亚洲男人天堂古典| 欧美a级片免费看| 国产精品美女久久久浪潮软件| 91亚洲人电影| 国产1区2区3区在线| 精品成人在线视频| 成人做爰69片免费| 天天做天天爱天天综合网| 国产91露脸中文字幕在线| 欧美一级性视频| 亚洲男人都懂的| 性猛交ⅹ×××乱大交| 婷婷亚洲成人| 午夜精品一区二区三区在线| av一级黄色片| 国产精品久久久久久亚洲毛片 | 自拍偷拍亚洲欧美日韩| av片中文字幕| 偷窥自拍亚洲色图精选| 性色av一区二区三区免费| a级片在线免费看| 成人欧美一区二区三区黑人麻豆| 国产精品人人妻人人爽人人牛| 国产三级精品三级在线观看国产| 欧美乱大交xxxxx另类电影| 在线不卡免费视频| 久久理论电影网| 欧美在线观看www| 欧美一区二区三区红桃小说| 久久精品国产亚洲| 国产精品久久久久毛片| 中文字幕在线观看不卡| 亚洲18在线看污www麻豆| 日韩精品二区| 国产一区香蕉久久| 老司机在线永久免费观看| 色久综合一二码| 久久久久无码精品国产sm果冻| 日本女人一区二区三区| 免费国产一区二区| 欧洲一级精品| 中文字幕在线看视频国产欧美| 91丨九色丨海角社区| 国产精品水嫩水嫩| 午夜激情影院在线观看| 中文字幕一区二区三三| 高清视频一区| 人狥杂交一区欧美二区| 亚洲视频在线免费观看| 亚洲 欧美 日韩 在线| 日本一区二区三区在线不卡| av在线网址导航| 亚洲成人二区| 国产精品久久国产三级国电话系列| 丰乳肥臀在线| 亚洲成色777777女色窝| 波多野结衣网站| 中文字幕亚洲精品在线观看| 欧美高清精品一区二区| 在线看片日韩| 日韩精品另类天天更新| 视频在线亚洲| 911国产网站尤物在线观看| 男人天堂亚洲二区| 91国内精品野花午夜精品| 国产wwwwxxxx| 丁香啪啪综合成人亚洲小说| 亚洲中文字幕无码中文字| 波多野结衣一区| 91在线精品观看| 日本高清不卡一区二区三区视频| 久久午夜a级毛片| 免费观看黄色一级视频| 色av成人天堂桃色av| 国产喷水在线观看| 91伊人久久大香线蕉| 亚洲欧美日韩综合网| 伊人成人在线视频| 国语精品免费视频| 亚洲福利影视| 7m第一福利500精品视频| av在线第一页| 精品国产一区久久| 亚洲一区二区视频在线播放| 亚洲国产色一区| 久久久99999| 久久综合精品国产一区二区三区| 一级黄色片在线免费观看| 午夜一级久久| 欧美人与动牲交xxxxbbbb| 国产精品白丝av嫩草影院| 国产精品日韩av| 狠狠操一区二区三区| 亚洲欧美在线磁力| 亚洲精品.www| 久久综合九色欧美综合狠狠| wwwwwxxxx日本| 天使萌一区二区三区免费观看| 亚洲免费av网| 欧美日韩一二三四| 国产一区二区三区黄| 国产精品一区二区三区av| 日韩av成人在线| 17videosex性欧美| 91极品女神在线| 岛国av在线网站| 国产91精品高潮白浆喷水| www555久久| 午夜精品福利电影| 激情黄产视频在线免费观看| 午夜伦理精品一区| 黄在线观看免费网站ktv| 51ⅴ精品国产91久久久久久| 国产夫妻在线| 欧美亚洲成人xxx| 伊人久久视频| 国产91在线高潮白浆在线观看| 亚洲最大网站| 国产精品免费一区二区三区都可以 | 男人添女人下面高潮视频| 日韩视频中文| 日本在线视频www| 青娱乐精品视频| 天堂中文av在线| 国产在线视频精品一区| 免费在线观看日韩av| 99免费精品在线观看| 爱爱的免费视频| 国产目拍亚洲精品99久久精品| 三区四区在线观看| 自拍偷自拍亚洲精品播放| 麻豆chinese极品少妇| 精品人伦一区二区三区蜜桃免费| 国产精品男女视频| 欧美特级限制片免费在线观看| 伊人免费在线观看| 日韩三级中文字幕| 亚洲欧洲成人在线| 色噜噜狠狠狠综合曰曰曰88av| 99视频免费在线观看| 性色av一区二区咪爱| 成人视屏在线观看| 97超级碰碰| 深夜福利久久| 黄色免费高清视频| 一本久道久久久| 中文字幕av不卡在线| 国产成人福利片| 舐め犯し波多野结衣在线观看| 国产精品国产三级国产普通话99 | 欧美怡红院视频| 国产v片在线观看| 日韩精品在线私人| 超碰个人在线| 欧美自拍视频在线观看| 日韩在线激情| 裸模一区二区三区免费| 99久久综合| 欧美极品欧美精品欧美图片| 美女脱光内衣内裤视频久久网站 | 中文字幕av资源一区| 久草视频免费在线播放| 在线观看一区日韩| 天堂网在线资源| 美女久久久久久久| 亚洲www.| 国产富婆一区二区三区| 色88久久久久高潮综合影院| 人妻无码久久一区二区三区免费 | 国产精品视频xxx| 精品国产一区二区三区成人影院 | 日韩午夜在线观看| av福利在线播放| 欧美一级片在线播放| 狂野欧美xxxx韩国少妇| 日韩亚洲不卡在线| 99亚洲一区二区| 国产大学生av| 亚洲视频在线一区观看| 黄色污污网站在线观看| 亚洲国产精品一区二区久| av电影免费在线观看| 国产精品视频26uuu| 免费国产自久久久久三四区久久| 大荫蒂性生交片| 国精产品一区一区三区mba视频| 欧洲美一区二区三区亚洲| 亚洲va韩国va欧美va| 99久久免费国产精精品| 中文字幕亚洲第一| 成人日韩在线观看| 欧美动漫一区二区| 国产婷婷精品| 一出一进一爽一粗一大视频| 亚洲一区二区四区蜜桃| 国产亲伦免费视频播放| 精品国产一区二区三区久久久| 欧美日韩精品一区二区三区视频| 久久国产精品高清| 亚洲精选一区| 久久国产精品无码一级毛片| 亚洲高清免费观看高清完整版在线观看| 97在线播放免费观看| 色婷婷综合久久久久| 日韩电影精品| 一本色道久久综合亚洲二区三区| 日本不卡一二三区黄网| 怡红院一区二区三区| 91黄色免费版| 91av资源在线| 91精品久久久久久久久久久| 久久高清精品| av在线免费看片| 亚洲蜜臀av乱码久久精品 | 精品国产黄a∨片高清在线| 欧洲在线视频一区| 日韩二区三区在线观看| 日本一卡二卡在线播放| 欧美美女喷水视频| av片在线观看网站| 国产精品区免费视频| 亚洲一区激情| 国产av自拍一区| 欧美性三三影院| 免费高清在线观看| 亚洲一区中文字幕在线观看| 红桃视频国产精品| 最近中文字幕无免费| 91精品福利在线| 日本在线视频网| 97netav| 99精品视频免费| 538精品视频| 日韩视频免费观看高清完整版 | 欧美影院一区二区三区| 日本在线观看网站| 波多野结衣久草一区| 亚洲欧美日韩一区在线观看| 99久久久无码国产精品衣服| 欧美日韩高清一区二区不卡| av网站导航在线观看免费| 精品久久蜜桃| 久久精品国产99国产精品| 久久精品一级片| 国产亚洲a∨片在线观看| 国产一区2区在线观看| 亚洲 欧美 日韩 国产综合 在线| 国产亚洲综合在线| 99精品免费观看| 欧美中文字幕第一页| 午夜影院欧美| 激情综合丁香五月| 91精品欧美综合在线观看最新| 福利写真视频网站在线| 亚洲欧美日韩国产yyy| 福利一区在线观看| 国产精品51麻豆cm传媒 | 中文字幕久精品免| av中文字幕在线不卡| 一区二区视频网站| 午夜精品美女自拍福到在线| 欧美岛国激情| 中文字幕免费视频| 亚洲国产精品字幕| 成人亚洲精品|