バージョン 3.23.42 より、InnoDB
の内部状態に関する情報を出力する InnoDB
モニタが InnoDB
に組み込まれました。 バージョン 3.23.52
および 4.0.3 より、SQL コマンド SHOW INNODB
STATUS
を使用して、標準 InnoDB
モニタの出力を SQL
クライアントへ取り込めるようになりました。
このデータは、パフォーマンスチューニングに役立ちます。mysql
対話型 SQL
クライアントを使用している場合は、ステートメントの末尾にあるセミコロンを
\G
に置き換えることで、出力が判読しやすくなります。
SHOW INNODB STATUS\G
InnoDB モニタのもう 1
つの使い方として、サーバ
mysqld
の標準出力に InnoDB
モニタから継続的にデータを書き込むことができます(注意:
MySQL
クライアントからは何も出力されません)。
この機能をオンにすると、InnoDB
モニタは約 15
秒ごとにデータを出力するようになります。mysqld
をデーモンとして実行すると、通常はこの出力が
MySQL datadir
内の
.err
ログに出力されます。
このデータは、パフォーマンスチューニングに役立ちます。
Windows でこの出力を MS-DOS
コマンドプロンプトにリダイレクトするには、MS-DOS
コマンドプロンプトから --console
オプションを指定して mysqld-max
を実行する必要があります。
別途用意されている
innodb_lock_monitor
では、innodb_monitor
と同じ情報に加えて、各トランザクションが設定したロックに関する情報も出力されます。
出力される情報には、以下に関するデータが含まれます。
トランザクションのロックの取得待ち
スレッドのセマフォ待ち
保留中のファイル I/O 要求
バッファプールの統計情報
InnoDB
のメインスレッドのパージおよび挿入バッファマージ活動
InnoDB モニタは、次の SQL コマンドで起動できます。
CREATE TABLE innodb_monitor (a INT) TYPE = innodb;
また、次のコマンドで停止できます。
DROP TABLE innodb_monitor;
CREATE TABLE
構文は、MySQL SQL
パーサを通して InnoDB
エンジンにコマンドを渡す手段に過ぎません。作成されたテーブルは
InnoDB
モニタとまったく無関係です。モニタの実行中にデータベースをシャットダウンし、その後で再びモニタを起動する場合は、まず作成したテーブルを破棄しないと、新たな
CREATE TABLE
発行してモニタを起動することができません。
この構文は、将来のリリースで変更される可能性があります。
次に示すのは、InnoDB モニタの出力サンプルです。
================================ 010809 18:45:06 INNODB MONITOR OUTPUT ================================ -------------------------- LOCKS HELD BY TRANSACTIONS -------------------------- LOCK INFO: Number of locks in the record hash table 1294 LOCKS FOR TRANSACTION ID 0 579342744 TABLE LOCK table test/mytable trx id 0 582333343 lock_mode IX RECORD LOCKS space id 0 page no 12758 n bits 104 table test/mytable index PRIMARY trx id 0 582333343 lock_mode X Record lock, heap no 2 PHYSICAL RECORD: n_fields 74; 1-byte offs FALSE; info bits 0 0: len 4; hex 0001a801; asc ;; 1: len 6; hex 000022b5b39f; asc ";; 2: len 7; hex 000002001e03ec; asc ;; 3: len 4; hex 00000001; ... ----------------------------------------------- CURRENT SEMAPHORES RESERVED AND SEMAPHORE WAITS ----------------------------------------------- SYNC INFO: Sorry, cannot give mutex list info in non-debug version! Sorry, cannot give rw-lock list info in non-debug version! ----------------------------------------------------- SYNC ARRAY INFO: reservation count 6041054, signal count 2913432 4a239430 waited for by thread 49627477 op. S-LOCK file NOT KNOWN line 0 Mut ex 0 sp 5530989 r 62038708 sys 2155035; rws 0 8257574 8025336; rwx 0 1121090 1848344 ----------------------------------------------------- CURRENT PENDING FILE I/O'S -------------------------- Pending normal aio reads: Reserved slot, messages 40157658 4a4a40b8 Reserved slot, messages 40157658 4a477e28 ... Reserved slot, messages 40157658 4a4424a8 Reserved slot, messages 40157658 4a39ea38 Total of 36 reserved aio slots Pending aio writes: Total of 0 reserved aio slots Pending insert buffer aio reads: Total of 0 reserved aio slots Pending log writes or reads: Reserved slot, messages 40158c98 40157f98 Total of 1 reserved aio slots Pending synchronous reads or writes: Total of 0 reserved aio slots ----------- BUFFER POOL ----------- LRU list length 8034 Free list length 0 Flush list length 999 Buffer pool size in pages 8192 Pending reads 39 Pending writes: LRU 0, flush list 0, single page 0 Pages read 31383918, created 51310, written 2985115 ---------------------------- END OF INNODB MONITOR OUTPUT ============================ 010809 18:45:22 InnoDB starts purge 010809 18:45:22 InnoDB purged 0 pages
この出力についていくつかの注釈があります。
LOCKS HELD BY TRANSACTIONS
セクションにロック待ちが報告されている場合は、アプリケーションでロックが競合しているおそれがある。この出力から、トランザクションのデッドロックの原因を追跡することもできる。
univ.i
に
UNIV_SYNC_DEBUG
を定義して InnoDB
をコンパイルすると、SYNC INFO
セクションに予約済みのセマフォが報告される。
SYNC ARRAY INFO
セクションには、セマフォを待っているスレッドと、スレッドがスピンまたは相互排他ロック(mutex)
や
読み書きロックでの待機を必要とした回数に関する統計情報が報告される。多数のスレッドがセマフォを待っている場合は、ディスク
I/O または InnoDB
内部の競合が原因となっている可能性がある。競合の原因としては、多数のクエリを並行して処理しているか、オペレーティングシステムでのスレッドのスケジューリングに問題があることが考えられる。
CURRENT PENDING FILE I/O'S
セクションには、保留中のファイル I/O
要求が列挙される。この数が多い場合は、作業負荷がディスク
I/O バウンドであることを示している。
BUFFER POOL
セクションには、読み書きされたページに関する統計情報が示される。これらの数値から、クエリが現在実行しているデータファイル
I/O の回数を計算できる。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.