トランザクションとロックを表示するための 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アプレットのスケルトン画面の実装例

推薦する

mysql8.0.11 winx64 インストールと設定のチュートリアル

mysql 8.0.11 winx64のインストールチュートリアルは以下のように記録され、みんなと共...

はじめに: HTML の基本的なタグと属性の簡単な紹介

HTML はタグと属性で構成されており、これらを組み合わせてブラウザにページの表示方法を指示します。...

テキストエリアをレイアウトしたときにテキストが左下にあり、サイズを変更できない問題の解決策

2つの小さな問題ですが、長い間私を悩ませていました。最初の質問テキストエリアの左側のテキストは常にテ...

Nodejs がイントラネット侵入サービスを実装

目次1. LAN内のプロキシ2. イントラネットの浸透イントラネット侵入とは何ですか?橋プロキシサー...

MySQL 5.7.20\5.7.21 無料インストール版のインストールと設定のチュートリアル

参考までに、mysql 5.7.20 / 5.7.21 をダウンロード、インストール、構成します。具...

Vue デフォルトスロットの理解とサンプルコード

目次スロットとは何かデフォルトスロットの理解コードスニペット要約するスロットとは何かスロットは、親コ...

JSはclip-pathを使用して動的領域クリッピング機能を実装します

背景今日、CodePen を閲覧していたところ、非常に興味深い効果を見つけました。 CodePen ...

MySQL テーブルスペースとは何ですか?

今日皆さんにお伝えしたいトピックは、「皆さんがよく話題にするテーブル スペースとは一体何でしょうか。...

CSS の overflow: hidden の使い方 (オーバーフローの非表示とフロートのクリア)

オーバーフロー非表示指定された高さを超えるテキストや画像情報を非表示にすることを意味します。 <...

MySQLの半同期の詳細な説明

目次序文MySQL マスタースレーブレプリケーションMySQL でサポートされているレプリケーション...

CSS3 フレックスボックス自動記入の書き方を詳しく解説

この記事では、主に CSS3 フレックス エラスティック ボックスの自動塗りつぶしの書き方について詳...

選択タグ内のオプションをクリアする3つの方法

方法1コードをコピーコードは次のとおりです。 document.getElementById(&qu...

Linuxで新しいユーザーを作成し、指定されたディレクトリへの権限を付与する

1 ユーザーを作成し、ユーザーのルートパスとパスワードを指定します useradd -d /home...

CSS3 @mediaの基本的な使い方のまとめ

//文法: @media mediatype and | not | only (メディア機能) ...

cocoscreatorプレハブの詳しい説明

目次プレハブプレハブの作り方プレハブの役割1. 同じタイプのノードをバッチで作成する2. 特定の時間...