アプリケーション側で実行流量の制御をしておらず、人力で大量にアクセスすると死ぬ機能がリリースされてしまい、無事に死亡する事案に遭遇していた。
タイムアウト時間を超えた MySQL 内プロセスを kill する
対象を抽出する
以下のようにすると、カンマ区切りで kill すべき ID が取れる。
time >= 60
で、60 秒以上経過しているプロセスを状態問わず絞り込んでいるので、例えば前面の ALB だったり httpd, Nginx なりのタイムアウトが 120 秒だったりする場合は、ここを time >= 120
とすればいい。
mysql> SELECT GROUP_CONCAT(id) FROM information_schema.PROCESSLIST WHERE time >= 60 and user != 'rdsadmin'; +------------------+ | GROUP_CONCAT(id) | +------------------+ | 1, 2, 3, 4 | +------------------+ 1 row in set (0.00 sec)
これを kill する。
対象を kill する
一件ずつならそのまま MySQL CLI から kill ${id};
のようにして消せるが、今回はまとめて消したいので mysqladmin
を使う。
# example.1145148101919.ap-northeast-1.rds.amazonaws.com こんなエンドポイントは実際に存在しないので例です、存在してたまるか ❯ mysqladmin kill 1, 2,3,4 -u example -p -h example.1145148101919.ap-northeast-1.rds.amazonaws.com
これでよい。
ちなみに同時に 70 くらい id 指定して mysqladmin から kill 投げたりしているけど、コマンドが壊れたりはしていないので、ある程度多い場合はこちらで消しましょう。