精品欧美一区二区三区在线观看 _久久久久国色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电影在线观看| 亚洲深夜福利网站| 东北少妇不带套对白| 蜜桃久久一区二区三区| 一本色道久久综合亚洲精品不卡 | 一区中文字幕| 午夜精品久久久久久| 美女精品国产| 国产露脸无套对白在线播放| 亚洲大胆在线| yellow中文字幕久久| 91视频在线免费| 久久av影院| 精品久久久久久久久久久| 一区二区免费在线观看| 日韩一级在线播放| 久久99精品久久久久久| 51精品在线观看| 欧美一级特黄高清视频| 全球av集中精品导航福利| 欧美日韩三级在线| 国产片侵犯亲女视频播放| jzzjzzjzz亚洲成熟少妇| 国产成人8x视频一区二区 | 青青青在线观看视频| 97人人在线| www.在线欧美| 91免费的视频在线播放| 香蕉污视频在线观看| 国产综合精品一区| 久久精品一区中文字幕| 亚洲综合欧美综合| 日韩伦理一区二区三区| 日韩女优av电影| 久国产精品视频| 欧美va视频| 精品日本高清在线播放| 日本老太婆做爰视频| 日本中文字幕在线视频| 2021中文字幕一区亚洲| 国产不卡一区二区在线观看| 国产人妖一区二区三区| 久久99精品一区二区三区三区| 日本中文字幕久久看| 免费毛片一区二区三区| 国产一区日韩一区| 欧美日韩成人在线播放| 婷婷在线精品视频| 中文字幕一区二区三三| y97精品国产97久久久久久| www.com.av| 99久久.com| 日韩亚洲一区二区| 中文乱码字幕高清一区二区| 色婷婷一区二区三区| 一色桃子一区二区| 亚洲一区 欧美| 日韩中文字幕高清在线观看| 国产一区二区三区精品久久久| 亚洲a v网站| jvid福利在线一区二区| 在线播放日韩欧美| 成人信息集中地| 亚洲精品成人无限看| 久久福利视频网| 久久久美女视频| 国产日韩1区| 日韩av电影在线网| 中文字幕视频在线播放| 韩国精品久久久| 亚洲精品日产aⅴ| 午夜精品久久久久久久第一页按摩| 国产精品白丝jk黑袜喷水| 高清国语自产拍免费一区二区三区| 欧美视频一二区| 91网上在线视频| 五月婷婷综合色| 自拍亚洲图区| 午夜av区久久| 成年人在线观看视频免费| 日本电影久久久| 欧美大片日本大片免费观看| xxxx黄色片| 欧洲乱码伦视频免费| 久久久精品久久久| 日韩精品人妻中文字幕| 日韩黄色免费网站| 91色视频在线导航| 婷婷色在线视频| 久久精品视频一区二区三区| 色一情一区二区三区四区 | 成人久久精品人妻一区二区三区| 99视频超级精品| 亚洲精品久久久久久一区二区| 国产激情视频在线观看| 婷婷综合五月天| 在线观看av网页| 中文字幕一区日韩精品 | ass精品国模裸体欣赏pics| 成人激情免费视频| 欧美激情第6页| 91丨九色丨海角社区| 国产 日韩 欧美大片| 欧美日韩免费高清| 日韩成人伦理| 欧美亚洲国产一卡| 国产人妻黑人一区二区三区| 成人同人动漫免费观看 | 国产成人免费在线| 欧美一区二视频在线免费观看| gogo在线高清视频| 91久久精品午夜一区二区| 美女又黄又免费的视频| 成人羞羞在线观看网站| 97视频在线免费观看| 国产模特av私拍大尺度 | 性生交大片免费全黄| 亚洲永久在线| 国产91视觉| 国产网站在线免费观看| 在线免费观看成人短视频| 久久久高清视频| 婷婷综合五月| 国产精品入口免费视频一| 视频污在线观看| 一卡二卡三卡日韩欧美| 在线免费观看av网| 不卡在线一区二区| 国产精品成av人在线视午夜片| 亚洲精品成人电影| 亚洲欧美日韩系列| 日本中文字幕精品—区二区| 国产99精品| 欧洲永久精品大片ww免费漫画| 亚洲h视频在线观看| 亚洲人成影院在线观看| 手机看片一级片| 成人亚洲一区二区| 国产精品黄视频| 国内在线精品| 色噜噜狠狠色综合中国| 全黄一级裸体片| 久久久国产亚洲精品| 精品无人区一区二区三区竹菊| 福利写真视频网站在线| 日韩欧美一区中文| 538精品在线观看| 国产一区在线精品| 久久天天东北熟女毛茸茸| **国产精品| 色综合老司机第九色激情 | 成人做爰视频www网站小优视频| 亚洲国产精品悠悠久久琪琪| 久久免费公开视频| 成人精品视频一区二区三区尤物| 999一区二区三区| 国产一区二区三区亚洲| 97视频色精品| 免费一级在线观看播放网址| 欧美午夜视频一区二区| 公侵犯人妻一区二区三区| 视频一区二区三区中文字幕| 日本在线观看一区| 玖玖精品在线| 欧美成aaa人片免费看| www.热久久| 亚洲成人福利片| 黄色正能量网站| 男女激情视频一区| 一本二本三本亚洲码| 色妞ww精品视频7777| 91精品国产91久久久| 黄色av免费在线观看| 欧美日韩黄色一区二区| 99久久婷婷国产综合| 成人sese在线| 天堂…中文在线最新版在线| 国产精品亚洲人成在99www| 国产综合在线观看视频| 国内在线视频| 亚洲精品一区二区网址| 国产一区二区在线播放视频| 亚洲一区二区影院| 超碰97人人干| 激情综合色播激情啊| 人妻夜夜添夜夜无码av | 欧美 国产 精品| 免费成人蒂法| 国产欧美一区二区| a'aaa级片在线观看| 亚洲欧美视频在线| 国产免费黄色大片| 色婷婷久久久综合中文字幕 | 男同在线观看| 69堂成人精品免费视频| 久草国产精品视频| 国产精品久久免费看| 麻豆精品国产传媒av| 久久99久久99| 日本不卡在线观看视频| 一本一道久久a久久精品蜜桃| 久久久精品动漫| 国产精品国产亚洲精品| 日韩美女在线观看| 欧美色图天堂| 久久久精品电影| 欧美成人综合在线| 欧美不卡在线视频| 伊人网中文字幕| 欧美日韩在线看| 免费在线视频观看| 综合久久久久久久| a级大片在线观看| 成人国产亚洲欧美成人综合网 | 国产亚洲欧美日韩美女| 欧美 日韩 国产 在线| 91麻豆精品国产91久久久久| 日韩黄色一级视频| 精品国产乱码久久久久酒店| 欧美偷拍第一页| 国产精品理论片| 亚洲午夜精品久久久久久高潮| 成人h动漫精品一区二| 亚洲欧美激情一区二区三区| 欧美aa在线视频| 国产淫片av片久久久久久| 亚洲午夜极品| 亚洲天堂第一区| 99re久久最新地址获取| 欧美一区二区三区在线播放| 欧美男男freegayvideosroom| 亚洲最大的av网站| 在线播放成人| 国产主播欧美精品| 亚洲日本免费电影| 国产免费观看久久黄| 粉嫩av一区二区三区四区五区| 国产91色在线免费| 惠美惠精品网| 日本精品久久中文字幕佐佐木| 91av久久| 欧美一级片久久久久久久| 老司机深夜福利在线观看| 国精产品一区一区三区有限在线| av福利在线导航| 97人洗澡人人免费公开视频碰碰碰| 欧美草逼视频| 欧美激情免费在线| 99在线视频影院| 久久男人的天堂| 国产美女高潮在线| 51色欧美片视频在线观看| 亚洲美女久久精品| 国产成人精品日本亚洲| 欧美国产日韩电影| 国产日韩av高清| 成人乱码手机视频| 99视频国产精品免费观看| 一区二区三区四区高清视频| 国产在线精品一区二区三区》| 任你弄精品视频免费观看| 欧美1o一11sex性hdhd| 免费精品国产| 夜夜爽99久久国产综合精品女不卡 | 91久久国产自产拍夜夜嗨| 91精品尤物| 欧美lavv| 婷婷成人基地| 91精品国产91久久久久麻豆 主演| 国产手机视频一区二区| 三年中国国语在线播放免费| 麻豆精品视频在线| 日批视频在线看| 99re热视频这里只精品| 成人免费无遮挡无码黄漫视频| 中文字幕一区二区在线播放| 麻豆精品一区二区三区视频| 亚洲高清视频的网址| 国产精品21p| 欧美日韩高清一区| 国产 日韩 欧美 精品| 精品视频偷偷看在线观看| 99re热久久这里只有精品34| 精品自在线视频| 在线最新版中文在线| 国产精品视频网| 卡通动漫国产精品| 午夜精品亚洲一区二区三区嫩草 | 久久影院资源网| 激情aⅴ欧美一区二区欲海潮| 国产精品久久综合av爱欲tv| 亚洲乱码一区| 相泽南亚洲一区二区在线播放| 欧美激情视频一区二区三区在线播放 | 一区免费在线| 黄大色黄女片18第一次| 成人av电影免费在线播放| 美国美女黄色片| 亚洲第一激情av| 91精品国产乱码久久久| 日韩av在线不卡| 91在线中文| 国产精品高潮呻吟视频| a看欧美黄色女同性恋| 亚洲高清精品中出| 中文日韩欧美| 91性高潮久久久久久久| 久久久蜜桃精品| 久久亚洲AV无码| 欧美久久一区二区| 狠狠色伊人亚洲综合网站l| 久久久久一本一区二区青青蜜月| 欧美天堂一区二区| 麻豆av一区二区| 亚洲精品护士| 亚洲精品无码久久久久久久| 中日韩av电影| 国产视频1区2区| 日韩av在线看| 2018av在线| 91丝袜脚交足在线播放| 婷婷激情图片久久| 中文字幕第38页| 国产日产精品1区| av黄色在线播放| 日韩电影在线观看中文字幕 | 成人h猎奇视频网站| 免费av一区| 91视频最新入口| 波多野结衣中文一区| 久久久精品视频在线| 6080午夜不卡| 九七电影韩国女主播在线观看| 国产精品久久国产精品99gif| 欧美做受69| 欧美成人免费在线观看视频| 国产91丝袜在线18| 全网免费在线播放视频入口 | 91欧美国产| 日本xxxx黄色| 国产精品久久久久7777按摩| 久久久久亚洲视频| 在线亚洲男人天堂| 快播电影网址老女人久久| 久久人人97超碰人人澡爱香蕉| 亚洲日本视频| 中文字幕一区二区三区人妻| 一本到一区二区三区| 国产一区精品| 国产精品劲爆视频| 成人综合一区| 91福利免费观看| 亚洲精品视频在线看| 精品国产无码AV| 久久久久久久久久久国产| 豆花视频一区二区| 奇米精品一区二区三区| aa级大片欧美| 69亚洲精品久久久蜜桃小说| 亚洲少妇激情视频| 男人亚洲天堂| 人妻无码一区二区三区四区| 成人免费毛片高清视频| 国产超碰人人爽人人做人人爱| 亚洲欧美国产精品专区久久 | av不卡免费看| 熟女俱乐部一区二区视频在线| 欧美性做爰猛烈叫床潮| 哥也色在线视频| 国产一区自拍视频| 日日摸夜夜添夜夜添精品视频| 国精产品一区一区| 日韩精品一区二区三区在线观看 | 国产精品一区在线看| 成人福利免费观看| 亚洲大片在线| 久久视频精品在线观看| 日韩三区在线观看| 日本黄色免费在线| 亚洲韩国在线| 国产成人自拍网| 日韩精品久久久久久免费| 日韩中文字幕在线播放| 国产精品自在| 欧美日韩在线免费播放| 一区二区三区精品视频在线| 亚洲欧洲视频在线观看| 91精品久久久久久久久久久久久| 黄色日韩在线| 黄色av免费播放| 精品国产一区二区亚洲人成毛片| 中文另类视频| 国产成a人亚洲精v品在线观看| 国产女主播视频一区二区| www.综合色| 国产精品免费在线免费| 亚洲无吗在线| 日韩高清dvd碟片| 亚洲欧洲偷拍精品| 99re8这里有精品热视频免费|