MySQL でメタデータ ロックがブロックされている場所を確認する方法

MySQL でメタデータ ロックがブロックされている場所を確認する方法

MySQL でメタデータ ロックがブロックされている場所を確認する方法

手順:

1. セッション1の実行:

   トランザクションを開始します。
   t1から*を選択します。

2. ステップ 1 の後にセッション 2 が実行されます。

  テーブル t1 を削除します。

このとき、セッション 2 のドロップ ステートメントはブロックされます。では、メタデータ ロックをどのように分析して表示するのでしょうか?

方法:

1) show processlist; を実行すると、drop ステートメントがメタデータ ロックを待機していることがわかります。

mysql> プロセスリストを表示します。 
+----+--------------+-----------+---------+----------+----------+-------------------------------------------------------------------------------------------+------------------+ 
| ID | ユーザー | ホスト | db | コマンド | 時間 | 状態 | 情報 | 
+----+--------------+-----------+---------+----------+----------+-------------------------------------------------------------------------------------------+------------------+ 
| 5 | システム ユーザー | | NULL | 接続 | 1050234 | マスターがイベントを送信するのを待機中 | NULL | 
| 6 | システム ユーザー | | NULL | 接続 | 983193 | スレーブはすべてのリレー ログを読み取りました。スレーブ I/O スレッドがそれを更新するのを待機しています | NULL | 
| 8 | ルート | ローカルホスト | yzs | スリープ | 93 | | NULL | 
| 9 | root | localhost | yzs | クエリ | 3 | テーブル メタデータ ロックを待機中 | テーブル t1 を削除 | 
| 10 | root | localhost | NULL | クエリ | 0 | init | プロセスリストを表示 | 
+----+--------------+-----------+---------+----------+----------+-------------------------------------------------------------------------------------------+------------------+ 
セット内の行数は 5 です (0.00 秒) 

2) 現在実行中のトランザクションのスレッドは trx_mysql_thread_id:8 であることがわかりますが、このスレッドは何を実行しているのでしょうか?

mysql> information_schema.innodb_trx\G から * を選択します 
************************** 1. 行 **************************** 
          トランザクションID: 17683 
         trx_state: 実行中 
        trx_started: 2017-10-18 05:32:46 
   trx_requested_lock_id: NULL 
     trx_wait_started: NULL 
        trx_weight: 0 
    trx_mysql_スレッドID: 8 
         trx_query: NULL 
    trx_operation_state: NULL 
     使用中のtrxテーブル: 0 
     trx_tables_locked: 0 
     trx_lock_structs: 0 
   trx_lock_memory_bytes: 320 
      ロックされた行数: 0 
     trx_rows_modified: 0 
  trx_concurrency_tickets: 0 
    trx_isolation_level: 繰り返し読み取り 
     trx_unique_checks: 1 
  trx_foreign_key_checks: 1 
trx_last_foreign_key_error: NULL 
 trx_adaptive_hash_latched: 0 
 trx_adaptive_hash_timeout: 10000 
     trx_is_read_only: 0 
trx_autocommit_non_locking: 0 
セット内の1行(0.03秒) 

3) このスレッドが select ステートメントを実行していることがわかります。show engine innodb status を実行すると、トランザクションがスリープ状態にあることがわかります。これは、トランザクション ステートメントは実行されたがコミットされていないことを意味します。

トランザクションのスレッドを強制終了するには、kill 8 を実行します。または、ビジネスの SQL ステートメントをチェックして、未送信の SQL ステートメントがあるかどうかを確認します。

mysql> performance_schema.events_statements_current\G から * を選択します 
************************** 1. 行 **************************** 
       スレッドID: 27 
        イベントID: 15 
      END_EVENT_ID: 15 
       EVENT_NAME: ステートメント/sql/select 
         ソース: mysqld.cc:962 
      タイマー開始: 1050544992900922000 
       タイマー終了: 1050544993740836000 
       タイマー待機時間: 839914000 
       ロック時間: 196000000 
        SQL_TEXT: t1から*を選択 
         ダイジェスト: 1aa32397c8ec37230aed78ef16126571 
      DIGEST_TEXT: `t1` から * を選択  
     現在のスキーマ: yzs 
      オブジェクトタイプ: NULL 
     OBJECT_SCHEMA: NULL 
      オブジェクト名: NULL 
 OBJECT_INSTANCE_BEGIN: NULL 
      エラー: 0 
   返されたSQLSTATE: NULL 
      メッセージテキスト: NULL 
         エラー: 0 
        警告: 0 
     影響を受ける行数: 0 
       送信済み行数: 10 
     検査済み行数: 10 
作成されたTMP_DISK_TABLES: 0 
   作成されたTMPテーブル: 0 
    SELECT_FULL_JOIN: 0 
 SELECT_FULL_RANGE_JOIN: 0 
      選択範囲: 0 
   選択範囲チェック: 0 
      選択スキャン: 1 
   ソート_マージ_パス: 0 
       ソート範囲: 0 
       ソート行: 0 
       ソートスキャン: 0 
     インデックス未使用: 1 
   未使用インデックス: 0 
    ネスティングイベントID: NULL 
   ネスティングイベントタイプ: NULL 

ご質問がありましたら、メッセージを残すか、コミュニティに参加して話し合いましょう。お読みいただきありがとうございます。お役に立てれば幸いです。このサイトをサポートしていただき、ありがとうございます。

以下もご興味があるかもしれません:
  • MySQL ロックブロッキングの詳細な分析

<<:  Ubuntu 18.04 向け VMware Tools のインストールと構成のチュートリアル

>>:  Reactの基本のまとめ

推薦する

node.jsのインストールとHbuilderXの設定の詳細な説明

npm インストールチュートリアル: 1. Node.jsインストールパッケージをダウンロードする公...

HTML テーブルタグチュートリアル (46): テーブルフッタータグ

<tfoot> タグは、テーブル フッターのスタイルを定義するために使用されます。基本構...

MySQL複合インデックスの詳細な研究

複合インデックス (結合インデックスとも呼ばれます) は、複数の列に対して作成されるインデックスです...

Docker の Windows ストレージ パス設定操作

Windows 10 に Docker をインストールする場合、コンテナタイプを Linux コンテ...

CSS3 メディアクエリにおけるデバイス幅と幅の違いの詳細な説明

1.デバイス幅定義: 出力デバイスの画面表示幅を定義します。 Web ページが Safari で開か...

メンテナンスしやすい CSS コードを書くための 5 つのガイドライン

1. スタイルシートの先頭にコメント ブロックを追加して、スタイルシートの作成日、作成者、タグ、その...

Nginx 500 内部サーバーエラーの解決方法

今日、Nginxを使っていたら500エラーが発生しました。エラーコードを検索してみんなに共有しました...

Linux での tcpdump コマンドの詳細な分析と使用方法

導入簡単に言えば、tcpdump は、ネットワーク上のトラフィックをダンプし、ユーザーの定義に従って...

Vueカスタムコンポーネントはイベント修飾子を使用してピットレコードを踏む

序文今日、自作のコンポーネントを使っていたところ、突然、長い間忘れていたバブリングイベントに遭遇しま...

Echarts 凡例コンポーネントのプロパティとソース コード

凡例コンポーネントは、ECharts でよく使用されるコンポーネントです。シリーズ マーカーの名前を...

HTML フォーム コンポーネントのサンプル コード

HTML フォームは、さまざまな種類のユーザー入力を収集するために使用されます。次のコードは、HTM...

Linux で PCIe のバージョンと速度を確認する方法

PCIE には 4 つの異なる仕様があります。下の図でそのうちの 2 つを見てみましょう。マザーボー...

Angular環境構築と簡単な体験のまとめ

Angular入門Angular は、Google が開発したオープンソースの Web フロントエン...

npm グローバル モジュールのデフォルトのインストール パスを変更するためにノードのインストールをカスタマイズする手順

node を D ドライブにインストールしましたが、C ドライブのスペースを占有したくなかったため、...