caerulaのあたま

日々学んだことの忘備録と雑記

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に変わって、データベース内にMyISAMInnoDBが混在していたようです。

普段はmysqldumpでデータの移行をしてたので、今回のようにデータディレクトリをまるっと移動することはほぼありません。しかし、今回はデータ量が多いからか、dumpはできても、インポートの途中でSleep状態になってしまいました。

今回の対応

今回はどうしてもデータディレクトリごと移動させたいので、InnoDBMyISAMに変えました。

移行元にて

mysql> ALTER TABLE test1 ENGINE='MyISAM';

移行先にて

# chmod 660 test1.*
# chown mysql:mysql test1*
# service mysqld restart

データベース名変更

ついでに名前も変えたかったので、

# mv test1 test
# service mysqld restart

無事移行出来て良かったです。