ホームページ > データベース > mysql チュートリアル > MySQL の「ロック待機タイムアウトを超えました」エラーを解決する方法?

MySQL の「ロック待機タイムアウトを超えました」エラーを解決する方法?

Linda Hamilton
リリース: 2024-12-09 13:03:10
オリジナル
420 人が閲覧しました

How to Resolve MySQL's

MySQL で「ロック待機タイムアウトを超過しました」エラーをデバッグする方法

MySQL ログで「ロック待機タイムアウトを超過しました」エラーが発生した場合、トランザクションが待機していることを示していますデータベース項目のロックの場合。どのクエリがデータベースにアクセスしようとしているのかはわかっているかもしれませんが、その瞬間にロックを保持しているクエリを特定するのは難しい場合があります。

犯人の特定

「トランザクション」という単語の存在エラー メッセージでは、問題のあるクエリに 1 つ以上の InnoDB テーブル内の少なくとも 1 つの行の変更が含まれていることを示唆しています。エラーの原因となっているクエリにアクセスできるため、潜在的な原因となるテーブルがアクセスされているかどうかを判断できます。

SHOW ENGINE INNODB STATUSG を使用

さらに調査するには、次のコマンドを実行します。コマンド:

SHOW ENGINE INNODB STATUS\G
ログイン後にコピー

これにより、ロックとミューテックスに関する情報が提供されます。以下を含む:

  • 影響を受けるテーブル
  • RW 共有ロックのスピン
  • RW 排他的ロックのスピン
  • ミューテックスのスピン待機
  • 行ロック情報
  • Undoログエントリ

出力例

たとえば、クライアントからの次の出力はこの問題を示しています。

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート