自由帳

とりとめのない学習メモです。主に Web サービスのシステム基盤や運用に関することを書いています

MySQL InnoDB Clusterを作成した時に設定ファイルにdisabled_storage_engines=myisamが自動で追記されていてフルダンプのリストア時にmysql.usersがリストアできなかった件

MySQL InnoDB Clusterをいじっていて、1台ぶっ壊れたのでリストアしようとしたらタイトルの件でハマりました。 ちなみに¥MySQL InnoDB Clusterが悪い訳ではなない。

What is disabled_storage_engines?

MySQL 5.7.8でいろいろな変数が追加されましたが disabled_storage_engines もその一つで、これは名前の通り指定したストレージエンジンではテーブルを作成できないようにするもの。

と言っても設定ファイルや変数に明示的に指定しなければデフォルト値は空なんですが、MySQL InnoDB Cluser作成時に mysqlsh から dba.configureLocalInstance を使用してClusterを作成した際に、 MySQLのコンフィグファイルに disabled_storage_engines=myisam が自動で付与されていました。

これに気づかず、生きているMySQLから以下のように mysqldump--all-databases オプションを付けてデータを取得して・・・

$ mysqldump -u root --all-databases --lock-all-tables --triggers --routines --events -p > dump.sql

それをそのまま壊れた MySQL へ流し込みました。

mysql> reset master;
Query OK, 0 rows affected (0.02 sec)
 
mysql> source dump.sql
 
mysql> start group_replication;

ここで start group_replication;がコケます。

以下のように mysql.user テーブルがないと怒られてログインすらできなくなってしまいました。わっしょい。

1146 (42S02): Table 'mysql.user' doesn't exist (RuntimeError)

取得した dump.sql の中では以下のような記述がありますので、見事に user テーブルが消え去りました。

DROP TABLE IF EXISTS `user`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `user` (
  `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
  `User` char(32) COLLATE utf8_bin NOT NULL DEFAULT '',
:

こうなるとmysqld_safe で頑張って復旧させるか、該当MySQL Serverを初期化して作り直すしかなさそうです。

まとめ

InnoDB Clusterの検証ということであまり確認せずに適当に全データベースのダンプを使ったリストアを行おうとしてハマりました。 こういう時は mysqldump ではなく mysqlpump--users オプションを使うという選択もあります。

参考