TL;DR
- MySQL は wait_timeout に設定した値ぴったりに、接続が切られる
- Aurora は wait_timeout の値 + 最大1分 に、接続が切られる
- エラーメッセージも違う
wait_timeout とは
wait_timeout
はアイドルセッションに対するタイムアウトを指定するパラメータです。
SQLが実行されず、アイドル状態(Sleep)がしばらく続くとそのセッションは自動的に切断されます。
wait_timeout
(interactive_timeout
もあわせてます)を20秒に設定した状態で、Vanilla MySQL と Aurora の挙動を比べてみましょう。
(RDS MySQL 8.0 / Aurora V3 で比較しています)
MySQL
Sleep状態 の時間 が wait_timeout
(20秒) に達したら、接続が切れます。シンプルな挙動です。
エラーメッセージは
ERROR 4031 (HY000): The client was disconnected by the server because of inactivity. See wait_timeout and interactive_timeout for configuring this behavior.
です。wait_timeout
に達してセッションが切断されたことがわかるエラーメッセージになっています。これは、MySQL 8.0.24 で入った改善で、エラーメッセージがわかりやすくなりました。
AWS Aurora
MySQLと違って wait_timeout
に達してもすぐ切断されません。wait_timeout
ピッタリではなく、何秒か経ってから切られます。以下のスクショでは、34秒経過してから切られました。
どうも何回か試していると、wait_timeout + 1分以内に接続が切られるようでした*1。
また、エラーメッセージは
ERROR 2013 (HY000): Lost connection to MySQL server during query
となっており、接続が切れたことだけしかわかりません(このエラーメッセージは wait_timeout
以外のケースでも出ます)。
あまり困ることはなさそうですが、こういった接続の扱い部分で、MySQL/Auroraで差があるのは意外でした。
*1:同じことを書いてる人がいます https://ahmedahamid.com/amazon-aurora-mysql-and-wait-timeout/