溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL 5.6主從報(bào)錯(cuò)分析

發(fā)布時(shí)間:2021-03-15 11:11:11 來(lái)源:億速云 閱讀:134 作者:TREX 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“MySQL 5.6主從報(bào)錯(cuò)分析”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“MySQL 5.6主從報(bào)錯(cuò)分析”吧!

1. 問題現(xiàn)象

版本:MySQL 5.6,采用傳統(tǒng) binlog file & pos 方式配置的主從復(fù)制結(jié)構(gòu)。

MySQL 5.6主從報(bào)錯(cuò)分析

實(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線程,就是最后讀取的位置,顯然這里一次都沒有讀取,因此位置為最開始的pos 4。

3. 可能的原因

分析后覺得最有可能原因應(yīng)該和sync_binlog 有關(guān)。

如果我們沒有設(shè)置為1,那么可能os cache沒有刷盤,如果主庫(kù)服務(wù)器直接crash重啟很容易就遇到這種問題。

稍微google查詢了一下發(fā)現(xiàn)很大部分出現(xiàn)這種錯(cuò)誤都是由于服務(wù)器crash且sync_binlog 沒設(shè)置為 1導(dǎo)致的。

這也證明我們的說法。

最后查看問題數(shù)據(jù)庫(kù)的主庫(kù)確實(shí)沒有設(shè)置為雙1。

那么通過這個(gè)小案例,我們已經(jīng)更加深刻體會(huì)到設(shè)置雙1的重要性。

總結(jié)

到此,相信大家對(duì)“MySQL 5.6主從報(bào)錯(cuò)分析”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI