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

推薦する

Centos7 のインストールと Mysql5.7 の設定

ステップ1: MySQL YUMソースを取得するMySQLの公式サイトにアクセスして、RPMパッケー...

Dockerを使用してGitlabを素早くデプロイする方法

1. GitLabイメージをダウンロードする docker pull gitlab/gitlab-c...

MySql データ型チュートリアル例の詳細な説明

目次1. 概要2. MySQLデータ型の詳細な説明1) 文字列型2) 整数型3) 浮動小数点型4) ...

js 日付と時刻のフォーマット方法の例

js 日付時刻形式日付と時刻を指定された形式に変換します。例: YYYY-mm-dd HH:MM は...

Dockerオーバーレイはホスト間のコンテナ相互通信を実現します

目次1. Dockerの設定2. レジストリとネットワークを作成する3. コンテナを起動する環境説明...

Vue エクスポート Excel 機能の全プロセス記録

目次1. フロントエンドのリーディングプロセス: 2. プラグインの使用と初期化2.1 vue-ad...

MySQL カーソルの定義と使用法

カーソルの作成まず、MySql でデータ テーブルを作成します。 存在しない場合はテーブルを作成 `...

ネイティブ CSS で無限テキストカルーセルを実装する一般的な方法

テキストカルーセルは私たちの日常生活で非常に一般的です。スーパーマーケットや実店舗の入り口には、テキ...

MySQL で指定エンコーディングを実装する際の落とし穴について

前面に書かれた環境: MySQL 5.7+、MySQL データベースの文字エンコードは utf8、テ...

ブラインドの特殊効果を実現するネイティブJS

この記事では、ネイティブ JS で実装されたブラインドの特殊効果を紹介します。効果は次のとおりです。...

Docker で Confluence をデプロイするための完全な手順

Confluence は有料ですが、クラックして使用できます (購入が推奨され、正規版がサポートされ...

CSS 水平プログレスバーと垂直プログレスバーの実装コード

時々、素敵なスクロールバー効果を見るのは楽しいものです。ここでは、CSSを使用してそれを実現する方法...

MySQL サービスを起動できない問題の解決策を含む MySQL 5.7.17 インストール チュートリアル

.net 開発に関しては、Microsoft の SQL Server データベースに精通しており、...

Vue3はCSSの無限シームレススクロール効果を実装します

この記事では、CSS無限シームレススクロール効果を実現するためのvue3の具体的なコードを参考までに...

Tomcat および Web アプリケーションの Docker デプロイメントの実装

1.dockerをオンラインでダウンロードする yum インストール -y epel-release...