MariaDB レプリケーションでエラー
「Last_SQL_Error: Query caused different errors on master and slave…」のエラー
MySQL/MariaDBのでレプリケーションを行なっているDBで、マスター側でデータベース(test_db)を削除(DROP DATABASE)を実行後、スレーブ側でSQLエラー(エラーコード 1805)が発生してレプリケーションが停止してしました。
MariaDB [(none)]> show slave status \G Last_SQL_Error: Query caused different errors on master and slave. Error on master: message (format)='Column count of %s.%s is wrong. Expected %d, found %d. The table is probably corrupted' error code=1805 ; Error on slave: actual message='no error', error code=0. Default database: 'test_db'. Query: 'drop database test_db'
エラーの原因
このエラーは、「マスター側とスレーブ側で、同じクエリを実行した際のエラー結果が異なっている」 ことが原因で発生します。
具体的には以下の通りです。
- マスター側:
DROP DATABASEを実行した際、内部のシステムテーブル(権限関係のテーブルなど)の列数が予期したものと異なっていたため、エラー(コード 1805: テーブル破損の可能性) が発生しながらも削除処理が行われた。 - スレーブ側: 同様のスレーブ側のテーブルは正常だったため、エラーなし(コード 0) で処理が完了しようとした。
レプリケーションは、マスターとスレーブで全く同じ挙動(エラーの有無も含めて)になることを期待するため、この「エラーのミスマッチ」を検知して安全のためにパイプラインをストップさせます。
解決手順
スレーブ側でクエリ自体は問題なく処理できる状態であるため、このエラーをスキップしてレプリケーションを再開させる のが一般的な対処法です。
以下の手順をスレーブ側で実行してください。
# 1. レプリケーション(SQLスレッド)を一時停止 MariaDB [(none)]> STOP SLAVE; # ※ MariaDB 10.5.1以降の場合は STOP REPLICA; # 2. カウンタを1つ進めて、エラーのあったクエリをスキップ MariaDB [(none)]> SET GLOBAL sql_slave_skip_counter = 1; # ※ MariaDB 10.5.1以降の場合は SET GLOBAL sql_replica_skip_counter = 1; # 3. レプリケーションを再開 MariaDB [(none)]>START SLAVE; # ※ MariaDB 10.5.1以降の場合は START REPLICA;
クエリーをスキップしたら、ステータスを確認し、Seconds_Behind_Master が数字(または0)になり、エラーが消えているか確認します。
MariaDB [(none)]> SHOW SLAVE STATUS \G # ※ MariaDB 10.5.1以降の場合は SHOW REPLICA STATUS \G

