Amazon RDSとAmazon AuroraのストレージエンジンにMyISAMを指定してみる

2021.08.17

いわさです。

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に置き換わる。

参考