MySQLのデッドロックチェック処理の通常の方法

MySQLのデッドロックチェック処理の通常の方法

通常、デッドロックが発生すると、重みが最も小さい接続が強制終了され、ロールバックされます。ただし、最適化するステートメントを見つけるには、デッドロックを有効にしてデッドロック情報を記録します。

#ステップ 1: ウィンドウ 1mysql> start transaction;
mysql> update aa set name='aaa' where id = 1;
 
#ステップ 2: ウィンドウ 2mysql> start transaction;
mysql> bb を更新し、name='bbb' を設定します (id = 1)。
 
#ステップ 3: ウィンドウ 1mysql> update bb set name='bbb';
#ステップ 4: ウィンドウ 3#自動送信するかどうかmysql> show variables like 'autocommit';
+---------------+-------+
| 変数名 | 値 |
+---------------+-------+
| 自動コミット | オン |
+---------------+-------+
 
#現在の接続を表示しますmysql> show processlist;
mysql> 完全なプロセスリストを表示します。
mysql> INFORMATION_SCHEMA.PROCESSLIST から * を選択;
+----+------+-----------+---------+-------+-------+-------+-----------------+
| ID | ユーザー | ホスト | db | コマンド | 時間 | 状態 | 情報 |
+----+------+-----------+---------+-------+-------+-------+-----------------+
| 4 | ルート | ローカルホスト | テスト | スリープ | 244 | | NULL |
| 5 | ルート | ローカルホスト | テスト | スリープ | 111 | | NULL |
| 6 | root | localhost | NULL | クエリ | 0 | init | プロセスリストを表示 |
+----+------+-----------+---------+-------+-------+-------+-----------------+
 
 
#現在ロックされているトランザクションを表示します (ロック要求がタイムアウトすると見つかりません)
mysql> INFORMATION_SCHEMA.INNODB_LOCKS から * を選択;
+------------------+-------------+------------+-------------+-------------+-----------------+-------------+-----------+----------------+
| lock_id | lock_trx_id | lock_mode | lock_type | lock_table | lock_index | lock_space | lock_page | lock_rec | lock_data |
+------------------+-------------+------------+-------------+-------------+-----------------+-------------+-----------+----------------+
| 130718495:65:3:4 | 130718495 | X | レコード | `test`.`bb` | GEN_CLUST_INDEX | 65 | 3 | 4 | 0x000000000300 |
| 130718496:65:3:4 | 130718496 | X | レコード | `test`.`bb` | GEN_CLUST_INDEX | 65 | 3 | 4 | 0x000000000300 |
+------------------+-------------+------------+-------------+-------------+-----------------+-------------+-----------+----------------+
 
#現在ロックを待機しているトランザクションを表示します (ロック要求がタイムアウトすると見つかりません)
mysql> INFORMATION_SCHEMA.INNODB_LOCK_WAITS から * を選択; 
+-------------------+-------------------+------------------+------------------+
| 要求中の trx_id | 要求されたロック ID | ブロック中の trx_id | ブロック中のロック ID |
+-------------------+-------------------+------------------+------------------+
| 130718499 | 130718499:65:3:4 | 130718500 | 130718500:65:3:4 |
+-------------------+-------------------+------------------+------------------+
 
 
#現在コミットされていないトランザクションを表示します (デッドロック待機がタイムアウトした場合、トランザクションはまだ閉じられていない可能性があります)
mysql> INFORMATION_SCHEMA.INNODB_TRX から * を選択;
+--------------------------------------------------------------------------------------------------------+
| trx_id | trx_state | trx_started | trx_requested_lock_id | trx_wait_started | trx_weight |
+-----------+-----------+----------------------+-----------------------+----------------------+------------+
| 130718500 | 実行中 | 2018-03-12 09:28:10 | NULL | NULL | 3 |
| 130718499 | ロック待機 | 2018-03-12 09:27:59 | 130718499:65:3:4 | 2018-03-12 09:32:48 | 5 |
==========================================================================================================
| trx_mysql_thread_id | trx_query | trx_operation_state | trx_tables_in_use |
+---------------------+---------------------------------------+---------------------+-------------------+
| 4 | NULL | NULL | 0 |
| 5 | bb を更新、名前を 'bbb' に設定 | 開始インデックス読み取り | 1 |
=========================================================================================================
| trx_tables_locked | trx_lock_structs | trx_lock_memory_bytes | trx_rows_locked | trx_rows_modified |
+-------------------+------------------+-----------------------+-------------------+-------------------+
| 0 | 2 | 360 | 3 | 1 |
| 1 | 4 | 1184 | 4 | 1 |
===========================================================================================================================
| trx_concurrency_tickets | trx_isolation_level | trx_unique_checks | trx_foreign_key_checks | trx_last_foreign_key_error |
+-------------------------+---------------------+-------------------+-------------------+---------+----------------------------+
| 0 | 繰り返し読み取り | 1 | 1 | NULL |
| 0 | 繰り返し読み取り | 1 | 1 | NULL |
===========================================================================================================================
| trx_adaptive_hash_latched | trx_adaptive_hash_timeout | trx_is_read_only | trx_autocommit_non_locking |
+---------------------------+---------------------------+------------------+----------------------------+
| 0 | 10000 | 0 | 0 |
| 0 | 10000 | 0 | 0 |
+---------------------------+---------------------------+------------------+----------------------------+
 
 
#アクセスされているテーブルを表示します。mysql> show OPEN TABLES where In_use > 0;
+----------+-------+--------+------------+------------+
| データベース | テーブル | 使用中 | 名前がロックされています |
+----------+-------+--------+------------+------------+
| テスト | bb | 1 | 0 |
+----------+-------+--------+------------+------------+
#ステップ 3: ウィンドウ 1 (ステップ 3 のロック要求に時間がかかりすぎると、ロックがタイムアウトになり、実行が終了します)
mysql> bbを更新し、名前を'bbb'に設定します。
エラー 1205 (HY000): ロック待機タイムアウトを超えました。トランザクションを再起動してください。
 
 
#「ウィンドウ 1」のロック要求がタイムアウトする前に、ステップ 5 を実行してデッドロックを発生させます。その後、接続「ウィンドウ 2」の実行が終了し、「ウィンドウ 1」が正常に実行されます。#ステップ 5: ウィンドウ 2mysql> update aa set name='aa';
エラー 1213 (40001): ロックを取得しようとしたときにデッドロックが見つかりました。トランザクションを再起動してください。

最新のデッドロック状況を表示する

#最新のデッドロック状況を表示しますmysql> SHOW ENGINE INNODB STATUS\G;
...............
------------------------
最近検出されたデッドロック
------------------------
2018-03-12 11:01:06 7ffb4993a700 #発生時刻*** (1) トランザクション: #トランザクション 1
トランザクション 130718515、アクティブ 19 秒開始インデックス読み取り
mysql テーブル使用数 1、ロック数 1 #テーブルがアクセス中 LOCK WAIT 4 ロック構造体、ヒープ サイズ 1184、行ロック 4、undo ログ エントリ 1 #影響を受ける行数 MySQL スレッド ID 5、OS スレッド ハンドル 0x7ffb498f8700、クエリ ID 205 localhost root 更新中 #スレッド/接続ホスト/ユーザー更新 bb セット名 = 'bb' #要求ステートメント*** (1) このロックが許可されるのを待機しています: #次のリソース (ロック位置とロック モード) を待機しています
レコード ロック スペース ID 65 ページ番号 3 n ビット 72 テーブル `test`.`bb` のインデックス `GEN_CLUST_INDEX` トランザクション ID 130718515 ロック モード X 待機中
レコード ロック、ヒープ番号 5 物理レコード: n_fields 5; コンパクト フォーマット; 情報ビット 0
 0: 長さ 6; 16 進数 000000000300; 昇順 ;;
 1: 長さ 6; 16 進数 000007ca9b34; 昇順 4;;
 2: 長さ 7; 16 進数 1f000002092075; asc u;;
 3: 長さ 4; 16 進数 80000001; 昇順 ;;
 4: 長さ 2; 16 進数 6262; asc bb;;
 
*** (2) トランザクション: #トランザクション2
トランザクション 130718516、アクティブ 14 秒開始インデックス読み取り
使用中の MySQL テーブル 1、ロックされているテーブル 1
4 つのロック構造体、ヒープ サイズ 1184、4 つの行ロック、UNDO ログ エントリ 1
MySQL スレッド ID 4、OS スレッド ハンドル 0x7ffb4993a700、クエリ ID 206 ローカルホスト ルート更新中
update aa set name='aa' #要求ステートメント*** (2) ロックを保持: #ロックリソースを保持 レコードロック スペース ID 65 ページ番号 3 n ビット 72 テーブル `test`.`bb` のインデックス `GEN_CLUST_INDEX` trx ID 130718516 lock_mode X
レコード ロック、ヒープ番号 1 物理レコード: n_fields 1; コンパクト フォーマット; 情報ビット 0
 0: 長さ 8; 16 進数 73757072656d756d; asc 上限;;
 
レコード ロック、ヒープ番号 3 物理レコード: n_fields 5; コンパクト フォーマット; 情報ビット 0
 0: 長さ 6; 16 進数 000000000301; 昇順 ;;
 1: 長さ 6; 16 進数 000007ca9b17; 昇順 ;;
 2: 長さ 7; 16 進数 9000000144011e; asc D ;;
 3: 長さ 4; 16 進数 80000002; 昇順 ;;
 4: 長さ 2; 16 進数 6262; 昇順 bb;;
 
レコード ロック、ヒープ番号 5 物理レコード: n_fields 5; コンパクト フォーマット; 情報ビット 0
 0: 長さ 6; 16 進数 000000000300; 昇順 ;;
 1: 長さ 6; 16 進数 000007ca9b34; 昇順 4;;
 2: 長さ 7; 16 進数 1f000002092075; asc u;;
 3: 長さ 4; 16 進数 80000001; 昇順 ;;
 4: 長さ 2; 16 進数 6262; 昇順 bb;;
 
*** (2) このロックが許可されるのを待機しています:
レコード ロック スペース ID 64 ページ番号 3 n ビット 80 テーブル `test`.`aa` のインデックス `GEN_CLUST_INDEX` トランザクション ID 130718516 ロック モード X 待機中
レコード ロック、ヒープ番号 7 物理レコード: n_fields 5、コンパクト フォーマット、情報ビット 0
 0: 長さ 6; 16 進数 000000000200; 昇順 ;;
 1: 長さ 6; 16 進数 000007ca9b33; 昇順 3;;
 2: 長さ 7; 16 進数 1e000001d53057; asc 0W;;
 3: 長さ 4; 16 進数 80000001; 昇順 ;;
 4: 長さ 2; 16 進数 6161; asc aa;;
 
*** トランザクションをロールバックします (2)
...............
#デッドロック レコードには最新のデッドロック情報のみが記録されます。各デッドロック情報をエラー ログに保存するには、次のパラメータを有効にします。
mysql> 'innodb_print_all_deadlocks' のような変数を表示します。
+----------------------------+-------+
| 変数名 | 値 |
+----------------------------+-------+
| innodb_print_all_deadlocks | オフ |
+----------------------------+-------+
 
 
#上記の[ステップ 3: ウィンドウ 1]でリソースを要求できない場合、デフォルトの 50 秒後にロック待機タイムアウトが発生します。
mysql> 'innodb_lock_wait_timeout' のような変数を表示します。 
+--------------------------+-------+
| 変数名 | 値 |
+--------------------------+-------+
| innodb_lock_wait_timeout | 50 |
+--------------------------+-------+
 
エラー 1205 (HY000): ロック待機タイムアウトを超えました。トランザクションを再起動してください。
 
 
#グローバル変数ロック待機タイムアウトを60秒に設定します(新しい接続が有効になります)
#mysql> セッションを innodb_lock_wait_timeout=50 に設定します。 
mysql> グローバル innodb_lock_wait_timeout を 60 に設定します。 
 
 
#上記のテストでは、トランザクション内のステートメントがタイムアウトすると、そのステートメントのみがロールバックされ、トランザクションの整合性が破壊されます。このトランザクションをロールバックするには、次のパラメータを有効にします。
mysql> 'innodb_rollback_on_timeout' のような変数を表示します。
+----------------------------+-------+
| 変数名 | 値 |
+----------------------------+-------+
| innodb_rollback_on_timeout | オフ |
+----------------------------+-------+

最終的なパラメータ設定は次のとおりです: (サービスを再起動してテストを再接続します)

[mysqld]
ログエラー=/var/log/mysqld3306.log
innodb_lock_wait_timeout=60 #ロック要求タイムアウト(秒)
innodb_rollback_on_timeout = 1 #トランザクション内のステートメントのロック要求がタイムアウトすると、トランザクション全体がロールバックされます innodb_print_all_deadlocks = 1 #すべてのデッドロックはエラーログに保存されます
#ブロックされたセッションを手動で削除する場合は、Command='Sleep'、State なし、Info なし、trx_weight が最小のセッションを削除します。
プロセスリストを表示します。
INFORMATION_SCHEMA.INNODB_TRX から trx_mysql_thread_id、trx_state、trx_started、trx_weight を選択します。

要約する

これで、MySQL デッドロック チェックと処理に関するこの記事は終了です。MySQL デッドロック チェックと処理に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQLデッドロックの原因と解決策
  • MySQL (InnoDB) がデッドロックを処理する方法の詳細な説明
  • MySQL デッドロック問題の分析と解決例
  • Ali インタビュー MySQL デッドロック問題の処理

<<:  Vue3 コンパイルプロセス - ソースコード分析

>>:  Dockerコンテナを更新、パッケージ化、Alibaba Cloudにアップロードする方法

推薦する

CentOS7.4 起動時の緊急モードへようこそメッセージに対する解決策

今日は仮想マシンを使って実験をしました。システムをインストールし、いくつかのオプションを最適化した後...

DockerでRedisをデプロイして起動する方法

DockerでRedisをデプロイするまずLinuxにDockerをインストールし、次にDocker...

MySQL ストアド プロシージャの作成と呼び出しの詳細な説明

目次序文ストアドプロシージャ: 1. ストアドプロシージャの作成と呼び出し1. ストアドプロシージャ...

Docker-compose ネットワークの詳細な例

今日は Docker でのネットワーク設定を試し、後で忘れないようにプロセスを記録しました。 (シス...

詳細なLinuxインストールチュートリアル

(Win7 システム) VMware 仮想マシンのインストール チュートリアルVMware は仮想マ...

Nginx の負荷分散アルゴリズムとフェイルオーバー分析

概要Nginx ロード バランシングは、アップストリーム サーバー (実際のビジネス ロジックによっ...

Ubuntu 20.04にSogou入力方式をインストールする詳細な手順

1. Fcitx入力フレームワークをインストールする関連する依存ライブラリとフレームワークは自動的に...

Nginx 転送ソケットポート設定の詳細な説明

Nginx によるソケット ポート転送の一般的なシナリオ: オンライン学習アプリケーションでは、通常...

HTML特殊文字の徹底分析

HTML徹底解析(14)特殊文字 ■ よく使われる特殊文字 HTMLタグを知っていれば、特殊文字の使...

Vue は Axios リクエスト フロントエンドのクロスドメイン問題をどのように解決するのか

目次序文1. クロスドメインの問題はなぜ発生するのでしょうか? 2. 解決策クロスオリジンリソース共...

CSS3に基づいてiPhoneを描く

結果:実装コードhtml <div class='iphone'> &l...

MySQL の条件文で 1 つの情報しか読み取れない問題に対する 2 つの解決策

今日、私の同僚が MYSQL クエリ ステートメントの作成時に非常に奇妙な問題に遭遇しました。MyS...

Python MySQL データベース テーブルの変更とクエリ

Python は MySQL に接続してデータベース テーブルを変更およびクエリします。 pytho...

Docker を使用した Laravel アプリケーションのデプロイ例

この記事で使用されているPHPベースイメージはphp:7.3-apacheです。この記事の Lara...

データベースを削除せずにMySQLのすべてのテーブルを素早く削除する方法

この記事では、例を使用して、データベースを削除せずに MySQL 内のすべてのテーブルをすばやく削除...