版本:mysql 5.6,採用傳統 binlog file & pos 方式配置的主從複製結構。
例項重啟後,主從複製報錯如上圖所示。
錯誤分為2部分。
第一部分
第一部分
這部分**於主庫的dump執行緒函式
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)
size= my_b_filelength(&cache);
end_io_cache(&cache);
mysql_file_close(file, myf(my_wme));
if (m_start_pos > si程式設計客棧ze)
關鍵就是m_start_pos和size兩個值,其中m_start_pos**於從庫需要讀取的位點。而size則是本binlog檔案的大小,那麼很容易理解如果io執行緒需要的pos點比本binlog檔案的大小還要大,那麼自然不對。
第二部分
這部分也**於dump執行緒
mysql_binlog_send
->sender.run()
->binlog_sender::init
->while (!has_error() && !m_thd->killed)
#如果正常這裡開始迴圈讀取binlog event,如果前面出錯則直接繼續後面邏輯
#如果有讀取錯誤則報錯
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,實際上m_start_pos就是和前面報錯一致的來自從庫需要讀取的位點資訊,而m_last_pos來自dump執行緒,就是最後讀取的位置,顯然這裡一次都沒有讀取,因此位置為最開始的pos 4。
分析後覺得最有可能原因應該和sync_binlog 有關。
如果我們沒有設定為1,那麼可能os cache沒有刷盤,如果主庫伺服器直接crash重啟很容易就遇到這種問題。
稍微google查詢了一下發現很大部分出現這種錯誤都是由於伺服器crash且sync_binlog 沒設定為 1導致的。
這也證明我們的說法。
最後檢視問題資料庫的主庫確實沒有設定為雙1。
那麼通過這個小案例,我們已經更加深刻體會到設定雙1的重要性。
安裝mysql5 6報錯問題統計點
報錯1 su進入 mysql 屬組時報錯 root dbserver su mysql last login thu aug 31 17 20 03 cst 2017 on pts 1 su warning cannot change directory to home mysql no such ...
MySQL 5 6的GTID複製報錯沒有事務號
mysql 5.6的gtid複製有如下的報錯 worker 3 failed executing transaction at master log mysql bin.000014,end log pos 1216 error can t drop database xiao database d...
windows 下mysql5 6的安裝
3 修改安裝路徑下的my default.ini檔案下的baseurl為你的mysql安裝路徑下的根目錄,修改dataurl為mysql安裝目錄下的根目錄下的data目錄 4配置mysql的環境變數為你的mysql的安裝目錄下的bin目錄 5 以管理員的方式開啟cmd視窗進入你的mysql安裝目錄b...