はじめに
先日、Amazon RDS for MySQLのマイナーバージョンアップグレードに失敗したのですが、調べても情報が見つからなかったので情報共有のために記事にしました。
経緯
先日、AWSからこんな通知がありました。
[アクションが必要です] Amazon RDS for MySQL は、2024 年 3 月 29 日にマイナーバージョン 8.0.31、8.0.29、8.0.28 を廃止します | [Action Required] Amazon RDS for MySQL is deprecating minor versions 8.0.31, 8.0.29 and 8.0.28 on March 29, 2024 [AWS Account: xxxxxxxxxxxx] [AP-NORTHEAST-1]
今使っているMySQLのバージョンが廃止されるため、期日までにアップグレードが必要という通知です。
特に引っかかることもなかったのでアップグレードしました。
しかし、開始してしばらく待ち続けたのですがなかなか終わらず、1時間ほど経ったときに
Database instance is in a state that cannot be upgraded: PreUpgrade checks failed: RDS detected incompatibilities when upgrading to MySQL 8.0.36. For details, see the PrePatchCompatibility.log file in the Logs section.
というメッセージが表示されました。
そのまま訳すと「MySQL 8.0.36へのアップグレード時にRDSが非互換性を検出したのでアップグレードに失敗しました。詳細はPrePatchCompatibility.logを見てください。」という内容のようです。
しかしPrePatchCompatibility.logというログは生成されていませんでした。
今回は8.0.31から8.0.36へのマイナーバージョンのアップグレードなので互換性に問題が起きることはあまりなさそうなのですが…。
エラーログ(mysql-error-running.log)を見ると
[ERROR] [MY-013180] [Server] Function ‘auth_socket’ already exists.
というエラーが出ていましたが、いまいち原因の特定はできませんでした。
原因
調べても手掛かりとなるような情報はなく原因が分からなかったのでAWSサポートに問い合わせてみました。
その結果、テーブルへのトランザクションが実行中だったことが原因と分かりました。
アップグレード前に互換性検証のために対象DBの全テーブルに対してロックを取得しているらしく、その際にトランザクションが実行中のテーブルがありロックに失敗していたようです。
対策
対策としてはアップグレードする際に
- 一旦アプリケーションを停止する
- プロセス停止、ロールバックなどでトランザクションを終了する
などしてトランザクションがない状態でアップグレードする必要があります。
結果
その後、失敗した2日後に再度アップグレードをしたところ、無事に成功しました。
今後はアプリケーションを停止するか、トランザクションがないことを確認してからアップグレードしたいと思います。