成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

由FTWRL導致的MySQL從庫死鎖分析及參數深究

瀏覽:2日期:2023-10-16 13:29:46

最近線上執行備份的從庫時出現復制卡死現象,分析以后發現是兩個死鎖,show full processlist的狀態如圖1所示,其中,數據庫版本是官方5.7.18版本,我們內部做了些許修改,但與此次死鎖無關。

由FTWRL導致的MySQL從庫死鎖分析及參數深究

圖一

先說一下結論,圖一中:

162線程是執行innobackup執行的flush tables with read lock; 144是SQL線程,并行復制中的Coordinator線程; 145/146是并行復制的worker線程,145/146worker線程隊列中的事務可以并行執行。

144Coordinator線程分發relaylog中事務時發現這個事務不能執行,要等待前面的事務完成提交,所以處于waiting for dependent transaction to commit的狀態。145/146線程和備份線程162形成死鎖,145線程等待162線程 global read lock 釋放,162線程占有MDL::global read lock 全局讀鎖,申請全局commit lock的時候阻塞等待146線程,146線程占有MDL:: commit lock,因為從庫設置slave_preserve_commit_order=1,保證從庫binlog提交順序,而146線程執行事務對應的binlog靠后面,所以等待145的事務提交。最終形成了145->162->146->145的死循環,形成死鎖。

同樣的,圖二中:

183是備份程序執行的flush tables with read lock; 165是SQL線程,并行復制的Coordinator線程; 166/167是并行復制的worker線程。

由FTWRL導致的MySQL從庫死鎖分析及參數深究

圖二

165Coordinator線程分發的事務還不能執行,進入waiting for dependent transaction to commit的狀態,183、166、167三個線程形成死鎖,183占有全局讀鎖,獲取全局commit鎖的時候進入阻塞,等待167釋放事務涉及到表的commit鎖;166,167的事務可以并行復制,167占有表級commit鎖,但是事務對應的binlog在后面,阻塞等待166先提交進入waiting for preceding transaction to commit的狀態;166線程事務執行時提交要獲得表級commit鎖,但已經被183占有,所以阻塞等待。這樣形成了183->167->166->183的死鎖。

三個線程相互形成死鎖,在我的經驗中還是很少見的,又因為涉及的MDL鎖是服務層的鎖,死鎖檢測也不會起作用。

死鎖原因分析

1、MDL鎖

參考:http://mysql.taobao.org/monthly/2015/11/04/

2、flush tables with read lock獲取兩個鎖

MDL::global read lock 和MDL::global commit lock,而且是顯示的MDL_SHARED鎖。

//Global_read_lock::lock_global_read_lock MDL_REQUEST_INIT(&mdl_request,MDL_key::GLOBAL, '', '', MDL_SHARED, MDL_EXPLICIT); //Global_read_lock::make_global_read_lock_block_commit MDL_REQUEST_INIT(&mdl_request,MDL_key::COMMIT, '', '', MDL_SHARED, MDL_EXPLICIT);

3、事務執行中涉及兩個鎖

在所有更新數據的代碼路徑里,除了必須的鎖外,還會額外請求MDL_key::GLOBAL鎖的MDL_INTENTION_EXCLUSIVE鎖;在事務提交前,會先請求MDL_key::COMMIT鎖的MDL_INTENTION_EXCLUSIVE鎖。對于scope鎖來說,IX鎖和S鎖是不兼容的。

4、--slave_preserve_commit_order

For multi-threaded slaves, enabling this variable ensures thattransactions are externalized on theslave in the same order as they appear in the slave’s relay log.

slave_preserve_commit_order=1時,relay-log中事務的提交順序會嚴格按照在relay-log中出現的順序提交。

所以,事務的執行和flush tables with read lock語句獲得兩個鎖都不是原子的,并行復制時模式下按以下的順序就會出現死鎖。

事務A、B可以并行復制,relay-log中A在前,slave_preserve_commit_order=1 從庫回放時B事務執行較快,先執行到commit,獲得commit鎖,并進入waiting for preceding transaction to commit的狀態 執行flush tables with read lock,進入waiting for commit的狀態 事務A執行。事務A如果在FTWRL語句獲得global read lock鎖之后執行,那么事務A就進入waiting for global read lock的狀態,即第一種死鎖;如果事務A在FTWRL獲得global read lock之前執行,同時FTWRL獲得global commit鎖之后應用Xid_event提交事務,則進入 waiting for the commit lock的狀態,即第二種死鎖。

復現

理解了死鎖出現的原因后,重現就簡單多了。重現這個死鎖步驟主要是2步:

1、在主庫構造并行復制的事務,利用debug_sync

session 1 SET DEBUG_SYNC=’waiting_in_the_middle_of_flush_stage SIGNAL s1 WAIT_FOR f’; insert into test.test values(13);//事務A //session 2 SET DEBUG_SYNC= ’now WAIT_FOR s1’; SET DEBUG_SYNC= ’bgc_after_enrolling_for_flush_stage SIGNAL f’; insert into test.test values(16);//事務B

2、從庫執行,修改源代碼,在關鍵地方sleep若干時間,控制并行復制的worker的執行并留出足夠時間執行flush tables with read lock

修改點如下:

//Xid_apply_log_event::do_apply_event_worker if(w->id==0) { std::cout<<'before commit'<<std::endl; sleep(20); } //pop_jobs_item if(worker->id==0) sleep(20);

開啟slave以后,觀察show full processlist和輸出日志,在其中一個worker出現wait for preceding transaction to commit以后,執行 ftwrl,出現圖1的死鎖;wait for preceding transaction to commit以后,出現日志before commit之后,執行 ftwrl,出現圖2的死鎖。

如何解決?

出現死鎖以后如果不人工干預,IO線程正常,但是SQL線程一直卡住,一般需要等待lock-wait-timeout時間,這個值我們線上設置1800秒,所以這個死鎖會產生很大影響。

那么如何解決呢?kill !kill哪個線程呢?

對圖1的死鎖,146處于wait for preceding transaction狀態的worker線程實際處于mysql_cond_wait的狀態,kill不起作用,所以只能kill 145線程或者備份線程,如果kill145worker線程,整個并行復制就報錯結束,show slave status顯示SQL異常退出,之后需要手動重新開啟sql線程,所以最好的辦法就是kill執行flush tables with read lock的線程,代價最小。 至于圖2的死鎖,則只能kill掉執行flush tables with read lock的線程。所以出現上述死鎖時,kill執行flush tables with read lock的備份線程就恢復正常,之后擇機重新執行備份即可。

如何避免?

設置xtrabackup的kill-long-queries-timeout參數可以避免第一種死鎖的出現,其實不算避免,只是出現以后xtrabackup會殺掉阻塞的執行語句的線程;但是這個參數對第二種死鎖狀態則無能為力了,因為xtrabackup選擇殺掉的線程時,會過濾Info!=NULL。

另外還有個參數safe-slave-backup,執行備份的時候加上這個參數會停掉SQL線程,這樣也肯定不會出現這個死鎖,只是停掉SQL未免太暴力了,個人不提倡這樣做。

可以設置slave_preserve_commit_order=0關閉從庫binlog的順序提交,關閉這個參數只是影響并行復制的事務在從庫的提交順序,對最終的數據一致性并無影響,所以如果無特別要求從庫的binlog順序必須與主庫保持一致,可以設置slave_preserve_commit_order=0避免這個死鎖的出現。

關于xtrabackup kill-long-query-type參數

首先說下```kill-long-queries-timeout,kill-long-query-type```參數,文檔介紹如下

--KILL-LONG-QUERY-TYPE=ALL|SELECT This option specifies which types of queries should be killed tounblock the global lock. Default is “all”. --KILL-LONG-QUERIES-TIMEOUT=SECONDS** This option specifies the number of seconds innobackupex waitsbetween starting FLUSH TABLES WITH READ LOCK and killing those queriesthat block it. Default is 0 seconds, which means innobackupex will notattempt to kill any queries. In order to use this option xtrabackupuser should have PROCESS and SUPER privileges.Where supported (PerconaServer 5.6+) xtrabackup will automatically use Backup Locks as alightweight alternative to FLUSH TABLES WITH READ LOCK to copy non- InnoDB data to avoid blocking DML queries that modify InnoDB tables.

參數的作用的就是在Xtrabackup執行FLUSH TABLES WITH READ LOCK以后,獲得全局讀鎖時,如果有正在執行的事務會阻塞等待,kill-long-queries-timeout參數不為0時,xtrabackup內部創建一個線程,連接到數據庫執行show full processlist,如果TIME超過kill-long-queries-timeout,會kill掉線程,kill-long-query-type設置可以kill掉的SQL類型。

官方文檔介紹kill-long-query-type默認值時all,也就是所有語句都會kill掉。但在使用中發現,只設置kill-long-queries-timeout,未設置kill-long-query-type時,參數沒起作用!最后查閱xtrabackup代碼,如下:

{'kill-long-query-type', OPT_KILL_LONG_QUERY_TYPE, 'This option specifies which types of queries should be killed to ' 'unblock the global lock. Default is 'all'.', (uchar*) &opt_ibx_kill_long_query_type, (uchar*) &opt_ibx_kill_long_query_type, &query_type_typelib, GET_ENUM, REQUIRED_ARG, QUERY_TYPE_SELECT, 0, 0, 0, 0, 0}

心中一萬頭草泥馬,也許只是筆誤,但也太坑爹了!所以使用kill-long-query-type時一定要自己指定好類型!

總結

回顧這次執行備份的從庫復制卡死故障,根本原因在于flush tables with read lock語句和事務執行的過程都涉及到連個鎖,而且不是原子的,再加上并行復制以及設置了從庫binlog的順序提交,最終導致三個線程形成死鎖。在尋找問題的解決方案中,意外發現了Xtrabackup kill-long-query-type的“秘密”,告誡我們在使用中盡量顯示指定參數,一方面更準確,另一方面也便于查看。

另外,我們知道set global read_only=1語句執行中涉及到的鎖和flush tables with read lock涉及的鎖時一樣的,也是兩個MDL鎖,所以理論上在并行復制的從庫執行set global read_only=1語句也可能會出現上述的兩個死鎖,有興趣的可以驗證下。

來自:http://database.51cto.com/art/201801/562689.htm

標簽: MySQL 數據庫
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲最新在线| 亚洲一级在线| 亚洲欧美日韩国产| 国产精品理论片在线观看| 国产成人一级电影| 欧美亚洲免费在线一区| 日韩激情一区二区| 欧美亚洲网站| 亚洲第一福利一区| 国产精品久久777777毛茸茸| 亚洲欧美日韩一区二区| 一区二区亚洲| 最新久久zyz资源站| 成人教育av在线| 欧美久久高跟鞋激| 黄色成人免费在线| 69堂成人精品免费视频| 国产伦精品一区二区三区视频青涩| 日本电影欧美片| 日本sm残虐另类| 欧美色大人视频| 精品一区中文字幕| 欧美日韩国产一级片| 精品一区二区三区欧美| 欧美日韩性生活| 国产在线精品视频| 91麻豆精品国产91久久久 | 日本精品一区二区三区高清 | 久久综合网色—综合色88| 成人毛片老司机大片| 欧美成人综合网站| 国产麻豆一精品一av一免费| 欧美一区二区视频在线观看2022 | 久久综合久久久| 视频一区二区三区在线| 久久亚洲综合| 日本欧美一区二区三区| 欧美视频一区在线| 精品一区二区三区欧美| 欧美一区二区三区系列电影| 九九九精品视频| 亚洲精品美女久久7777777| 亚洲精品国产第一综合99久久| 欧美激情1区2区| 亚洲国产精品成人久久综合一区 | 一区在线观看视频| 狠狠久久婷婷| 中文字幕佐山爱一区二区免费| 亚洲国产午夜| 午夜精品视频在线观看| 色呦呦国产精品| 免费国产亚洲视频| 91精品麻豆日日躁夜夜躁| 国产成人av福利| www激情久久| 亚洲激情av| 午夜精品久久久久久久 | 欧美综合一区二区| 久久国产欧美日韩精品| 欧美巨大另类极品videosbest| 国产露脸91国语对白| 日韩一级大片在线观看| 99精品黄色片免费大全| 久久久99久久精品欧美| 91色.com| 国产精品久久久久桃色tv| 韩日精品视频| 亚洲裸体在线观看| 久久精品日产第一区二区三区| 日韩精品一二三四| 欧美艳星brazzers| 国产精品1区2区| 久久久久久久久久久久久夜| 欧美成人一区二区在线| 国产欧美综合在线观看第十页| 国一区二区在线观看| 亚洲综合精品久久| 91国模大尺度私拍在线视频| 九九国产精品视频| 精品91自产拍在线观看一区| 午夜激情一区| 亚洲一区二区在线免费观看视频| 色狠狠一区二区三区香蕉| 国产一区二区三区在线观看免费| 精品免费国产一区二区三区四区| 欧美精品偷拍| 亚洲精品va在线观看| 在线精品视频一区二区| 国产精品亚洲人在线观看| 26uuu精品一区二区在线观看| 国产自产在线视频一区| 亚洲不卡一区二区三区| 夜夜嗨一区二区三区| 日本美女一区二区三区| 欧美一二三区在线观看| 欧美片第1页综合| 美女精品自拍一二三四| 久久网站热最新地址| 久久久久久穴| 国产高清不卡一区二区| 欧美国产成人在线| 久久久国产精品一区二区三区| 国产精品88888| 亚洲欧洲国产日本综合| 五月天视频一区| 欧美美女喷水视频| 欧美人成在线| 日韩电影在线一区| 久久久久久久综合狠狠综合| 国产日韩欧美一区在线| 国产一区二区美女| 欧美激情四色| 蜜桃视频一区二区三区在线观看| 日韩一区二区三区视频在线观看| 伊人蜜桃色噜噜激情综合| 男男gaygay亚洲| 国产三级一区二区三区| 久久精品道一区二区三区| 成人污污视频在线观看| 亚洲精品欧美激情| 欧美日韩免费观看一区二区三区| 91猫先生在线| 婷婷中文字幕综合| 久久久av毛片精品| 欧美午夜精品久久久久久超碰| 午夜天堂精品久久久久| 蜜臀av国产精品久久久久| 欧美韩日一区二区三区| 日本韩国视频一区二区| 91论坛在线播放| 日本91福利区| 亚洲国产精品成人综合| 欧美视频一区二区在线观看| 欧美日韩精品免费看| 免费欧美在线视频| 久久影院视频免费| 一本一道久久a久久精品综合蜜臀| 91亚洲永久精品| 五月天丁香久久| 国产欧美日韩在线视频| 欧美日韩精品一区二区三区| 日韩亚洲视频| 99久久精品一区二区| 久久99日本精品| 一区二区三区在线视频免费| 精品欧美一区二区在线观看| 一本大道久久a久久综合| 欧美在线免费一级片| 久久69国产一区二区蜜臀| 成人免费一区二区三区在线观看| 欧美日高清视频| 国产精品乱码| 欧美国产高清| 国产精品一区二区免费不卡 | 在线亚洲一区二区| 亚洲国产一区二区三区a毛片| 高清av一区二区| 免费人成精品欧美精品| 国产精品久久久久久久久果冻传媒 | 丁香另类激情小说| 天堂在线一区二区| 亚洲色图另类专区| 一本到不卡免费一区二区| 国产一区二区三区| 日本成人中文字幕在线视频| 亚洲欧美色图小说| 欧美激情综合五月色丁香小说| 欧美一区二区精美| 欧美主播一区二区三区美女| 日韩视频在线观看国产| 欧美在线播放| 国产成人精品一区二区三区四区| 日韩va欧美va亚洲va久久| 伊人婷婷欧美激情| 欧美国产综合色视频| 日韩欧美国产一区二区在线播放 | 国产精品一色哟哟哟| 免费人成在线不卡| 亚洲mv在线观看| 亚洲精品成人悠悠色影视| 国产婷婷色一区二区三区在线| 日韩一级欧美一级| 在线精品视频小说1| 国产女主播一区二区三区| 亚洲国产精品一区| 欧美久久综合| 欧美91视频| 99久久综合99久久综合网站| 国产成人日日夜夜| 精品在线亚洲视频| 蜜桃视频免费观看一区| 亚洲va韩国va欧美va| 亚洲国产美女搞黄色| 亚洲一二三四久久| 尤物视频一区二区| 亚洲欧美激情一区二区| 综合av第一页| 国产精品成人一区二区艾草| 久久午夜色播影院免费高清| 精品三级在线看|