天天看點

哈?一個事務裡出現2條insert?一、問題描述 二、擴充知識 三、思考

點選上方藍字每天學習資料庫

作者簡介:魯越,騰訊雲資料庫架構師,主要負責騰訊雲資料庫MySQL、Redis、MongoDB、Oracle等資料庫架構設計、資料庫運維、營運開發等工作,曾就職于網易遊戲。

問題描述

一、問題描述

1) 兩個RO同時複制異常,程式讀不到最新的資料。

2) 報錯資訊、資料庫版本5.6。嘗試執行了一下stop slave;start slave; 沒辦法快速恢複。

問題1:此時,如果是你,如何去處理這個case?

哈?一個事務裡出現2條insert?一、問題描述 二、擴充知識 三、思考

3)觀察了一下主庫的CPU、IO等狀态,先把讀寫流量都切到主庫。先恢複業務

4)通過遷移RO的方式來恢複RO與主執行個體的主從

5)同時通過報錯資訊,解析報錯對應的binlog位點,詳細分析1837報錯的原因。

5.1)發現報錯位點對應的事務為對同一張表進行的兩個insert操作,并無什麼異常。

哈?一個事務裡出現2條insert?一、問題描述 二、擴充知識 三、思考

5.2) 很自然的想到看看表結構,一看發現了怪異之處。

問題2:怪異之處在哪裡?

CREATE TABLE `log_online_players` (

`count` int(4) unsigned NOT NULL COMMENT '線上人數',

`time` int(4) NOT NULL COMMENT '時間',

KEY `NewIndex1` (`time`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin

5.3) Myisam這種非事務引擎,每一個DML操作都會被強制送出,也就是說,在這個case裡面,每一個insert操作應該對應binlog裡面的一個event。但是我們分析binlog的時候發現,一個event裡面出現了2條insert語句。這條binlog在備機回放的時候,SQL線程執行完這個event裡面的第一個insert語句以後就對整個事務送出了,這樣造成了上述的報錯。

5.4)報錯的原因找出來了,但是為什麼會出現這個問題呢?這個問題我非常的迷惑,現在核心的點就是為什麼在對Myisam引擎執行insert操作的時候,一個事務裡面會出現了2條insert。

5.5) 複現步驟

1# 複制庫表接口到測試環境

2# 模拟插入流量 insert_normal.sh,發現主從複制并沒有斷。分析了一下binlog,也是跟我所認知的情況一緻:在myisam引擎中,一個event裡面隻會存在一條insert,不可能出現一個event裡面有2條或者多條DML記錄的情況發生。

3# 我開始思考,有沒有可能是我測試的環境下并發不夠,有沒有可能是因為在高并發情況下MySQL的機制有bug。在把并發提高,測試執行個體的TPS量與故障執行個體TPS量基本一緻,甚至超過故障執行個體的情況下依然沒辦法複現。這個時候我陷入了瓶頸。

4# 這個時候,去主庫上開啟了Glog,執行了show processlist,發現真正執行的語句并不是insert into,而是insert delay into。在執行insert delay into語句的情況下,可能連續執行N個INSER操作,生成多個INSERT事件,而在生成GTID時,就隻對應一個event。明顯的,DELAYED文法生成了違反GTID限制的binlog。這個文法在GTID模式下應該是禁止。

5# 馬上去主庫上開了一下Glog,發現的确是執行的insert delay操作。整個case就真相大白了。

6# 自己做一次複現

擴充知識

二、擴充知識

1)針對GTID,官方主要有三個限制

  • CREATE TABLE ... SELECT statements
  • CREATE TEMPORARY TABLE statements inside transactions
  • Transactions or statements that update both transactional and nontransactional tables.

2)insert delay

 往資料庫裡插入資料的标準指令是INSERT,而DELAYED的意思,則是異步插入。也就是說,MySQL接受這個指令後,儲存指令就直接傳回給用戶端,是以使用者會發現在某些場景下INSERT DELAYED性能優于”INSERT,實際上隻是更快的傳回,而非更快的完成。

思考

三、思考

1、看到報錯資訊的時候,如果優先google一下,整體的排查速度會快的多;

2、RO出了問題,就一直在排查RO,如果早一點上master上執行一下show processlist,這樣是有很大可能看到insert delay這個語句的;

3、慎做非标。

往期推薦

《迪B課堂:MySQL概覽》

《迪B課堂:導緻MySQL主從複制延遲的原因》

《關于MySQL | 這個問題100個人都沒搞懂》

哈?一個事務裡出現2條insert?一、問題描述 二、擴充知識 三、思考

免費試用

包括雲資料庫MySQL在内的40+款熱門雲産品,實名認證的企業使用者可免費試用!1000M記憶體50G資料盤的MySQL可免費體驗30天,點選左下角“閱讀原文”立即領取~

哈?一個事務裡出現2條insert?一、問題描述 二、擴充知識 三、思考

↓↓點“閱讀原文”免費試用

好文和朋友一起看!

var first_sceen__time = (+new Date());if ("" == 1 && document.getElementById('js_content')) { document.getElementById('js_content').addEventListener("selectstart",function(e){ e.preventDefault(); }); } (function(){ if (navigator.userAgent.indexOf("WindowsWechat") != -1){ var link = document.createElement('link'); var head = document.getElementsByTagName('head')[0]; link.rel = 'stylesheet'; link.type = 'text/css'; link.href = "//res.wx.qq.com/mmbizwap/zh_CN/htmledition/style/page/appmsg_new/winwx45ba31.css"; head.appendChild(link); } })();

TencentDB

贊賞

長按二維碼向我轉賬

哈?一個事務裡出現2條insert?一、問題描述 二、擴充知識 三、思考

受蘋果公司新規定影響,微信 iOS 版的贊賞功能被關閉,可通過二維碼轉賬支援公衆号。

閱讀原文

閱讀

分享 在看

已同步到看一看

取消 發送

我知道了

朋友會在“發現-看一看”看到你“在看”的内容

确定

哈?一個事務裡出現2條insert?一、問題描述 二、擴充知識 三、思考

已同步到看一看寫下你的想法

最多200字,目前共字 發送

已發送

朋友将在看一看看到

确定

寫下你的想法...

取消

釋出到看一看

确定

最多200字,目前共字

發送中

微信掃一掃

關注該公衆号

微信掃一掃

使用小程式

即将打開""小程式

取消 打開