MySQL 5.6主從報(bào)錯(cuò)的實(shí)戰(zhàn)記錄
1. 問(wèn)題現(xiàn)象
版本:MySQL 5.6,采用傳統(tǒng) binlog file & pos 方式配置的主從復(fù)制結(jié)構(gòu)。
實(shí)例重啟后,主從復(fù)制報(bào)錯(cuò)如上圖所示。
2. 錯(cuò)誤含義
錯(cuò)誤分為2部分。
第一部分
- Client requested master to start replication from position > file size;
- the first event 'mysql-bin.000398' at 163800795,the last event read from './mysql-binlog.000398' at 4,the last byte read from './mysql-bin.000398' at 4'
第一部分
這部分來(lái)源于主庫(kù)的DUMP線程函數(shù)
mysql_binlog_send ->sender.run() ->Binlog_sender::init ->Binlog_sender::check_start_file if ((file= open_binlog_file(&cache, m_linfo.log_file_name, &errmsg)) < 0) { set_fatal_error(errmsg); return 1; } size= my_b_filelength(&cache); end_io_cache(&cache); mysql_file_close(file, MYF(MY_WME)); if (m_start_pos > size) { set_fatal_error("Client requested master to start replication from " "position > file size"); return 1; }
關(guān)鍵就是m_start_pos和size兩個(gè)值,其中m_start_pos來(lái)源于從庫(kù)需要讀取的位點(diǎn)。而size則是本binlog文件的大小,那么很容易理解如果io線程需要的pos點(diǎn)比本binlog文件的大小還要大,那么自然不對(duì)。
第二部分
這部分也來(lái)源于DUMP線程
mysql_binlog_send ->sender.run() ->Binlog_sender::init ->while (!has_error() && !m_thd->killed) #如果正常這里開始循環(huán)讀取binlog event,如果前面出錯(cuò)則直接繼續(xù)后面邏輯 #如果有讀取錯(cuò)誤則報(bào)錯(cuò) my_snprintf(error_text, sizeof(error_text), "%s; the first event '%s' at %lld, " "the last event read from '%s' at %lld, " "the last byte read from '%s' at %lld.", m_errmsg, m_start_file, m_start_pos, m_last_file, m_last_pos, log_file, my_b_tell(&log_cache));
這里我們主要看看m_start_pos和m_last_pos,實(shí)際上m_start_pos就是和前面報(bào)錯(cuò)一致的來(lái)自從庫(kù)需要讀取的位點(diǎn)信息,而m_last_pos來(lái)自dump線程,就是最后讀取的位置,顯然這里一次都沒(méi)有讀取,因此位置為最開始的pos 4。
3. 可能的原因
分析后覺(jué)得最有可能原因應(yīng)該和sync_binlog 有關(guān)。
如果我們沒(méi)有設(shè)置為1,那么可能os cache沒(méi)有刷盤,如果主庫(kù)服務(wù)器直接crash重啟很容易就遇到這種問(wèn)題。
稍微google查詢了一下發(fā)現(xiàn)很大部分出現(xiàn)這種錯(cuò)誤都是由于服務(wù)器crash且sync_binlog 沒(méi)設(shè)置為 1導(dǎo)致的。
這也證明我們的說(shuō)法。
最后查看問(wèn)題數(shù)據(jù)庫(kù)的主庫(kù)確實(shí)沒(méi)有設(shè)置為雙1。
那么通過(guò)這個(gè)小案例,我們已經(jīng)更加深刻體會(huì)到設(shè)置雙1的重要性。
總結(jié)
到此這篇關(guān)于MySQL 5.6主從報(bào)錯(cuò)的文章就介紹到這了,更多相關(guān)MySQL5.6主從報(bào)錯(cuò)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在?CentOS?7?下如何使用?Ansible?Playbook?實(shí)現(xiàn)?MySQL?8.0.34?的
要在?CentOS?7?下使用?Ansible?Playbook?實(shí)現(xiàn)?MySQL?8.0.34?的二進(jìn)制安裝,需要先下載?MySQL?8.0.34?的二進(jìn)制包,并將其上傳至目標(biāo)服務(wù)器,對(duì)MySQL?8.0.34?二進(jìn)制安裝過(guò)程感興趣的朋友跟隨小編一起看看吧2024-03-03MySQL的一些功能實(shí)用的Linux shell腳本分享
這篇文章主要介紹了Linux系統(tǒng)下MySQL的一些實(shí)用功能的shell腳本分享,包括啟動(dòng)Memcached、binlog自動(dòng)清理和修復(fù)主從同步這樣三個(gè)簡(jiǎn)單的實(shí)例,需要的朋友可以參考下2015-12-12mysql 獲取規(guī)定時(shí)間段內(nèi)的統(tǒng)計(jì)數(shù)據(jù)
這篇文章主要介紹了mysql 獲取規(guī)定時(shí)間段內(nèi)的統(tǒng)計(jì)數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2017-05-05MySQL數(shù)據(jù)庫(kù)的實(shí)時(shí)備份知識(shí)點(diǎn)詳解
本篇文章給大家分享了關(guān)于MySQL數(shù)據(jù)庫(kù)的實(shí)時(shí)備份知識(shí)點(diǎn)內(nèi)容,有需要的朋友們可以參考下。2018-08-08MySQL?數(shù)據(jù)庫(kù)聚合查詢和聯(lián)合查詢操作
這篇文章主要介紹了MySQL?數(shù)據(jù)庫(kù)聚合查詢和聯(lián)合查詢操作,需要的朋友可以參考下2021-12-12解決MySQL存儲(chǔ)時(shí)間出現(xiàn)不一致的問(wèn)題
這篇文章主要介紹了解決MySQL存儲(chǔ)時(shí)間出現(xiàn)不一致的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04mysql:ERROR?2003?(HY000)故障錯(cuò)誤解決方法與思路
這篇文章主要給大家介紹了關(guān)于mysql:ERROR?2003?(HY000)故障錯(cuò)誤解決方法與思路的相關(guān)資料,error 2003 hy000是MySQL數(shù)據(jù)庫(kù)中一個(gè)常見(jiàn)的錯(cuò)誤代碼,它通常意味著MySQL無(wú)法建立到數(shù)據(jù)庫(kù)的連接,需要的朋友可以參考下2024-02-02Mysql注入中的outfile、dumpfile、load_file函數(shù)詳解
這篇文章主要介紹了Mysql注入中的outfile、dumpfile、load_file,需要的朋友可以參考下2018-05-05Mysql報(bào)錯(cuò)too many connections的原因及解決方案
這篇文章主要給大家介紹了關(guān)于Mysql報(bào)錯(cuò)too many connections原因及解決方案,文中通過(guò)實(shí)例代碼以及圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09