mysql decode語句_MySQL復制問題的分析

s這是學習筆記的第?2031?篇文章

? 最近有個業務的MySQL復制問題還是比較多,做了事務降維之后,把一些敏感操作和線上環境隔離起來,整體的效果好了許多,不過今天在外面的時候,又收到一條報警短信,讓我心里咯噔一下。?

? 這個環境是一個中間件的分布式環境,有8個物理節點(主庫),即有6個主庫+8個從庫,我查看了下郵件,發現報錯的這個環境是昨天同事幫忙新建的從庫,到今天才這么短的時間,而且是基于GTID復制的模式,又出現了這類問題,我的心里還是比較忐忑的,因為如果我再收到幾條其他環境類似的復制錯誤,那么毫無疑問就屬于一起計劃外的故障了。

? ?故障離我們很近,但是在不同的時間有不同的理解。因為這段時間的做了數據遷移的一些高可用測試,壓力測試,數據重構,整體該做的工作都做差不多了,到了臨門一腳的時候,出現一些頻繁的問題,我讓我有所措手不及,而問題能夠定位可控,很容易理解,可以查漏補缺,而如果問題是集中出現,那就說明之前的工作沒有做到位,一旦發現嚴重的bug導致服務不可用,如果反復出現,不管過程如何,結果就是不合格的。這種感覺就好比是高速公路給汽車換輪胎,時間緊,任務重。

??所幸的是,我等了一會沒有再收到其他環境的問題,所以一個基本的定位:不是很嚴重。?

? 等我回到酒店之后,開始處理的時候,腦海里一直在琢磨,到底是一條什么樣的SQL語句會導致這樣奇怪的問題。

??很快就查到了相關的描述信息:

? ?LAST_ERROR_MESSAGE: Worker 0 failed executing transaction 'db8f9860-8202-11e9-991e-005056b7f69e:854286845' at master log mysqlbin.000601, end_log_pos 936077509; Could not execute Update_rows event on table dbo_testdb.dbo_testdata; Can't find record in 'dbo_testdata', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysqlbin.000601, end_log_pos 936077509

看起來問題是在binlog日志000601的偏移量936077509附近,看到這個偏移量心里一糾,可以看到文件已經超過900M了,解析起來已經有一些性能問題了。?

查看show slave status的結果:

?????????????Slave_IO_Running: Yes

? ? ? ? ? ? Slave_SQL_Running: No

可以看到IO_thread依然可用,說明復制的過程中整體的數據傳輸是OK的,是在應用的時候出現了問題 。?

我使用如下的語句開始解析這個偏移量附近的一些錯誤。?

/usr/local/mysql/bin/mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysqlbin.000601 | grep -A '10' 936077509

得到了如下的結果:

#190705 19:27:15 server id 211? end_log_pos 936077509 CRC32 0x590574c3? Update_rows: table id 599753 flags: STMT_END_F

### UPDATE `dbo_testdb`.`dbo_testdata`

### WHERE

###? ?@1=748890203 /* LONGINT meta=0 nullable=0 is_null=0 */

###? ?@2=60 /* INT meta=0 nullable=0 is_null=0 */

###? ?@3=13 /* INT meta=0 nullable=0 is_null=0 */

###? ?@4='2019-07-05 19:27:15' /* DATETIME(0) meta=0 nullable=0 is_null=0 */

###? ?@5='2019-07-05 19:27:15' /* DATETIME(0) meta=0 nullable=0 is_null=0 */

###? ?@6=0 /* LONGINT meta=0 nullable=0 is_null=0 */

### SET

###? ?@1=748890203 /* LONGINT meta=0 nullable=0 is_null=0 */

--

# at 936077509

#190705 19:27:15 server id 211? end_log_pos 936077540 CRC32 0x78404313? Xid = 221915192

COMMIT/*!*/;

# at 936077540

#190705 19:27:15 server id 211? end_log_pos 936077605 CRC32 0x6e307159? GTID? ? last_committed=1762227? sequence_number=1762248

SET @@SESSION.GTID_NEXT= 'db8f9860-8202-11e9-991e-005056b7f69e:854286846'/*!*/;

# at 936077605

#190705 19:27:15 server id 211? end_log_pos 936077696 CRC32 0x00c8479d? Query? ?thread_id=854? ?exec_time=0? ? ?error_code=0

SET TIMESTAMP=1562326035/*!*/;

BEGIN

可以看到這是一條update語句,它的格式比較奇怪,如下:

update xxx

where userid=xxxx,value=xxxx

set userid=xxxx

從語句來看明顯是不符合業務場景的,自己變更自己,明顯不合理的。

我們來進一步驗證。

主庫端查看數據,把上面的update轉義成select語句:

select * from `dbo_testdb`.`dbo_testdata`

WHERE

userid=748890203 and?

xxx=60 and

value=13 and

moddate='2019-07-05 19:27:15' and

crtdate='2019-07-05 19:27:15' and

modver=0?

發現主庫端和從庫端都不存在這條語句。?

所以這就牽扯出來兩個問題:

1)如果MySQL在主庫端的SQL語句沒有發生數據變更,是否會依然產生binlog

2)一條update語句,在MySQL里的解析應該是類似如下的形式:

update xxxx set xxxxx ?where 的形式,在這里明顯沒有走這種解析的方式。?

3)這條語句如何修復,因為后面的數據都等著這個斷點。

4)如果后續還有這種問題,該如何預防。?

我們為了快速修復,經過評估,主從庫端都沒有相應的數據,說明這條語句是沒有產生影響的,我們可以跳過這個事務。?

stop slave;

SET @@SESSION.GTID_NEXT= 'db8f9860-8202-11e9-991e-005056b7f69e:854286846';

begin;commit;

SET SESSION GTID_NEXT = AUTOMATIC;

start slave;

再次嘗試這個問題暫時正常了,在反復驗證中暫時沒有發現問題。?

而后續的進一步驗證得找下環境,會后續繼續說明。

對于問題本身,也需要和研發團隊做一下確認,這種操作的需求需要引導,后續不要再出現。

41dd70569fdd6a2701b23ff884d92860.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537034.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537034.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537034.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

jvm形象簡介之一看就懂

分享一波:程序員賺外快-必看的巔峰干貨 據 JVM 規范,JVM 內存結構共分為虛擬機棧、堆、方法區、程序計數器、本地方法棧五個部分。這里的java內存結構與前面所述的Java內存模型是兩個概念,不可以混淆。 堆 java堆是java虛擬機所管理的內存中最大的一塊…

MZOJ 1345 hero

一道寬搜模版題,可寫錯了兩個地方的我只得了56(掩面痛哭) http://10.37.2.111/problem.php?id1345 先看看正確的 #include <bits/stdc.h> #define read read() #define up(i,l,r) for(int i l; i<r; i) using namespace std;int read {int x 0; char ch getchar()…

opencv拖動進度條_OpenCV GUI基本操作,回調函數,進度條,裁剪圖像等-阿里云開發者社區...

代碼為轉載&#xff0c;出處找不到了&#xff0c;不貼了工具條進度條&#xff1a;// ConvertColor.cpp : 定義控制臺應用程序的入口點。//#include "stdafx.h"#include #include #include #pragma comment(lib,"opencv_core2410d.lib")#pragma comment(lib…

區間DP初探 P1880 [NOI1995]石子合并

https://www.luogu.org/problemnew/show/P1880 區間dp,顧名思義,是以區間為階段的一種線性dp的拓展 狀態常定義為$f[i][j]$,表示區間[i,j]的某種解; 通常先枚舉區間長度,再枚舉左端點,最后枚舉斷點(k) 石子合并便是一道經典的區間dp #include <bits/stdc.h> #define read…

jvm詳解 - 新生代與老年代

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 Java 中的堆是 JVM 所管理的最大的一塊內存空間&#xff0c;主要用于存放各種類的實例對象。 在 Java 中&#xff0c;堆被劃分成兩個不同的區…

pymysql建表_Python數據庫操作,針對pymysql 和 MYSQL數據庫

此文將以MYSQL數據庫做為例子,pymysql庫作為驅動進行學習安裝MYSQL數據庫與pymysql第三方庫安裝pymysql庫不多做敘述安裝navicat for mysql,此程序用來管理MYSQL數據庫注意: 連接過程中可能會出現1251錯誤解決辦法,在cmd命令下登錄mysql后輸入:ALTER USER rootlocalhost IDENTI…

從0到1使用VUE-CLI3開發實戰(五):模塊化VUEX及使用vuetify

小肆前幾天發了一篇2019年Vue精品開源項目庫的匯總&#xff0c;今天小肆要使用的是在UI組件中排行第三的Vuetify。vuetify介紹 Vuetify是一個漸進式的框架&#xff0c;完全根據Material Design規范開發&#xff0c;一共擁有80多個組件&#xff0c;對移動端支持非常好。 支持SSR…

詳解垃圾回收算法

分享一波:程序員賺外快-必看的巔峰干貨 標記清除算法 概念 該算法有兩個階段。 標記階段&#xff1a;找到所有可訪問的對象&#xff0c;做個標記。 清除階段&#xff1a;遍歷堆&#xff0c;把未被標記的對象回收 缺點&#xff1a;會產生碎片&#xff0c;不夠連貫 應用場景…

智能情緒分析技術_石化緣推薦:煉化企業智能機器人巡檢技術應用前景分析!...

本期內容由湖南天一奧星泵業有限公司冠名煉化企業智能機器人巡檢技術應用前景分析王國彤1,孫秉才2,儲勝利2,宋亞敏1(1.中國石油天然氣股份有限公司大連石化分公司&#xff0c;遼寧省大連市&#xff1b;2.中國石油集團安全環保技術研究院有限公司&#xff0c;北京市)摘要&#x…

CentOS 7編譯程序后的環境變量設置

今晚在 CentOS 7 上配置 Gitea&#xff0c;配置完成后在本地 clone 倉庫會提示 Failed to execute git command: exec: "git-upload-pack": executable file not found in $PATH&#xff0c;果斷用軟連接打法解決。隨后在 push 時又出現 Failed to execute git comma…

詳解:JVM內存調優參數

分享一波:程序員賺外快-必看的巔峰干貨 -Xms JVM啟動時申請的初始Heap值&#xff0c;默認為操作系統物理內存的1/64但小于1G。默認當空余堆內存大于70%時&#xff0c;JVM會減小heap的大小到-Xms指定的大小&#xff0c;可通過-XX:MaxHeapFreeRation來指定這個比列。Server端JV…

數組指針 sizeof 實現_C++數組指針!

學習C數組的時候&#xff0c;對數組的了解不是很深。也不知道&#xff0c;為什么聲明一個數組&#xff0c;int a[10]&#xff0c;為什么a就是數組的地址。你可以這樣理解&#xff0c;將a理解為指向數組頭的一個指針&#xff0c;這樣就好理解了。理解了之后確實好像豁然開朗的樣…

利用人工智能提升團隊包容性

在2018年11月舉行的Gartner應用技術與解決方案峰會上&#xff0c;高級主管分析師John Kostoulas認為&#xff0c;積極培養包容性文化的團隊和團隊領導者將超越他們的目標。Kostoulas引用了CEB-Gartner在2016年進行的一項領導力驗證調查&#xff0c;他指出&#xff0c;性別多元化…

表單驗證開發 - 登錄注冊開發(3)

表單驗證開發 - 登錄注冊開發(3) 一、教程目標 學習如何在表單中添加驗證規則。掌握使用 JSON 配置表單驗證規則的方法。實現前端和后端的表單驗證。 二、教程內容 1. 前端表單驗證 步驟 1&#xff1a;找到表單編輯 在頁面上找到需要編輯的表單&#xff0c;如注冊表單或登錄…

count(1),count(*),count(主鍵) 性能對比及辟謠

分享一波:程序員賺外快-必看的巔峰干貨 前言 前段時間關于統計數量的sql問題和朋友進行了討論&#xff0c;網上關于這三種查詢方式說法不一&#xff0c;主要有以下兩種說法。 count(*) count(主鍵) > count(1) count(主鍵) > count(*) > count(1)今天對這三種方式…

python與會計的論文_甭管前浪后浪,寫完論文的先浪!

原標題&#xff1a;甭管前浪后浪&#xff0c;寫完論文的先浪&#xff01;自愿返校已是板上釘釘的事兒了而對于大家的期末考現在也基本上已經通知線上考試如果沒有線上考試的話&#xff0c;那就是交論文可是&#xff0c;論文動不動就2000字10%查重毛概、各種選修課等等每一門都是…

git 命令 clone分支的代碼

一個項目通常含有很多分支&#xff0c; master分支一般是經過測試&#xff0c;驗證沒有問題后&#xff0c;代碼才會提交到master分支 develop分支&#xff0c;是測試經常拉下來進行測試的分支 直接復制develop分支的git 命令如下&#xff1a; git clone -b develop gitxxx 轉載…

String s = new String(123) 究竟創建了幾個對象

分享一波:程序員賺外快-必看的巔峰干貨 前言 今天上班劃水的過程中有人詢問到這個問題&#xff0c;網上對于這個問題也有爭議&#xff0c;有說創建了一個對象&#xff0c;有說兩個&#xff0c;有說三個。 首先說三個的肯定是扯淡了&#xff0c;今天來討論一下這條語句到底創…

jquery級試題_JS-jQuery練習題面試題

ES5中不能實現繼承的關鍵字A prototypeB callC applyD extends正確答案: D extends //屬于ES6不屬于常見23種設計模式A 單例B MVCC 觀察者D 策略正確答案: B創建型模式&#xff0c;共五種&#xff1a;工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。結構型模式&…

Vue 計算屬性與偵聽器

這一節我們一起學習 vue 中的計算屬性(computed properties)和偵聽器(watch)。 在之前&#xff0c;我們學習過 vue 表達式插值&#xff1a; <div id"example">{{ message.split().reverse().join() }} </div> 如果在模板中放入太多的邏輯會讓模板過重且難…