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
オプションを使うという選択もあります。