MySQL でロック待機タイムアウト超過エラーが発生したときに、ロックを保持していた特定のクエリを特定する方法
はじめに:
MySQL のロック待機タイムアウト超過エラーは、クエリの試行中にロック待機タイムアウトが発生したことを示しますロックされたリソースにアクセスします。これは、複数のクエリが同じデータにアクセスしており、ロックの競合により 1 つのクエリが別のクエリの実行をブロックするシナリオで発生する可能性があります。ロック待機の原因となっている特定のクエリを特定すると、問題の解決と今後の発生の防止に役立ちます。
犯人クエリの特定:
エラー ログには、「」という単語が表示されます。 transaction" は、データベースにアクセスしようとしているクエリが 1 つ以上の InnoDB を変更していることを示す重要な指標です。テーブル。エラーを引き起こしたクエリがわかれば、関係するテーブルを特定できます。
コマンド SHOW ENGINE INNODB STATUSG を使用すると、影響を受けるテーブルとロック ステータスに関する情報を取得できます。このコマンドは、次のような詳細情報を表示します。
出力例:
SHOW ENGINE INNODB STATUSG からの次の出力は、特定のクエリが添付ファイルの排他ロックを待機していることを示していますテーブル:
RW-excl spins: 787046, OS waits: 39353 ... Latest foreign key error (a full list is printed in the InnoDB error log when a foreign key error occurs): ... Transaction: TRANSACTION 0 606162814, ACTIVE 0 sec, process no 29956, OS thread id 1223895360 updating or deleting, thread declared inside InnoDB 499 mysql tables in use 1, locked 1 ... Foreign key constraint fails for table `backoffice`.`attachment`: , CONSTRAINT `attachment_ibfk_2` FOREIGN KEY (`file_id`) REFERENCES `file` (`file_id`) Trying to delete or update in parent table, in index `PRIMARY` tuple: ... But in child table `backoffice`.`attachment`, in index `PRIMARY`, there is a record:
解決策:
この問題を解決するには、トランザクションが待機する最大時間を指定する innodb_lock_wait_timeout パラメータの値を増やすことができます。エラーを報告する前にロックしてください。このタイムアウトを増やすことで、トランザクションが完了するまでのバッファ時間を増やし、ロック タイムアウト エラーの可能性を減らすことができます。
innodb_lock_wait_timeout の設定:
タイムアウトを永続的に設定するには、/etc/my.cnf に次の行を追加して再起動します。 MySQL:
[mysqld] innodb_lock_wait_timeout=120
現在のセッションのタイムアウトを設定するには、次のクエリを実行します:
SET GLOBAL innodb_lock_wait_timeout = 120;
以上がMySQL で「ロック待機タイムアウトを超えました」エラーを引き起こす特定のクエリを特定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。