溫馨提示×

溫馨提示×

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

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

mysql auto_increment鎖帶來的表鎖舉例分析

發(fā)布時間:2021-11-18 16:04:56 來源:億速云 閱讀:243 作者:iii 欄目:MySQL數(shù)據(jù)庫

這篇文章主要介紹“mysql auto_increment鎖帶來的表鎖舉例分析”,在日常操作中,相信很多人在mysql auto_increment鎖帶來的表鎖舉例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”mysql auto_increment鎖帶來的表鎖舉例分析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

案例描述:
線上一張表有大概2億條,50個G左右大小的數(shù)據(jù),業(yè)務進行重新規(guī)劃,需要將絕大部分數(shù)據(jù)進行歷史歸檔.當時為了方便,就新建一張相同結構的表,然后快速的rename成線上表,然后將備份表需要導入到線上表的數(shù)據(jù)進行insert into select操作.結果,線上表產(chǎn)生表鎖,業(yè)務全部堵住,發(fā)現(xiàn)情況時,已經(jīng)沒辦法撤銷insert操作(因為已經(jīng)插入很多了.在回滾,估計代價更高),所以就只有坐等insert完畢了.
create table new_table like old_table;   --創(chuàng)建一個跟線上表結構一樣的新表;
alter table new_table auto_increment=xxxx  --將新表的自增值設大一些,目的是為了跟老表數(shù)據(jù)留下空間和區(qū)別;
rename table old_tale to old_table_bak;
renmae table new_table to online_table;
-- 這兩行一起執(zhí)行,減小切換表的時間,盡量減小對線上數(shù)據(jù)的影響;
insert into online_table select * from old_table_bak where xxxxxxx; --將歷史表中需要的數(shù)據(jù)導入新表;

案例分析:
也算是自己麻痹大意了,以為innodb的insert只會加行級鎖,沒考慮到auto_increment的自增鎖.產(chǎn)生了表鎖,影響了整個業(yè)務.

下面分享下auto_increment自增鎖的一些信息.
講自增鎖,就講一下innodb_autoinc_lock_mode參數(shù):
 在mysql5.1.22之前,mysql的“INSERT-like”語句(包INSERT, INSERT…SELECT, REPLACE,REPLACE…SELECT, and LOAD DATA)會在執(zhí)行整個語句的過程中使用一個AUTO-INC鎖將表鎖住,直到整個語句結束(而不是事務結束)。
 因此在使用INSERT…SELECT、INSERT…values(…),values(…)時,LOAD DATA等耗費時間較長的操作時,會將整個表鎖住,而阻塞其他的“INSERT-like”、Update等語句,推薦使用程序將這些語句分成多條語句,一一插入,減少單一時間的鎖表時間。
 mysql5.1.22之后mysql進行了改進,引入了參數(shù) innodb_autoinc_lock_mode,通過這個參數(shù)控制mysql的鎖表邏輯。
 在介紹這個之前先引入幾個術語,方便說明 innodb_autoinc_lock_mode。
 1.“INSERT-like”:
 INSERT, INSERT … SELECT, REPLACE, REPLACE … SELECT, and LOAD DATA, INSERT … VALUES(),VALUES()
 2.“Simple inserts”:
 就是通過分析insert語句可以確定插入數(shù)量的insert語句, INSERT, INSERT … VALUES(),VALUES()
 3.“Bulk inserts”:
 就是通過分析insert語句不能確定插入數(shù)量的insert語句, INSERT … SELECT, REPLACE … SELECT, LOAD DATA
 4.“Mixed-mode inserts”:
 不確定是否需要分配auto_increment id,一般是下面兩種情況
 INSERT INTO t1 (c1,c2) VALUES (1,’a'), (NULL,’b'), (5,’c'), (NULL,’d');
 INSERT … ON DUPLICATE KEY UPDATE

一、innodb_autoinc_lock_mode = 0 (“traditional” lock mod,傳統(tǒng)模式)。
 這種方式就和mysql5.1.22以前一樣,為了向后兼容而保留了這種模式,如同前面介紹的一樣,這種方式的特點就是“表級鎖定”,并發(fā)性較差。
 二、innodb_autoinc_lock_mode = 1 (“consecutive” lock mode,連續(xù)模式)。
 這種方式是新版本中的默認方式,推薦使用,并發(fā)性相對較高,特點是“consecutive”,即保證同一條insert語句中新插入的auto_increment id都是連續(xù)的。
 這種模式下:
 “Simple inserts”:直接通過分析語句,獲得要插入的數(shù)量,然后一次性分配足夠的auto_increment id,只會將整個分配的過程鎖住。
 “Bulk inserts”:因為不能確定插入的數(shù)量,因此使用和以前的模式相同的表級鎖定。
 “Mixed-mode inserts”:直接分析語句,獲得最壞情況下需要插入的數(shù)量,然后一次性分配足夠的auto_increment id,只會將整個分配的過程鎖住。
 需要注意的是,這種方式下,會分配過多的id,而導致“浪費”。
 比如INSERT INTO t1 (c1,c2) VALUES (1,’a'), (NULL,’b'), (5,’c'), (NULL,’d');會一次性的分配5個id,而不管用戶是否指定了部分id;
 INSERT … ON DUPLICATE KEY UPDATE一次性分配,而不管將來插入過程中是否會因為duplicate key而僅僅執(zhí)行update操作。
 注意:當master mysql版本<5.1.22,slave mysql版本>=5.1.22時,slave需要將innodb_autoinc_lock_mode設置為0,因為默認的innodb_autoinc_lock_mode為1,對于INSERT … ON DUPLICATE KEY UPDATE和INSERT INTO t1 (c1,c2) VALUES (1,’a'), (NULL,’b'), (5,’c'), (NULL,’d');的執(zhí)行結果不同,現(xiàn)實環(huán)境一般會使用INSERT … ON DUPLICATE KEY UPDATE。
 三、innodb_autoinc_lock_mode = 2 (“interleaved” lock mode,交叉模式)。
 這種模式是來一個分配一個,而不會鎖表,只會鎖住分配id的過程,和innodb_autoinc_lock_mode = 1的區(qū)別在于,不會預分配多個,這種方式并發(fā)性最高。
 但是在replication中當binlog_format為statement-based時(簡稱SBR statement-based replication)存在問題,因為是來一個分配一個,這樣當并發(fā)執(zhí)行時,“Bulk inserts”在分配的時會同時向其他的INSERT分配,會出現(xiàn)主從不一致(從庫執(zhí)行結果和主庫執(zhí)行結果不一樣),因為binlog只會記錄開始的insert id。
 測試SBR,執(zhí)行begin;insert values(),();insert values(),();commit;會在binlog中每條insert values(),();前增加SET INSERT_ID=18/*!*/;。
 但是row-based replication RBR時不會存在問題。
 另外RBR的主要缺點是日志數(shù)量在包括語句中包含大量的update delete(update多條語句,delete多條語句)時,日志會比SBR大很多;假如實際語句中這樣語句不是很多的時候(現(xiàn)實中存在很多這樣的情況),推薦使用RBR配合innodb_autoinc_lock_mode,不過話說回來,現(xiàn)實生產(chǎn)中“Bulk inserts”本來就很少,因此innodb_autoinc_lock_mode = 1應該是夠用了。

到此,關于“mysql auto_increment鎖帶來的表鎖舉例分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

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

AI