ホームページ  >  記事  >  データベース  >  mysqlでロックされたテーブルをクエリする方法

mysqlでロックされたテーブルをクエリする方法

WBOY
WBOYオリジナル
2022-01-12 11:48:1161992ブラウズ

方法: 1. 「show OPEN TABLES where In_use > 0;」コマンドを使用して、テーブルのロック状態を確認します。 2. 「SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS」コマンドを使用して、ロックされた状態をクエリします。テーブル。

mysqlでロックされたテーブルをクエリする方法

このチュートリアルの動作環境: Windows10 システム、mysql8.0.22 バージョン、Dell G3 コンピューター。

mysql はロックされたテーブルをどのようにクエリしますか

#1. テーブルがロックされているかどうかを確認します:

(1) 直接Mysql コマンドライン実行時: show Engine innodb status\G。

(2) デッドロックの原因となったSQL文を確認し、インデックスの状況を分析し、SQLを最適化します。

(3) 次に、show processlist を実行して、デッドロックに時間がかかる SQL 文を確認します。

(4)「%lock%」のようなステータスを表示します。

2. テーブル ロック ステータスを確認し、デッドロック ステップを終了します:

(1) テーブル ロック ステータスを確認します: show OPEN TABLES where In_use > 0; このステートメントは、現在のロック テーブル ステータスを記録します。 。

(2) プロセスのクエリ: show processlist クエリ テーブル ロックされたプロセス; 対応するプロセスの killid をクエリします。

(3) テーブルをロックする SQL を分析します。対応する SQL を分析し、テーブルにインデックスを追加し、共通フィールドにインデックスを追加し、テーブル関連フィールドにインデックスを追加します。

(4) 何がロックされているかを確認します: SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS。

(5) ロックを待機しているものを表示します: SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS。

mysqlでロックされたテーブルをクエリする方法

拡張情報

MySQL ロック ステータス表示コマンド:

テーブルのチェック: データ テーブルをチェックしています (これは自動です)。

テーブルを閉じる: テーブル内の変更されたデータはディスクにフラッシュされ、使用済みのテーブルは閉じられます。これは簡単な操作ですが、そうでない場合は、ディスク領域がいっぱいであるか、ディスクに高い負荷がかかっているかを確認する必要があります。

接続出力: レプリケーション スレーブ サーバーがマスター サーバーに接続しています。

ディスク上の tmp テーブルにコピーしています: 一時的な結果セットが tmp_table_size より大きいため、メモリを節約するために一時テーブルがメモリ ストレージからディスク ストレージに変換されています。

Creating tmp table: クエリ結果を保存するために一時テーブルを作成しています。

メインテーブルからの削除: サーバーは複数テーブルの削除の最初の部分を実行中で、最初のテーブルを削除したところです。

参照テーブルからの削除: サーバーは複数テーブルの削除の 2 番目の部分を実行し、他のテーブルからレコードを削除しています。

テーブルのフラッシュ: FLUSH TABLES が実行されており、他のスレッドがデータ テーブルを閉じるのを待っています。

Killed: kill リクエストがスレッドに送信されると、スレッドは kill フラグをチェックし、次の kill リクエストを放棄します。 MySQL は各メイン ループで kill フラグをチェックしますが、場合によっては、スレッドが短期間で終了する可能性があります。スレッドが別のスレッドによってロックされている場合、kill リクエストはロックが解放されるとすぐに有効になります。

ロック: 他のクエリによってロックされています。

データの送信: SELECT クエリのレコードが処理され、結果がクライアントに送信されます。

グループの並べ替え: GROUP BY の並べ替え。

順序の並べ替え: ORDER BY の並べ替え。

テーブルを開く: 他の要因によって妨げられない限り、このプロセスは高速である必要があります。たとえば、ALTER TABLE または LOCK TABLE ステートメントが実行されるまで、他のスレッドでデータ テーブルを開くことはできません。テーブルを開こうとしています。

重複の削除: SELECT DISTINCT クエリが実行されていますが、MySQL は前の段階で重複レコードを最適化できません。したがって、MySQL は結果をクライアントに送信する前に重複レコードを再度削除する必要があります。

テーブルを再オープン: テーブルのロックが取得されましたが、テーブル構造が変更されるまでロックを取得できません。ロックが解放され、データ テーブルが閉じられ、データ テーブルを再度オープンしようとしました。

ソートによる修復: 修復ディレクティブは、インデックスを作成するためにソートしています。

キーキャッシュによる修復: 修復ディレクティブは、インデックス キャッシュを利用して新しいインデックスを 1 つずつ作成します。ソートによる修復よりも遅くなります。

更新対象行の検索: 更新条件を満たすレコードを検索します。 UPDATE が関連レコードを変更する前に完了する必要があります。

スリープ中: クライアントが新しいリクエストを送信するのを待っています。

システム ロック: 外部システム ロックの取得を待機しています。現在、同じテーブルを同時にリクエストする複数の mysqld サーバーを実行していない場合は、 --skip-external-locking パラメーターを追加して外部システム ロックを無効にすることができます。

ロックをアップグレードしています: INSERT DELAYED は、新しいレコードを挿入するためのロック テーブルを取得しようとしています。

更新: 一致するレコードを検索し、それらを変更します。ユーザー ロック: GET_LOCK() を待機しています。

テーブルを待機中: データ テーブル構造が変更されたため、新しい構造を取得するにはデータ テーブルを再度開く必要があることがスレッドに通知されます。その後、データ テーブルを再度開くには、他のすべてのスレッドがテーブルを閉じるまで待つ必要があります。

ハンドラー挿入を待機中: INSERT DELAYED は保留中の挿入操作をすべて処理し、新しい要求を待機しています。

推奨学習: mysql ビデオ チュートリアル

以上がmysqlでロックされたテーブルをクエリする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。