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

\ 最新情報をチェック /

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です