MySQLデータのサーバー移行作業中遭遇したエラー
冷凍のブロッコリーって足の上に落とすと結構痛いんです。
環境
MySQL 5.6
エラー
データディレクトリ以下をそのままコピーしたところ、以下のように怒られました。
mysql> SELECT * FROM test1;
ERROR 1146 (42S02): Table 'test1' doesn't exist
testテーブルがないとのこと。show tables;
で確認
mysql> show tables;
+---------------------------+
| Tables_in_test |
+---------------------------+
| test1 |
| test2 |
あります。
他のテーブルもデータを参照できないか、確認したところ、 データを見られるテーブルとみられないテーブルがありました。
ログ確認
$ tailf -n 1 mysqld.log
[Warning] InnoDB: Cannot open table test/test1 from the internal data dictionary of InnoDB though the .frm file for the table exists.
See http://dev.mysql.com/doc/refman/5.6/en/innodb-troubleshooting.html for how you can resolve the problem.
どうやら、データディレクトリを単純にコピーはできないようです。
参考)https://dev.mysql.com/doc/refman/5.6/ja/innodb-troubleshooting-datadict.html
この時点で、データを参照できないテーブルが最近(1年以内?)作られたものだと気が付きました。
検索エンジンの確認
mysql> SHOW TABLE STATUS;
にてテーブルのエンジンを確認すると、
データが参照できないテーブルはステータスが表示されませんでした。
移行元のステータスを確認すると、データが参照できないテーブルは、検索エンジンがInnoDBでした。
MySQL 5.5 からデフォルトのエンジンがInnoDBに変わって、データベース内にMyISAMとInnoDBが混在していたようです。
普段はmysqldumpでデータの移行をしてたので、今回のようにデータディレクトリをまるっと移動することはほぼありません。しかし、今回はデータ量が多いからか、dumpはできても、インポートの途中でSleep状態になってしまいました。
今回の対応
今回はどうしてもデータディレクトリごと移動させたいので、InnoDBをMyISAMに変えました。
移行元にて
mysql> ALTER TABLE test1 ENGINE='MyISAM';
移行先にて
# chmod 660 test1.*
# chown mysql:mysql test1*
# service mysqld restart
データベース名変更
ついでに名前も変えたかったので、
# mv test1 test
# service mysqld restart
無事移行出来て良かったです。