MySQL5.6マスタースレーブエラーの例

1.問題現象

バージョン:MySQL 5.6、従来のbinlogファイルおよびposモードで構成されたマスタースレーブレプリケーション構造を使用。
ここに画像の説明を挿入します
インスタンスが再起動した後、マスタースレーブレプリケーションエラーが上の図に示されています。

2.エラーの意味

エラーは2つの部分に分かれています。

最初の部分

  • クライアントはマスターに位置>ファイル
    サイズからレプリケーションを開始するように要求しました;
  • 163800795の最初のイベント「mysql-bin.000398」
    、4の「./mysql-binlog.000398」から読み取らた最後のイベント、4の
    「./mysql-bin.000398」から読み取られた最後のバイト

最初の部分
この部分は、メインライブラリの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) 
  {
    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;
  }

重要なのは、m_start_posとsizeの2つの値です。ここで、m_start_posは、ライブラリから読み取る必要のある位置から取得されます。また、サイズはbinlogファイルのサイズであるため、ioスレッドに必要なposポイントがbinlogファイルのサイズよりも大きい場合、当然のことながら間違っていることは容易に理解できます。

2番目の部分
この部分も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は、最後に読み取られた位置であるダンプスレッドから取得されます。 、一度も読み取られていないため、先頭の位置は4位です。

3.考えられる原因

分析した結果、最も可能性の高い原因はsync_binlogに関連しているはずだと思います。

1に設定しないと、OSキャッシュがフラッシュされない可能性があります。メインライブラリサーバーがクラッシュして再起動すると、この問題が発生しやすくなります。

小さなグーグルクエリは、これらのエラーのほとんどがサーバーのクラッシュが原因であり、sync_binlogが1に設定されていないことを発見しました。

最後に、問題のあるデータベースのメインデータベースが実際にdouble1に設定されていないことを確認します。

参照リンク:

MySQL 5.6マスタースレーブエラーの例:https://mp.weixin.qq.com/s/7uQk5cRjfgUxyDcLS7CURg

おすすめ

転載: blog.csdn.net/qq_40907977/article/details/114822444