mita2 database life

主にMySQLに関するメモです

Aurora の wait_timeout の挙動が MySQL と違った

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/