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

MySQL で「ロック待機タイムアウトを超えました」エラーを引き起こす特定のクエリを特定する方法

Susan Sarandon
リリース: 2024-12-31 06:10:09
オリジナル
686 人が閲覧しました

How to Identify the Specific Query Causing a

MySQL でロック待機タイムアウト超過エラーが発生したときに、ロックを保持していた特定のクエリを特定する方法

はじめに:

MySQL のロック待機タイムアウト超過エラーは、クエリの試行中にロック待機タイムアウトが発生したことを示しますロックされたリソースにアクセスします。これは、複数のクエリが同じデータにアクセスしており、ロックの競合により 1 つのクエリが別のクエリの実行をブロックするシナリオで発生する可能性があります。ロック待機の原因となっている特定のクエリを特定すると、問題の解決と今後の発生の防止に役立ちます。

犯人クエリの特定:

エラー ログには、「」という単語が表示されます。 transaction" は、データベースにアクセスしようとしているクエリが 1 つ以上の InnoDB を変更していることを示す重要な指標です。テーブル。エラーを引き起こしたクエリがわかれば、関係するテーブルを特定できます。

コマンド SHOW ENGINE INNODB STATUSG を使用すると、影響を受けるテーブルとロック ステータスに関する情報を取得できます。このコマンドは、次のような詳細情報を表示します。

  • RW 共有スピン: 共有読み取りロックを待機しているスピンの数を指定します。
  • RW -excl スピン: 排他的なスピンを待機しているスピンの数を示します。 lock.
  • ミューテックス スピン待機: ミューテックスで待機しているスピンの数。

出力例:

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

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