この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
いわさです。
MySQL5.5よりも前のバージョンではMyISAMがデフォルトのストレージエンジンでした。
MySQLには様々なストレージエンジンが用意されており、現在デフォルトで選択されるのはInnoDBとなっており、特別なユースケースに該当しない限りはInnoDBを使うことが推奨されています。
Amazon RDSでもデフォルトのストレージエンジンはInnoDBとなっており、そしてMyISAMの利用は非推奨とされています。
以下によれば、MyISAMの場合クラッシュ回復時の信頼性の問題やリードレプリカで意図した動作をしない場合があるとされています。
また、Amazon AuroraではMyISAMは使用できない、とされています。
上記をまとめると、非推奨だがRDSでは一応利用が可能。Auroraでは利用は出来ない。と読み取れます。
今回は実際にMyISAMをRDSやAuroraで指定出来るのか、「使用できない」とはどういうことなのかを確認してみました。
MyISAMの指定方法
CREATE TABLE t1 (i INT) ENGINE = INNODB;
MySQL :: MySQL 5.6 リファレンスマニュアル :: 15.1 ストレージエンジンの設定 より
ストレージエンジンはCREATE TABLE / ALTER TABLE ステートメントでテーブル毎に指定します。
また、ENGINEオプションを省略した場合はdefault-storage-engine
オプションを使用します。
RDSの場合は、DBパラメータグループで指定します。
Amazon RDS for MySQL 8 のパラメータ
デフォルト値にInnoDBが設定されています。
そしてパラメータは変更不可です。
Aurora MySQL 5.7 のパラメータ
DBパラメータグループに項目自体が存在しません。
RDSでMyISAMを指定してみる
ストレージエンジンのサポートステータスを確認
SHOW ENGINES
コマンドで、サーバーでサポートされるストレージエンジンを調べることが出来ます。
RDSに対して実行してみます。
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.08 sec)
MyISAMはSupportがYESなので、サポートされています。
ちなみに、RDSのドキュメントには「FEDERATEDはサポートされていません」との記述がありました。たしかにこの結果からもサポートはされていないようです。
テーブルを作成
パラメータを確認のうえ、テーブルを作成してみます。
ENGINE指定を省略した場合、InnoDBを明示的に指定した場合、MyISAMを明示的に指定した場合の3パターンのテーブルを作成してみます。
mysql> SHOW VARIABLES like '%storage%';
+---------------------------------+-----------+
| Variable_name | Value |
+---------------------------------+-----------+
| default_storage_engine | InnoDB |
| default_tmp_storage_engine | InnoDB |
| disabled_storage_engines | |
| internal_tmp_mem_storage_engine | TempTable |
+---------------------------------+-----------+
4 rows in set (0.05 sec)
mysql> CREATE TABLE t_default (i INTEGER);
Query OK, 0 rows affected (0.06 sec)
mysql> CREATE TABLE t_inno (i INT) ENGINE = InnoDB;
Query OK, 0 rows affected (0.05 sec)
mysql> CREATE TABLE t_myisam (i INT) ENGINE = MyISAM;
Query OK, 0 rows affected (0.06 sec)
mysql> select table_schema, table_name, engine from information_schema.tables where table_schema = 'hoge';
+--------------+------------+--------+
| TABLE_SCHEMA | TABLE_NAME | ENGINE |
+--------------+------------+--------+
| hoge | t_default | InnoDB |
| hoge | t_inno | InnoDB |
| hoge | t_myisam | MyISAM |
+--------------+------------+--------+
3 rows in set (0.07 sec)
デフォルトはInnoDBで作成されました。
そして明示的に指定した場合は、MyISAMも作成が出来ました。
パラメータを変更して作成
default_storage_engine
を変更してみます。
DBパラメータグループからは変更不可となっていたので、セッション内でSETコマンドを使います。
そして、同じ用にテーブルを3パターン作成してみましょう。
mysql> SET default_storage_engine = MyISAM;
Query OK, 0 rows affected (0.06 sec)
mysql> SHOW VARIABLES like '%storage%';
+---------------------------------+-----------+
| Variable_name | Value |
+---------------------------------+-----------+
| default_storage_engine | MyISAM |
| default_tmp_storage_engine | InnoDB |
| disabled_storage_engines | |
| internal_tmp_mem_storage_engine | TempTable |
+---------------------------------+-----------+
4 rows in set (0.07 sec)
mysql> CREATE TABLE t_default (i INTEGER);
Query OK, 0 rows affected (0.10 sec)
mysql> CREATE TABLE t_inno (i INT) ENGINE = InnoDB;
Query OK, 0 rows affected (0.08 sec)
mysql> CREATE TABLE t_myisam (i INT) ENGINE = MyISAM;
Query OK, 0 rows affected (0.05 sec)
mysql> select table_schema, table_name, engine from information_schema.tables where table_schema = 'hoge2';
+--------------+------------+--------+
| TABLE_SCHEMA | TABLE_NAME | ENGINE |
+--------------+------------+--------+
| hoge2 | t_default | MyISAM |
| hoge2 | t_inno | InnoDB |
| hoge2 | t_myisam | MyISAM |
+--------------+------------+--------+
3 rows in set (0.05 sec)
デフォルトもMyISAMで作成されました。
default_storage_engine
は有効ですね。
ただし、セッション内でパラメータ変更をしたので、RDSを再起動するとデフォルト値は戻ります。
mysql> SHOW VARIABLES like '%storage%';
ERROR 2013 (HY000): Lost connection to MySQL server during query
No connection. Trying to reconnect...
Connection id: 9
Current database: hoge2
+---------------------------------+-----------+
| Variable_name | Value |
+---------------------------------+-----------+
| default_storage_engine | InnoDB |
| default_tmp_storage_engine | InnoDB |
| disabled_storage_engines | |
| internal_tmp_mem_storage_engine | TempTable |
+---------------------------------+-----------+
4 rows in set (0.47 sec)
AuroraでMyISAMを指定してみる
同じ確認をAuroraでも実施してみます。
ストレージエンジンのサポートステータスを確認
まずはサポートステータスの確認です。
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.03 sec)
サーバーとして、サポート自体はされているようですね。
もしかして、使えるかも?
テーブル作成
実際にテーブルを作成して確認してみましょう。
mysql> SHOW VARIABLES like '%storage%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| default_storage_engine | InnoDB |
| default_tmp_storage_engine | InnoDB |
| disabled_storage_engines | |
| ignore_default_storage_engine_errors | OFF |
| internal_tmp_disk_storage_engine | InnoDB |
+--------------------------------------+--------+
5 rows in set (0.09 sec)
mysql> CREATE TABLE t_default (i INTEGER);
Query OK, 0 rows affected (0.06 sec)
mysql> CREATE TABLE t_inno (i INT) ENGINE = InnoDB;
Query OK, 0 rows affected (0.05 sec)
mysql> CREATE TABLE t_myisam (i INT) ENGINE = MyISAM;
Query OK, 0 rows affected, 1 warning (0.05 sec)
mysql> select table_schema, table_name, engine from information_schema.tables where table_schema = 'hoge';
+--------------+------------+--------+
| table_schema | table_name | engine |
+--------------+------------+--------+
| hoge | t_default | InnoDB |
| hoge | t_inno | InnoDB |
| hoge | t_myisam | InnoDB |
+--------------+------------+--------+
3 rows in set (0.09 sec)
明示的に指定しましたが、InnoDBで作成されました。
そして、警告が出ています。確認してみましょう。
mysql> show warnings;
+-------+------+---------------------------------------------------+
| Level | Code | Message |
+-------+------+---------------------------------------------------+
| Note | 1266 | Using storage engine InnoDB for table 't_myisam' |
+-------+------+---------------------------------------------------+
1 row in set (0.09 sec)
MyISAMの指定が無視されて、InnoDBで作成された旨が警告表示されていますね。
AuroraでMyISAMを使用できない、というのはMySQLサーバーとして見た時はサポートされているが、Auroraの挙動としてENGINEパラメータで指定してもInnoDBに置き換える、という挙動を指していることがわかりました。
パラメータ変更
最後に、AuroraのDBパラメータグループで確認出来ませんでしたが、MySQL上は何が設定されているでしょうか。
mysql> SHOW VARIABLES like '%storage%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| default_storage_engine | InnoDB |
| default_tmp_storage_engine | InnoDB |
| disabled_storage_engines | |
| ignore_default_storage_engine_errors | ON |
| internal_tmp_disk_storage_engine | InnoDB |
+--------------------------------------+--------+
5 rows in set (0.06 sec)
こちらは予想どおりInnoDBが設定されていました。
変更は出来るでしょうか。
mysql> SET default_storage_engine = MyISAM;
ERROR 1238 (HY000): Variable 'default_storage_engine' is a read only variable
デフォルトストレージエンジンの変更は出来ませんでした。
まとめ
- Amazon RDSでは使えた。
- でもDBパラメータが変更不可になっているので永続的にデフォルトストレージエンジンをMyISAMにするのは難しい。
- CREATE TABLEで明示的な指定が必要。
- やはりAmazon Auroraでは使えなかった。勝手にInnoDBに置き換わる。