MySQL ログで「ロック待機タイムアウトを超過しました」エラーが発生した場合、トランザクションが待機していることを示していますデータベース項目のロックの場合。どのクエリがデータベースにアクセスしようとしているのかはわかっているかもしれませんが、その瞬間にロックを保持しているクエリを特定するのは難しい場合があります。
「トランザクション」という単語の存在エラー メッセージでは、問題のあるクエリに 1 つ以上の InnoDB テーブル内の少なくとも 1 つの行の変更が含まれていることを示唆しています。エラーの原因となっているクエリにアクセスできるため、潜在的な原因となるテーブルがアクセスされているかどうかを判断できます。
さらに調査するには、次のコマンドを実行します。コマンド:
SHOW ENGINE INNODB STATUS\G
これにより、ロックとミューテックスに関する情報が提供されます。以下を含む:
たとえば、クライアントからの次の出力はこの問題を示しています。
Type: InnoDB Name: Status: ===================================== 110514 19:44:14 INNODB MONITOR OUTPUT ===================================== Per second averages calculated from the last 4 seconds ---------- SEMAPHORES ---------- Mutex spin waits 0, rounds 11487096053, OS waits 7756855 RW-shared spins 722142, OS waits 211221; RW-excl spins 787046, OS waits 39353 ------------------------ LATEST FOREIGN KEY ERROR ------------------------ 110507 21:41:35 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 14 lock struct(s), heap size 3024, 8 row lock(s), undo log entries 1 MySQL thread id 3686635, query id 124164167 10.64.89.145 viget updating DELETE FROM file WHERE file_id in ('6dbafa39-7f00-0001-51f2-412a450be5cc' ) ...
この出力では、テーブル「file」が表示されます。 DELETE クエリがそのテーブル内の行を変更しようとしているため、影響を受けるテーブルになります。出力を分析することで、ロック競合の原因となっている特定のテーブルを特定できます。
今後これらのエラーが発生しないようにするには、ロック待機タイムアウトを増やすことを検討してください。 innodb_lock_wait_timeout パラメータを設定して、InnoDB の値を変更します。デフォルト値は 50 秒です。
タイムアウトを永続的に増やすには、/etc/my.cnf ファイルに次の行を追加します。
[mysqld] innodb_lock_wait_timeout=120
あるいは、タイムアウトを一時的に調整することもできます。現在のセッション内:
SET innodb_lock_wait_timeout = 120;
タイムアウトを増やすと、待機中のトランザクションにロックを取得するための時間が長くなり、時間が短縮されます。タイムアウトエラーの可能性。
以上がMySQL の「ロック待機タイムアウトを超えました」エラーを解決する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。