MySQL(InnoDB)でグローバルロックを確認する方法【SHOW ENGINE INNODB STATUS】
MySQL(InnoDB)でグローバルロックやロックの競合状況を確認したい場合は、SHOW ENGINE INNODB STATUS コマンドを使用します。このコマンドを実行すると、ロックの所有者や待機中のトランザクションに加えて、InnoDBのトランザクションIDなど、より詳細な内部情報も併せて確認できます。
確認手順
MySQLのコマンドラインから、以下のクエリを実行してください。末尾の \G は、出力結果を読みやすく縦方向に整形して表示するための指定です。
mysql> SHOW ENGINE INNODB STATUS\G
実行結果の出力例
以下は実際の出力例です。特に「TRANSACTIONS」セクションでは、各セッションのトランザクション状態や、ロック構造(lock struct)の数、ヒープサイズ、行ロック(row lock)の数などを確認できます。
*************************** 1. row *************************** Type: InnoDB Name: Status: ===================================== 2019-01-23 14:46:58 0x2914 INNODB MONITOR OUTPUT ===================================== Per second averages calculated from the last 23 seconds ----------------- BACKGROUND THREAD ----------------- srv_master_thread loops: 87 srv_active, 0 srv_shutdown, 51953 srv_idle srv_master_thread log flush and writes: 0 ---------- SEMAPHORES ---------- OS WAIT ARRAY INFO: reservation count 244 OS WAIT ARRAY INFO: signal count 241 RW-shared spins 23, rounds 37, OS waits 14 RW-excl spins 16, rounds 380, OS waits 9 RW-sx spins 1, rounds 4, OS waits 0 Spin rounds per wait: 1.61 RW-shared, 23.75 RW-excl, 4.00 RW-sx ------------ TRANSACTIONS ------------ Trx id counter 60219 Purge done for trx's n:o < 60218 undo n:o < 0 state: running but idle History list length 32 LIST OF TRANSACTIONS FOR EACH SESSION: ---TRANSACTION 284507225290560, not started 0 lock struct(s), heap size 1136, 0 row lock(s) -------- FILE I/O -------- I/O thread 0 state: wait Windows aio (insert buffer thread) I/O thread 1 state: wait Windows aio (log thread) I/O thread 2 state: wait Windows aio (read thread) I/O thread 3 state: wait Windows aio (read thread) I/O thread 4 state: wait Windows aio (read thread) I/O thread 5 state: wait Windows aio (read thread) I/O thread 6 state: wait Windows aio (write thread) I/O thread 7 state: wait Windows aio (write thread) I/O thread 8 state: wait Windows aio (write thread) I/O thread 9 state: wait Windows aio (write thread) Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] , ibuf aio reads:, log i/o's:, sync i/o's: Pending flushes (fsync) log: 0; buffer pool: 0 2134 OS file reads, 2843 OS file writes, 1186 OS fsyncs 0.00 reads/s, 0 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s ------------------------------------- INSERT BUFFER AND ADAPTIVE HASH INDEX ------------------------------------- Ibuf: size 1, free list len 0, seg size 2, 0 merges merged operations: insert 0, delete mark 0, delete 0 discarded operations: insert 0, delete mark 0, delete 0 Hash table size 2267, node heap has 0 buffer(s) Hash table size 2267, node heap has 1 buffer(s) Hash table size 2267, node heap has 1 buffer(s) Hash table size 2267, node heap has 1 buffer(s) Hash table size 2267, node heap has 0 buffer(s) Hash table size 2267, node heap has 0 buffer(s) Hash table size 2267, node heap has 0 buffer(s) Hash table size 2267, node heap has 0 buffer(s) 0.00 hash searches/s, 0.00 non-hash searches/s --- LOG --- Log sequence number 44174557 Log buffer assigned up to 44174557 Log buffer completed up to 44174557 Log written up to 44174557 Log flushed up to 44174557 Added dirty pages up to 44174557 Pages flushed up to 44174557 Last checkpoint at 44174557 1117 log i/o's done, 0.00 log i/o's/second ---------------------- BUFFER POOL AND MEMORY ---------------------- Total large memory allocated 8585216 Dictionary memory allocated 503201 Buffer pool size 512 Free buffers 253 Database pages 256 Old database pages 0 Modified db pages 0 Pending reads 0 Pending writes: LRU 0, flush list 0, single page 0 Pages made young 0, not young 0 0.00 youngs/s, 0.00 non-youngs/s Pages read 2111, created 215, written 1437 0.00 reads/s, 0.00 creates/s, 0.00 writes/s No buffer pool page gets since the last printout Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s LRU len: 256, unzip_LRU len: 0 I/O sum[0]:cur[0], unzip sum[0]:cur[0] -------------- ROW OPERATIONS -------------- 0 queries inside InnoDB, 0 queries in queue 0 read views open inside InnoDB Process ID=8992, Main thread ID=00000000000029F4 , state=sleeping Number of rows inserted 247, updated 512, deleted 19, read 6593 0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s ---------------------------- END OF INNODB MONITOR OUTPUT ============================ 1 row in set (0.00 sec)
出力の主なセクションと見どころ
- SEMAPHORES:内部の同期処理(ラッチ)に関する統計。スピンロックの競合状況がわかります。
- TRANSACTIONS:トランザクションIDカウンターや、各セッションのトランザクション一覧、ロック構造の数、行ロックの数を確認できます。ロック待ちの調査では最も重要なセクションです。
- FILE I/O:I/Oスレッドの状態や保留中の読み書き件数。
- BUFFER POOL AND MEMORY:バッファプールの使用状況やメモリ割り当て量。
- ROW OPERATIONS:InnoDB内で実行中のクエリ数や、挿入・更新・削除・読み取りされた行数の統計。
補足:MySQL 8.0以降でのロック確認方法
MySQL 8.0以降では、performance_schema のテーブルを利用することで、より柔軟にロック情報を取得できます。data_locks テーブルで現在保持されているロックの一覧を、data_lock_waits テーブルでロック待ちの関係(ブロックしている側と待っている側)をそれぞれ確認できます。
-- 保持されているロックの一覧 SELECT * FROM performance_schema.data_locks; -- ロック待ちの関係を確認 SELECT * FROM performance_schema.data_lock_waits;
また、information_schema.INNODB_TRX を参照すれば、実行時間の長いトランザクションを特定でき、ロック競合の原因調査にも役立ちます。トラブルシューティングの際には、これらのビューと SHOW ENGINE INNODB STATUS を組み合わせて確認すると効率的です。
-
MySQLで非ASCII文字を検出する方法:HEX関数とREGEXPを使った実践テクニック
MySQLで非ASCII文字を見つけるには?非ASCII文字とは、ポンド記号(£)、商標記号(™)、プラスマイナス記号(±)など、ASCIIコードの範囲外に属する文字のことです。データベースのクリーニングや文字化け対策では、テーブル内に含まれる非ASCII文字を特定したいケースがよくあります。ここでは、MySQLでテーブルから非ASCII文字を含むレコードを検出する手順を、具体的な例とともに解説します。ステップ1:テーブルを作成するまず、CREATE文を使って検証用のテーブルを作成します。mysql> CREATE table NonASciiDemo-> (-> NonAS
-
MySQLでInnoDBをインストールまたは有効化する方法
MySQLでInnoDBストレージエンジンを有効にするには、設定ファイルmy.ini(Linux環境の場合はmy.cnf)を編集する必要があります。MySQL 8以降ではInnoDBがデフォルトなお、MySQL 8.0以降では、デフォルトのストレージエンジンとしてInnoDBが標準で採用されているため、通常は特別な設定を行わなくてもInnoDBを使用できます。現在の設定はmy.iniファイルで確認しましょう。デフォルトストレージエンジンを明示的に指定したい場合は、設定ファイルに以下のように記述します。[mysqld]default-storage-engine=InnoDBまた、サーバー側で現