クエリがデータベースにアクセスしようとしてロックが発生すると、ロック待機タイムアウト超過が発生する可能性があります。 MySQL エラー ログのエラー。どのクエリがデータベースにアクセスしようとしているのかはわかっているかもしれませんが、その瞬間にどのクエリがロックを持っているかを判断することはすぐにはわかりません。
原因を見つける鍵となるのは、エラー ステートメントに「トランザクション」という記述があることです。これは、クエリが 1 つ以上の InnoDB テーブルの少なくとも 1 つの行を変更しようとしていることを示します。
クエリを特定したので、次のステップは SHOW ENGINE INNODB STATUSG コマンドを実行して、影響を受けるテーブルを表示することです。 。このコマンドは、クエリに関係するロックとミューテックスに関する詳細情報を提供します。
たとえば、SHOW ENGINE INNODB STATUSG コマンドからの次の出力を考えてみましょう。
mysql> show engine innodb status\G ... Per second averages calculated from the last 4 seconds ---------- SEMAPHORES ---------- ... 14 lock struct(s), heap size 3024, 8 row lock(s), undo log entries 1 ... --------------- LATEST FOREIGN KEY ERROR --------------- ... DELETE FROM file WHERE file_id in ('6dbafa39-7f00-0001-51f2-412a450be5cc' ) ...
この例では、出力を見ると、8 行ロックがあることがわかり、ファイル テーブル内の 8 行に対して書き込み操作が実行されていることを示しています。出力で提供される DELETE ステートメントは、削除操作が試行されていることを確認します。
この問題を解決するには、トランザクションがタイミングを計る前にロックを待機できる最大時間を定義する innodb_lock_wait_timeout 値を増やすことができます。外。この設定のデフォルト値は 50 秒です。この値を 120 秒などの大きい値に調整すると、トランザクションが完了するまでの時間を増やすことができます。
innodb_lock_wait_timeout 値を永続的に設定するには、次の行を /etc/my.cnf ファイルに追加します。 :
[mysqld] innodb_lock_wait_timeout=120
MySQL を再起動して、変更を適用します。あるいは、次のコマンドを使用して、現在のセッションの innodb_lock_wait_timeout 値を一時的に変更できます:
SET GLOBAL innodb_lock_wait_timeout = 120;
これにより、ロック待機タイムアウト超過エラーが発生することなくクエリを実行できるようになります。
以上がMySQL の「ロック待機タイムアウトを超えました」エラーのトラブルシューティング方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。