トランザクションとロックを表示するための MySQL の一般的なステートメント

トランザクションとロックを表示するための MySQL の一般的なステートメント

データベース内のトランザクションとロックを表示するための一般的なステートメント

トランザクションの待機ステータスを確認します。

選択
   r.trx_id 待機中のtrx_id、
   r.trx_mysql_thread_id 待機スレッド、
   r.trx_query 待機クエリ、
   b.trx_id ブロッキングtrx_id、
   b.trx_mysql_thread_id ブロッキングスレッド、
   b.trx_query ブロッキングクエリ
から
   information_schema.innodb_lock_waits w
内部結合 information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id
内部結合 information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id;

より具体的なトランザクション待機ステータスを表示します。

選択
   b.trx_state、
   エステート、
   e.time、
   d.state AS ブロック状態、
   d.time AS ブロック時間、
   a.requesting_trx_id、
   a.要求されたロックID、
   b.trx_query、
   b.trx_mysql_thread_id、
   a.blocking_trx_id、
   a.ブロッキングロックID、
   c.trx_query AS block_trx_query、
   c.trx_mysql_thread_id は block_trx_mysql_tread_id として
から
   information_schema.INNODB_LOCK_WAITS は
information_schema.INNODB_TRX b を a.requesting_trx_id = b.trx_id に LEFT JOIN します。
information_schema.INNODB_TRX c を a.blocking_trx_id = c.trx_id に LEFT JOIN します
LEFT JOIN information_schema.PROCESSLIST d ON c.trx_mysql_thread_id = d.id
information_schema.PROCESSLIST e を b.trx_mysql_thread_id = e.id に左結合します。
注文する
   要求するtrx_id;

未完了の取引を表示:

–MySQL 5.6

選択
   、
   a.trx_state、
   a.trx_started、
   a.trx_query、
   入札、
   b.ユーザー、
   b.DB、
   b.コマンド、
   b.時間、
   b.州、
   b.情報、
   c.PROCESSLIST_USER、
   c.PROCESSLIST_HOST、
   c.PROCESSLIST_DB、
   d.SQL_TEXT
から
   information_schema.INNODB_TRX a
information_schema.PROCESSLIST b を a.trx_mysql_thread_id = b.id に LEFT JOIN します。
b.COMMAND = 'スリープ'
PERFORMANCE_SCHEMA.threads c を b.id = c.PROCESSLIST_ID に左結合します。
PERFORMANCE_SCHEMA.events_statements_current d を d.THREAD_ID = c.THREAD_ID で左結合します。

–MySQL 5.5

選択
   、
   a.trx_state、
   a.trx_started、
   a.trx_query、
   入札、
   b. ユーザー、
   b. ホスト、
   b.DB、
   b.コマンド、
   b.時間、
   b.州、
   b.情報
から
   information_schema.INNODB_TRX a
information_schema.PROCESSLIST b を a.trx_mysql_thread_id = b.id に LEFT JOIN します。
どこ
   b.COMMAND = 'スリープ';

一定期間終了していない取引を表示します。

選択
    trx_id、
    trx_started、
    trx_mysql_スレッドID
から
    INFORMATION_SCHEMA.INNODB_TRX
どこ
    trx_started < date_sub(now(), 間隔 1 分)
trx_operation_state が NULL です
かつ、trx_query が NULL です。

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

1 プロセスリストを表示します。

SHOW PROCESSLIST は実行中のスレッドを表示します。この情報を取得するには、mysqladmin processlist ステートメントを使用することもできます。 SUPER権限をお持ちの場合は、すべてのスレッドを閲覧できます。それ以外の場合は、自分のスレッド (つまり、使用している MySQL アカウントに関連付けられているスレッド) のみが表示されます。スレッドがテーブルを更新または挿入している場合、プロセスのステータスはデータの更新または送信中になります。

このステートメントは、「接続が多すぎます」というエラー メッセージが表示され、何が起こっているのか理解したい場合に役立ちます。 MySQL は、管理者が常にシステムに接続して検査できるように、SUPER 権限を持つアカウントが使用するための追加の接続を予約します (この権限をすべてのユーザーに付与していないと仮定)。

状態

意味

チェックテーブル

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

テーブルを閉じる

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

接続アウト

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

ディスク上の tmp テーブルにコピーしています

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

一時テーブルを作成しています

部分的なクエリ結果を保持するための一時テーブルを作成します。

メインテーブルから削除

サーバーは複数テーブルの削除の最初の部分を実行しており、最初のテーブルを削除しました。

参照テーブルから削除する

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

フラッシングテーブル

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

殺された

スレッドに 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() を待機しています。

テーブル待ち

スレッドには、データ テーブル構造が変更され、新しい構造を取得するために再度開く必要があることが通知されます。その後、データ テーブルを再度開くには、他のすべてのスレッドがテーブルを閉じるまで待つ必要があります。この通知は、FLUSH TABLES tbl_name、ALTER TABLE、RENAME TABLE、REPAIR TABLE、ANALYZE TABLE、または OPTIMIZE TABLE の状況で生成されます。

ハンドラの挿入を待機中

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

ほとんどの状態は非常に高速な操作に対応しています。スレッドが数秒間同じ状態のままである場合は、問題が発生している可能性があるため、確認する必要があります。上記に記載されていないステータスもありますが、そのほとんどはサーバーにエラーがあるかどうかを確認する場合にのみ役立ちます。

2 完全なプロセスリストを表示します。

show processlist; では最初の 100 項目のみがリストされます。すべての項目をリストする場合は、show full processlist; を使用してください。

3 開いているテーブルを表示します。

このコマンドは、現在開いているテーブルを確認できます。 In_use 列はテーブルを使用しているスレッドの数を示し、Name_locked はテーブル名がロックされているかどうかを示します。これは通常、このテーブルに対して Drop コマンドまたは Rename コマンドが実行されるときに発生します。したがって、このコマンドは、特定のテーブルが現在デッドロックされているかどうか、テーブルのロック所有者は誰かなど、よくある質問への回答には役立ちません。

データベースから開いているテーブルを表示します。

4 '%lock%' のようなステータスを表示する

サーバーの状態を確認してください。

5 エンジンの innodb ステータスを表示します\G;

MySQL 5.1 より前のコマンドは、show innodbstatus\G; です。MySQL 5.5 では、上記のコマンドを使用して、innodb エンジンのランタイム情報を表示できます。

6 '%timeout%' のような変数を表示します。

サーバー構成パラメータを表示します。

上記は私の個人的な経験です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。間違いや不備な点がありましたら、遠慮なくご指摘ください。

以下もご興味があるかもしれません:
  • MySQLにおけるトランザクション分離レベルの実装原理の詳細な説明
  • MySQLトランザクションを実行するための構文とプロセスの詳細な説明
  • mysql と oracle のデフォルトのトランザクション分離レベルの説明
  • MySQL トランザクション自動コミット自動コミット操作
  • MySQL マスタースレーブ同期、トランザクションロールバックの実装原理
  • MySQLデータベースのトランザクションとロックの詳細な分析
  • Mysql トランザクションで Update を実行するとテーブルがロックされますか?
  • PHP+MySQL 分散トランザクションとソリューションに関する深い理解
  • MySQL は ACID トランザクションをどのように実装しますか?
  • MySQL が大規模トランザクションを避けるべき理由とその解決方法
  • MySQLにおけるトランザクションの永続性実装原理の詳細な説明

<<:  HTML テーブル マークアップ チュートリアル (40): ヘッダーの暗い境界線の色属性 BORDERCOLORDARK

>>:  WeChatアプレットのスケルトン画面の実装例

推薦する

MySQL データベースの鉄則 (要約)

適切なデータベース仕様は、ソフトウェア実装の複雑さを軽減し、通信コストを削減するのに役立ちます。この...

CSS3 疑似クラスセレクターの簡単なレビュー

序文CSS がフロントエンド開発の基本的なスキルであるならば、「セレクター」は基礎中の基礎です。これ...

DockerでGDBを使用するときにブレークポイントを入力できない問題を解決する

質問docker で gdb を実行すると、ブレークポイントに到達しますが、ブレークポイントに入るこ...

Centos7でglibcをアップグレードするとシステム異常(起動できない)になる場合の解決方法

目次問題の原因:解決:解決:私は Centos7 を使用しています (理論的にはこの方法は Cent...

Linux ifconfig コマンドの使用

1. コマンドの紹介ifconfig (ネットワーク インターフェイスを構成する) コマンドは、ネッ...

Innodb で MySQL の 2T テーブルをすばやく削除する方法の例

序文この記事は主に、MySQL の Innodb で 2T の大きなテーブルをすばやく削除する方法に...

WeChatアプレットの下部にあるタブバーがコンテンツをブロックする問題に対処する簡単な方法

WeChatアプレットでタブバーを設定すると、重要なコンテンツがブロックされ、iPhoneXなどの異...

Linux での scp および sftp コマンドの詳細な説明

目次序文1. SCPの使用法2. sftpを使用する3. scp と sftp の違いは何ですか?ど...

Dockerで構築されたコンテナにpingツールをインストールする

Centos や Ubuntu など、Docker が pull する Base イメージは最もシン...

vue-cli4.5.xはプロジェクトを素早く構築します

1. vue-cliをインストールする vue.js で vue.js を実行します。 2. プロジ...

JavaScript ベースのランダム点呼システムの実装

この記事では、ランダムロールコーラーを実装するためのJavaScriptの具体的なコードを参考までに...

CSS 変数に基づくテーマ切り替えに最適なソリューション (推奨)

この要件を受け取ったとき、Baidu は、CSS リンクの置き換え、className の変更、le...

vue プロジェクトで rem を使用して px を置き換える例

目次道具プラグインをインストールするプロジェクトのルートディレクトリに.postcssrc.jsファ...

CSSラベル表示モードについて1つの記事で学ぶ

タグの種類(表示モード) HTML タグは、一般的にブロック タグとインライン タグの 2 種類に分...