web-dev-qa-db-ja.com

AWS Auroraの古いテーブルロック?

移行のテストに使用しているAWS Aurora(MySQLエンジン、r3.large)があります。

実行されていないように見えるクエリがいくつかあることに気づきました。私が走るとき

show engine innodb status;

ロックされた単一のテーブルがあると報告します。

2017-06-21 18:20:49 2aea8928a700 Transaction:
TRANSACTION 6093969, ACTIVE 0 sec updating or deleting
mysql tables in use 1, locked 1
16 lock struct(s), heap size 376, 6164 row lock(s), undo log entries 1
MySQL thread id 12219, OS thread handle 0x2aea8928a700, query id 8842803 10.127.0.24 root updating
delete from <tablename> where id=<id>
Foreign key constraint fails for table `mydb`.`<otherTable>`:

これはJavaアプリケーションです。Tomcatインスタンスを停止し、アクティブな接続がないことを確認しましたが、ロックが解除されません。

Information_schema内のいくつかのテーブル(INNODB_LOCKS、INNODB_LOCK_WAITS、およびINNODB_TRX)を見ましたが、レコードが0です。

これはオーロラの問題ですか? AWSサポート以外のソリューションはありますか?

3
chris

これにAuroraが含まれるかどうかはわかりませんが、ここで注目に値するものがあります。InnoDBがロックを横にしたままにする場合があります。これはどのように起こりますか?

約6年前に、私はこの質問に答えます: InnoDBデッドロックはINSERT/UPDATE/DELETE専用ですか? 。その投稿で、MySQLドキュメントから次のことを述べました。

InnoDBがトランザクションの完全なロールバックを実行すると、トランザクションによって設定されたすべてのロックが解放されます。ただし、エラーの結果として単一のSQLステートメントのみがロールバックされた場合、ステートメントによって設定されたロックの一部が保持される可能性があります。これは、InnoDBが行ロックを、どのステートメントによってどのロックが設定されたかを後で識別できないような形式で格納するために発生します。

これはまだ デッドロックの検出とロールバックに関するMySQL 5.7ドキュメント(段落3) にあります。

あなたは質問で述べました

Information_schema内のいくつかのテーブル(INNODB_LOCKS、INNODB_LOCK_WAITS、およびINNODB_TRX)を見ましたが、レコードが0です。

6年前の質問に対する私の答え で、Percona Nagios Checkプラグインで使用されるこのテーブルのクエリを示しました。

SELECT COALESCE(MAX(IF(p.command = 'Sleep', p.time, 0)), 0) AS idle_in_trx
FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS AS w
INNER JOIN INFORMATION_SCHEMA.INNODB_TRX        AS b ON  b.trx_id = w.blocking_trx_id
INNER JOIN INFORMATION_SCHEMA.INNODB_TRX        AS r ON  r.trx_id = w.requesting_trx_id
LEFT JOIN  INFORMATION_SCHEMA.PROCESSLIST       AS p ON  p.id     = b.trx_mysql_thread_id;

ブロッキングトランザクションのプロセスID、ブロックされたリクエストトランザクションのプロセスID、およびINFORMATION_SCHEMA.PROCESSLISTのそれぞれの値を表示するようにクエリを調整しました。

SELECT COALESCE(MAX(IF(pb.command='Sleep',pb.time, 0)), 0) idle_in_trx,
pb.ID BLK_ID,pb.USER BLK_USER,pb.Host BLK_Host,pb.DB BLK_DB,
pb.COMMAND BLK_CMD,pb.TIME BLK_TIME,pb.STATE BLK_STATE,pb.INFO BLK_INFO,
pr.ID REQ_ID,pr.USER REQ_USER,pr.Host REQ_Host,pr.DB REQ_DB,
pr.COMMAND REQ_CMD,pr.TIME REQ_TIME,pr.STATE REQ_STATE,pr.INFO REQ_INFO,w.*
FROM       INFORMATION_SCHEMA.INNODB_LOCK_WAITS AS w
INNER JOIN INFORMATION_SCHEMA.INNODB_TRX        AS b  ON b.trx_id = w.blocking_trx_id
INNER JOIN INFORMATION_SCHEMA.INNODB_TRX        AS r  ON r.trx_id = w.requesting_trx_id
LEFT JOIN  INFORMATION_SCHEMA.PROCESSLIST       AS pb ON pb.id    = b.trx_mysql_thread_id
LEFT JOIN  INFORMATION_SCHEMA.PROCESSLIST       AS pr ON pr.id    = r.trx_mysql_thread_id
\G

これを実行すると、次の2つのいずれかが表示されます。

  1. ロックのこのログジャムを引き起こしているプロセスID
  2. すべてがNULLになる(トランザクションはブロックされない)。これは、ロックがLA-LA-LANDでスタックしていることを示しています(Auroraに問題があります)。その場合は、RDSを再起動します。
4
RolandoMySQLDBA