MySQL をアップグレードした後の謎の warning

随分前の話ですが、備忘録的に。

やったことと起きたこと

MySQL 5.0 という古いサーバが稼働していましたが、流石に古すぎるということで MariaDB 5.5 に移行することになりました。
元の環境と同じテスト環境を作り、Master と Slave をアップグレード。
特に問題なく完了したのでなんとなくテストでデータベースを作って削除したら謎の warning が……。

MariaDB [mysql]> drop database yokky_test;
Query OK, 1 row affected, 3 warnings (0.01 sec)

ログに記録されているエラーを見てもいまいち分からず。

[ERROR] Incorrect definition of table mysql.event: expected column 'sql_mode' at position 14 to have type set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH'), found type set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_A

warning だしあまり気にしなくても良いかなと一瞬考えましたが、Master 側でのエラーのため Slave のレプリケーションが止まってしまう事が判明しました。
出ていたエラーは以下のようなものです。
流石にこれは解決しないと……。

Query caused different errors on master and slave.     Error on master: message (format)='Cannot load from mysql.%s. The table is probably corrupted' error code=1548 ; Error on slave: actual message='no error', error code=0. Default database: 'yokky_test'. Query: 'drop database yokky_test'

解決方法

分かってしまえばどうって事は無いのですが、MySQL はバージョンアップ時にテーブルの互換性チェックとアップグレードを行う mysql_upgrade コマンドが用意されています。
これを Master / Slave の両方でそれぞれ実行してあげるとあっさり解決します。

ちなみに MySQL 8.0.16 以降ではサーバ側でこのチェックが実行されるようになりました。

MySQL 8.0.16 では、MySQL サーバーは以前に mysql_upgrade によって処理されたアップグレードタスクを実行します (詳細は、セクション2.11.3「MySQL のアップグレードプロセスの内容」 を参照)。 したがって、mysql_upgrade は不要であり、そのバージョンで非推奨になりました。

MySQL 8.0 リファレンスマニュアル

technical

Posted by yokky