mysql5.7のRDSを8.0に上げるためにブルー/グリーンデプロイメントのグリーン環境を作成した際に、エラーで詰まりました。
解決
- RDSのインスタンスを選択
- ログとイベントタブのログで、PrePatchCompatibility.logを検索
- PrePatchCompatibility.logを選択して見るをクリックするとエラーログが見れる。
私が出てたエラーは、こちらでした。
26) Check for indexes that are too large to work on higher versions of MySQL Server than 5.7
The following indexes were made too large for their format in a version of MySQL prior to 5.7.34. Normally, indexes within tables with compact or redundant row formats shouldn’t be larger than 767 bytes. For more information, see https://bugs.mysql.com/bug.php?id=102597 and https://bugs.mysql.com/bug.php?id=99791.
調べると、ROW_FORMATに異常がありそうだったので確認してみました。
SHOW TABLE STATUS FROM [テーブル名];
mysql5.7ではutf8を使っていたので、ROW_FORMATがCOMPACTでも良かったのですが、
mysql8.0以降ではutf8mb4がデフォルトになるため、ROW_FORMATがDYNAMICまたはCOMPRESSEDでないとデータ量が少なくインデックスが効かなくなるので変更が必要でした。
詳しくはこちらの記事を参照ください。
https://qiita.com/TanakanoAnchan/items/a6459b44557f2bdd5726
そのため、PrePatchCompatibility.logで指摘されていたカラムのROW_FORMATをDYNAMICにしました。
ALTER TABLE m_product ROW_FORMAT=Dynamic;
これでグリーン環境を作ることができました。
余談
その他に調べてた時にやったことをメモしておきます。
ステータスで無効な設定というエラーが出ていました。
DBのupdateができるかのチェックをします。
$mysqlcheck -u [DBのユーザー名] -p --all-databases --check-upgrade -h [RDSのエンドポイント]
Enter password:[パスワード入力]
そうすると以下が出てました。
Warning : Trigger [テーブル名] does not have CREATED attribute.
TRIGGERを調べてみると
mysql>SHOW TRIGGERS LIKE [テーブル名];
Createdがnullになっていました。
なのでTRIGGERを再作成してCreatedに日時が登録されました。
TRIGGERの再作成時の記事↓
TRIGGERの作成時にsql_modeというものに出会った
これでmysqlcheckすると全てOKになりました。