mysql マスターとスレーブが同期される理由: 1. ネットワーク遅延; 2. マスター マシンとスレーブ マシンの負荷が一致しない; 3. 「max_allowed_packet」設定が一致しない; 4. キー値の開始キーの増分と自動増分ステップの設定が一致していない; 5. データベースのバージョンが一致していないなど。
このチュートリアルの動作環境: Windows7 システム、mysql8 バージョン、Dell G3 コンピューター。
# mysql マスターが同期しない原因の分析
#1. ネットワーク遅延
# #Mysql によるマスター/スレーブ レプリケーションは、binlog に基づく非同期レプリケーションです。binlog ファイルはネットワーク経由で送信されます。もちろん、ネットワーク遅延は、マスター/スレーブ同期の理由のほとんどです。特にコンピューター ルーム間のデータ同期の場合、このようなことが起こる可能性は非常に高いので、読み取りと書き込みを分離し、ビジネス層からの初期の設計に注意を払ってください。
2. マスター マシンとスレーブ マシンの負荷が一貫していない
mysql マスター/スレーブ レプリケーションはマスター データベースで io スレッドを開始し、上から 1 つの SQL を開始するためです。スレッド数と 1 io スレッドの場合、いずれかのマシンの負荷が高くビジーすぎるため、いずれかのスレッドのリソースが不足し、マスターとスレーブの不一致が発生します。
3. Max_allowed_packet 設定に一貫性がない
マスター データベースに設定された max_allowed_packet は、スレーブ データベースの max_allowed_packet よりも大きいです。マスター データベース、スレーブ データベース データベースの設定が小さすぎるため実行できず、マスターとスレーブの不整合が発生します。
4. キー自動インクリメントキーを起点とするキー値と自動インクリメントステップ設定の不一致によるマスタスレーブ不一致。
5. mysql が異常ダウンしたときに、sync_binlog=1 または innodb_flush_log_at_trx_commit=1 が設定されていない場合、binlog またはリレーログ ファイルが破損する可能性が非常に高く、その結果、master-スレーブの不一致。
6. mysql 自体のバグによって引き起こされるマスターとスレーブの同期。
7. データベースのバージョンが一致しない 、特に上位のバージョンがマスターで下位のバージョンがスレーブの場合、マスター データベースでサポートされている機能は、データベースではサポートされません。スレーブデータベースです。
#解決策
方法 1: エラーを無視した後、同期を続行します
この方法は適用可能 マスターとスレーブのデータベースのデータに大きな違いがない場合、データを完全に統合する必要がない場合、またはデータ要件が厳密ではない場合、解決策:stop slave;
set global sql_slave_skip_counter =1; start slave;
Slave_IO_Running: Yes Slave_SQL_Running: Yes
方法 2: マスターとスレーブを再作成し、完全に同期する
この方法は、マスターとスレーブのデータベース内のデータが大きく異なる状況に適しています。またはデータを完全に統合する必要があります解決策の手順は次のとおりです:#1. まずメイン データベースに入り、データが書き込まれないようにテーブルをロックします
コマンドを使用します:
mysql> flush tables with read lock;
注: ここではロックが読み取り専用状態になっており、ステートメントでは大文字と小文字が区別されません
2. データのバックアップ
バックアップデータを mysql.bak.sql ファイルにコピーします
mysqldump -uroot -p -hlocalhost > mysql.bak.sql
ここで注意してください: データベースのバックアップは必ず実行する必要があります。定期的にバックアップするには、シェル スクリプトまたは Python スクリプトを使用できます。これはより便利であり、確実にデータを確実に保存できます
3. マスターのステータスを確認します
mysql> show master status; +-------------------+----------+--------------+-------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------------+----------+--------------+-------------------------------+ | mysqld-bin.000001 | 3260 | | mysql,test,information_schema | +-------------------+----------+--------------+-------------------------------+ 1 row in set (0.00 sec)
4. mysql バックアップ ファイルをスレーブ マシンに転送し、データ回復を実行します
scp コマンドを使用します
scp mysql.bak.sql root@192.168.128.101:/tmp/
5。スレーブ ライブラリのステータスを停止します
mysql> stop slave;
6。次に、スレーブ ライブラリから mysql コマンドを実行し、データ バックアップをインポートします
mysql>source /tmp/mysql.bak.sql
7. スレーブ ライブラリからの同期を設定します。そこでの同期ポイント、つまり 2 つの項目 | ファイル | マスター ライブラリの show master status 情報の位置
change master to master_host = '192.168.128.100', master_user = 'rsync', master_port=3306, master_password='', master_log_file = 'mysqld-bin.000001', master_log_pos=3260;
8 に注目してください。スレーブ同期を再起動します
mysql> start slave;
9。同期ステータスを確認します
mysql> show slave status\G
View:
Slave_IO_Running: Yes Slave_SQL_Running: Yes
[関連する推奨事項:
mysqlビデオチュートリアル以上がmysqlのマスターとスレーブが同期される理由は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。