実はInnoDBになってなかった

  • 投稿日:
  • by
  • カテゴリ:

先日、MT5で使っている MySQL5.5 のテーブルを、MyISAMから InnoDBに変更するという操作を行いました。
でも本当に変わっているのか確認していなかった(というか確認方法を知らなかった)ので、確かめてみました。

確認方法は、

mysql> use (MTのデータベース名);
mysql> show table status;

です。 すると、

| Name          | Engine | Version
+-------------------------+--------+---------
| mt_as_ua_cache     | MyISAM |   10

というように、MyISAMのままでした。
試しに InnoDBに変更するコマンドを入力してみます。

mysql> ALTER TABLE `mt_as_ua_cache` ENGINE = InnoDB;
Query OK, 0 rows affected, 1 warning (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 1

ワーニングが出ていますね。 こういうときは、

mysql> SHOW WARNINGS;
+---------+------+-------------------------------+
| Level  | Code | Message            |
+---------+------+-------------------------------+
| Warning | 1286 | Unknown table engine 'InnoDB' |
+---------+------+-------------------------------+
1 row in set (0.00 sec)

「InnoDBなんてストレージエンジン、知らないよ」と言われてしまいました。
そこで今度は、利用可能なストレージエンジンのリストを表示させました。

mysql> show engines;

結果は、

| Engine   | Support | Comment
+------------+---------+----------------------------------------------------------------
| MRG_MYISAM | YES   | Collection of identical MyISAM tables
| MyISAM   | DEFAULT | Default engine as of MySQL 3.23 with great performance
| BLACKHOLE | YES   | /dev/null storage engine (anything you write to it disappears)
| CSV    | YES   | CSV storage engine
| MEMORY   | YES   | Hash based, stored in memory, useful for temporary tables
| FEDERATED | NO   | Federated MySQL storage engine
| ARCHIVE  | YES   | Archive storage engine
+------------+---------+----------------------------------------------------------------
7 rows in set (0.01 sec)

リストに InnoDBがありません。 Why?
portsから入れるときに、InnoDBを追加するようなオプションがあったかしらん? と考えてみましたが、そのようなものはなかったように思います。
my.cnf も my-large.cnf から InnoDBに関する部分をコメントアウトしただけで、特にいじっていません。

ググッてみると、こんな記事がありました。

なぜ “skip-innodb is defined” って言われるの? | 株式会社ASENS

これでも改善が見られない場合、エラーログにヒントがあるかも知れません。
 
InnoDB: Error: data file /var/lib/mysql/ibdata1 is of a different size
 
ありました(汗)

さっそく /var/db/mysql にある .err ファイルを見てみると、

InnoDB: The InnoDB memory heap is disabled
InnoDB: Mutexes and rw_locks use InnoDB's own implementation
InnoDB: Error: log file ./ib_logfile0 is of different size 0 134217728 bytes
InnoDB: than specified in the .cnf file 0 5242880 bytes!

ありました(大汗)。 ib_logfile というのは、InnoDB のログファイルのようです。
最初は my.cnf がなかったので、後から作った時にサイズが変わったのかな? それとも my-medium.cnf ベースから my-large.cnf ベースに変えたのが原因かも?

現状ではまだ InnoDBを使っているテーブルはありませんから、削除しても問題はなかろうということで、

www# rm /var/db/mysql/ib_logfile*

とやってから、MySQLを再起動しました。
これで再度、show engines をやってみると、

| Engine | Support | Comment
+------------+---------+----------------------------------------------------------------
| InnoDB   | YES   | Supports transactions, row-level locking, and foreign keys
| MyISAM   | DEFAULT | Default engine as of MySQL 3.23 with great performance
| BLACKHOLE | YES   | /dev/null storage engine (anything you write to it disappears)
| CSV    | YES   | CSV storage engine
| MEMORY   | YES   | Hash based, stored in memory, useful for temporary tables
| FEDERATED | NO   | Federated MySQL storage engine
| ARCHIVE  | YES   | Archive storage engine
| MRG_MYISAM | YES   | Collection of identical MyISAM tables
+------------+---------+----------------------------------------------------------------
8 rows in set (0.00 sec)

リストに InnoDBが出てきました。
これで、前回の trans_innodb.sql を実行すれば、InnoDBに変換することができました。