MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLですべてのデッドロックログを表示する方法|設定手順と実行例を解説

MySQL(InnoDBストレージエンジン)で発生したすべてのデッドロックのログを確認したい場合、まずシステム変数「innodb_print_all_deadlocks」を有効にする必要があります。この変数をONにすることで、InnoDBが検出したデッドロックの詳細情報を出力できるようになります。

手順1:innodb_print_all_deadlocksを有効にする

以下の構文を実行して、グローバル変数を有効化します。

SET GLOBAL innodb_print_all_deadlocks=1;

この設定は動的に変更できますが、サーバーを再起動すると元の値(デフォルトはOFF)に戻ってしまいます。恒久的に利用したい場合は、my.cnf(Windows環境ではmy.ini)の設定ファイルにあらかじめ記載しておくことをおすすめします。

手順2:SHOW ENGINE INNODB STATUSでステータスを確認する

上記の設定を行った後、次の構文を実行すると、デッドロックに関するログを含むInnoDBの詳細なステータス情報を表示できます。

SHOW ENGINE INNODB STATUS;

実行例

実際にコマンドを実行した例が以下のとおりです。

mysql> SET GLOBAL innodb_print_all_deadlocks=1;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW ENGINE INNODB STATUS;

このコマンドを実行すると、「Type」「Name」「Status」の3つのカラムを持つ結果セットが返され、Status欄には以下のようなInnoDBモニターの出力が表示されます。

=====================================
INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 26 seconds
-----------------
BACKGROUND THREAD
-----------------
srv_master_thread loops: 38 srv_active, 0 srv_shutdown, 5120 srv_idle
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 127
------------
TRANSACTIONS
------------
Trx id counter 136292
Purge done for trx's n:o < 136292 undo n:o < 0 state: running but idle
History list length 27
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 283092444694336, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
--------
FILE I/O
--------
Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0]
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 549453824
Buffer pool size 32768
--------------
ROW OPERATIONS
--------------
0 queries inside InnoDB, 0 queries in queue
Number of rows inserted 80, updated 355, deleted 12, read 83378
----------------------------
END OF INNODB MONITOR OUTPUT
============================

確認時のポイント

  • LATEST DETECTED DEADLOCKセクション:SHOW ENGINE INNODB STATUSの出力には、直近に検出されたデッドロックの詳細(互いにロックを待っていたトランザクションや実行中だったSQL文など)が表示されるセクションがあります。デッドロック解析の第一歩として必ず確認しましょう。
  • エラーログとの併用:innodb_print_all_deadlocksを有効にすると、その後検出されるすべてのデッドロックがMySQLのエラーログにも記録されます。履歴として全件を残して調査したい場合は、エラーログの確認も併用すると効果的です。
  • デッドロック対策:デッドロックが頻発する場合は、複数のトランザクションでテーブルへのアクセス順序を統一したり、適切なインデックスを追加してロック範囲を狭めることで、発生頻度を抑えられます。
  1. MySQLでテーブルのすべてのフィールド(カラム)を表示する方法

    MySQLで特定のテーブルに含まれるすべてのフィールド(カラム)名を確認したい場合、information_schema.columns テーブルを利用する方法が便利です。table_schema にデータベース名、table_name に対象のテーブル名を指定することで、そのテーブルの全フィールドを一覧表示できます。基本の構文以下の構文を使うことで、指定したテーブルのすべてのカラム名を取得できます。select column_name as anyAliasName from information_schema.columns     where t

  2. MySQLでスラッシュより前の値だけを表示するためにvarchar列の行を一括更新する方法

    MySQLで「John/Smith」のようにスラッシュ(/)で区切られた文字列から、スラッシュより前の部分だけを取り出して列全体を更新したい場合があります。このようなときは、UPDATEコマンドとSUBSTRING_INDEX()関数を組み合わせることで実現できます。本記事では、実際のサンプルを使いながら、varchar列に保存されたスラッシュ区切りの値を、スラッシュより前の値へ一括更新する手順を解説します。1. サンプルテーブルの作成まず、テーブルを作成します。mysql> create table demo69 -> ( -> name varchar(40) ->