データベースを MyISAM → InnoDB、utf8mb4_unicode_520_ci に統一する

このブログが稼働しているサーバーは何度か移転を繰り返してきましたが、
2010年に WordPress 化してから、データベースをダンプしてインポートすることを繰り返してきました。

一部は WordPress のアップデートにより自動で変更されたり、途中から使用開始したものに関しては新しめの設定になっていたりとバラバラですのでこの際統一することにします。

なお、MyISAM に関しても最新の MySQL LTS 版 9.4 でも引き続きサポートされていますので、アップデートしなければ困るというレベルのものではありません。

現状の確認

いくつかの方法で確認できますが、下記の方法で確認してみます。

SELECT ENGINE, TABLE_COLLATION, GROUP_CONCAT(TABLE_NAME SEPARATOR ', ') AS tables FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'wordpress' GROUP BY ENGINE, TABLE_COLLATION;

結果、下記の通りでした。

  • InnoDB
    • utf8mb3_general_ci:terms, options を含む WordPress 標準のもの、各種プラグイン等
    • utf8mb4_unicode_520_ci:popularpoststransients(WP Popular Posts で途中で追加されたと思われるテーブル)
  • MyISAM
    • utf8mb3_general_ci:posts, users を含む WordPress 標準のもの、各種プラグイン等
    • utf8mb4_unicode_520_ci:fa_user_logins(User Login History プラグイン)

InnoDB、MyISAM が半々程度で存在し、utf8mb4_unicode_520_ci がそれぞれ1つずつ、ほとんどが utf8mb3_general_ci でした。

InnoDB へ変更

一部のテーブルは InnoDB に変更されていることから、
当時は MyISAM が高速であったことからパフォーマンスに影響しない一部テーブルのみ変換したものと思います。

現在は InnoDB の方が高速という情報もありますので、統一します。

ALTER TABLE table_name ENGINE=InnoDB;

User Login History について

このプラグインのソースコードを確認したところ、inc/core/class-activator.php 内で MyISAM が指定されていました。

CREATE TABLE $table (
※略
) $charset_collate ENGINE=MyISAM;

念のためここだけ MyISAM のままにしておきます。

[Error Code: 1067. Invalid default value for] のエラー解消法

InnoDB に変更すると「Error Code: 1067. Invalid default value for xxx」のようなエラーが出力されます。

CREATE TABLE `wp_users` (
※略
  `user_registered` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
※略
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb3

WordPress のテーブルのデフォルト値が「0000-00-00 00:00:00」のために起こるエラーです。

エラーにならないように「1000-01-01 00:00:00」に変更する方法もありますが、現行の WordPress もデフォルトはこのままなので変えずに、sql_mode を変える方向で検討します。

SHOW VARIABLES LIKE 'sql_mode';
// ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

このうち「NO_ZERO_DATE」モードが ‘0000-00-00’ を許容しない設定になります。

「NO_ZERO_IN_DATE」はそれ以外の ‘2010-00-01’ などを許容しない設定となります。

従って、NO_ZERO_DATE だけを抜いて設定します。

SESSION のため今回のセッションのみ影響します。

SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

変更すると、残りのテーブルも変更できるようになりました。

utf8mb4_unicode_520_ci へ変更

utf8mb3 から utf8mb4 に変更することで最新の絵文字等に対応できるようになります。

かつては、utf8mb4_unicode_520_ci に対応していないデータベースに移行できないなどありましたが、2026年においてそのような環境は通常存在しないと考えられます。

utf8mb4 系にはいくつかあり、utf8mb4_0900_ai_ci というのもありますが、現時点で WordPress をクリーンインストールすると選択される「utf8mb4_unicode_520_ci」で統一することにします。

ALTER TABLE `wp_comments` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;

DB のチューニング

MySQL のチューニングにおいて innodb_buffer_pool_size といった、InnoDB 特有のチューニングがあります。

逆に、MyISAM のメモリを削減するとそのぶん回せるかもしれないと考えましたが、MyISAM 特有の項目 key_buffer_size がデフォルトの 8MB のままでした。

まとめ

長年運用してきたデータベースを MyISAM → InnoDB、utf8mb4_unicode_520_ci に変更しました。

動作には影響はない認識ですがもしなにかありましたらご連絡いただければと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)