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

推薦する

Navicat for MySQL 11 登録コード\アクティベーションコードの概要

おすすめの読み物: Navicat12.1シリーズのクラッキングとアクティベーションのチュートリアル...

少なくともn日間連続してログインしているユーザーに対するSQLクエリ

MySQL ツールを使用して、3 日間連続する例を見てみましょう。 1. SQL テーブルを作成しま...

Vant+postcss-pxtoremはブラウザ適応機能を実装します

Remレイアウトの適応Vant のスタイルでは、デフォルトで px を単位として使用します。rem ...

Docker-compose を使用して ELK クラスターを構築する方法

すべてのオーケストレーション ファイルと構成ファイルは、私の Github からアクセスできます。構...

Element UI をインストールして vue3.0 でベクター グラフィックスを使用する方法

ここでは、v3 のインストールと使用にのみ焦点を当てます。v2 について学びたい場合は、公式 Web...

Linuxはlsof/extundeleteツールを使用して、誤って削除されたファイルやディレクトリを復元します。

序文Linux には Windows のような目立つごみ箱がないため、簡単に復元することはできません...

Ubuntu で apt-get を使用して mysql をインストールおよび完全にアンインストールする方法の詳細な説明

1. mysqlをインストールします。 udo apt-getでmysql-serverをインストー...

JavaScript でプライベート変数を宣言する 2 つの方法

序文JavaScript は、キーワードを使用してプライベート変数を宣言できる他の言語とは異なります...

XHTML CSS ウェブサイトデザインの利点と問題点

XHTML は現在国際的に推奨されている標準的な Web サイト設計言語です。Webjx.com も...

js キャンバスは角丸画像を実現します

この記事では、角を丸くするためのjsキャンバスの具体的なコードを参考までに紹介します。具体的な内容は...

HTML における DTD の使用法の概要

DTD はマークアップの文法規則のセットです。これは XML 1.0 仕様の一部であり、HTML フ...

my.cnf (my.ini) 重要なパラメータの最適化設定手順

MyISAM ストレージエンジンMyISAM ストレージ エンジンは、書き込みよりも読み取りが多く、...

MySQL パラメータ関連の概念とクエリ変更方法

序文:以前の記事では、特定のパラメータの機能についてよく紹介してきました。しかし、MySQL パラメ...

jQueryはアコーディオン効果を実装します

この記事では、アコーディオンを実装するためのjQueryの具体的なコードを参考までに紹介します。具体...

MySQL の大文字と小文字の区別に関する注意

目次MySQLの大文字と小文字の区別はパラメータによって制御されますMySQLの大文字と小文字の区別...