emolog

脳内メモです。

RDSで同僚にテーブルロックされたお話

おきたこと

  • 本番環境に個別でSQL(データベースはAurora)を発行する必要があった(管理画面でできないSQL実行)
  • 同僚から、insert / deleteのSQLのコマンド実行の依頼(依頼者と作業者は基本別のオペレーション)
  • いつもどおり beging; で囲んでSQL実行
  • ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction って怒られた
  • どうやらテーブルロックされているらしい

対応と確認

  • ロックの件数を確認
mysql> SELECT trx_rows_locked FROM information_schema.INNODB_TRX;
+-----------------+
| trx_rows_locked |
+-----------------+
|               2 |
+-----------------+
1 row in set (0.00 sec)
  • 2つ
  • 自分(begin → deleteしている)以外にテーブルを掴んでいるクエリがある?
  • テーブルを掴んでいるプロセスを確認
mysql> show processlist;
  • アプリケーションで使用しないDBユーザ(オペレーションで使うユーザで)掴んでいた
  • 上記がオペレーションで使うユーザだとわかっていたので上記を削除
mysql> kill プロセスID
  • 再度ロック件数を確認したが変更なし
  • RDSには独自のプロシージャが用意されているっぽいので実行 docs.aws.amazon.com
mysql> CALL mysql.rds_kill(thread-ID)
mysql> SELECT trx_rows_locked FROM information_schema.INNODB_TRX;
+-----------------+
| trx_rows_locked |
+-----------------+
|               0 |
+-----------------+
1 row in set (0.00 sec)
  • 0になった🙆‍♂️
  • クエリ実行

仮説

  • 上記で削除したプロセスは同僚がSQLを本番環境で実行
  • begin
  • delete
  • tmuxなどでそのままプロセスが生き続けている

同僚に確認

  • 上記の仮説であっていた、確認したままターミナルを放置していたらしい

参考

qiita.com normalblog.net

最後に

  • 人にクエリを実行するまえに、テーブルロックは解除しよう🙏
  • テーブルロック周りぶっちゃけよくわかっていないので今後調べよう👀