2011年 1月 26日 はてなブックマーク -
タグ: #MySQL

mysqladmin processlist で確認できる一般的な状態は以下のとおりです。

  • Checking table スレッドがテーブルの自動チェックを実行している。

  • Closing tables スレッドが、変更されたテーブルデータをディスクにフラッシュし、使用したテーブルを閉じている。これには通常それほど時間がかからない。時間がかかる場合、ディスクの使用率をチェックする必要がある。

  • Connect Out マスタに接続しているスレーブ。

  • Copying to tmp table on disk テンポラリ結果セットが tmp_table_size よりも大きく、スレッドがメモリベースのテンポラリテーブルをディスクベースに変更して、メモリの節約を図っている。

  • Creating tmp table スレッドは、クエリの結果の一部を保持するためのテンポラリテーブルを作成中。

  • deleting from main table 複数テーブルを削除する最初の段階で、最初のテーブルを削除中。

  • deleting from reference tables 複数テーブルを削除する 2 番目の段階で、他のテーブルから、一致したレコードを削除中。

  • Flushing tables スレッドが FLUSH TABLES を実行中。すべてのスレッドによりそのテーブルが閉じられるのを待っている。

  • Killed 誰かがスレッドを強制終了の命令を出したため、次回のキルフラグチェック時に強制終了される。MySQL では大きな各ループでフラグがチェックされるが、それでもスレッド終了には少し時間がかかる場合がある。スレッドが他のスレッドによってロックされている場合、そのロックが解除されたところで強制終了が実行される。

  • Sending data スレッドは SELECT ステートメントのレコードを処理中で、かつクライアントにデータを送信中。

  • Sorting for group スレッドは、GROUP BY のソートを実行中。

  • Sorting for order スレッドは、ORDER BY のソートを実行中。

  • Opening tables スレッドがテーブルを開こうとしている。これは、何かが妨害していなければすぐに終わるはずである。たとえば、ALTER TABLELOCK TABLE などにより、そのコマンドの終了時までテーブルが開かないことがある。

  • Removing duplicates クエリで SELECT DISTINCT が使用されたが、MySQL は初期段階で重複を除外する最適化を実行できなかった。このため、MySQL は結果をクライアントに送信する前に、重複レコードを削除する段階を踏む必要がある。

  • Reopen table スレッドはテーブルのロックを取得したが、ロック取得後、下のテーブル構造が変更されていることを認識した。このため、ロックを解除し、テーブルを閉じて、再び開こうとしている。

  • Repair by sorting 修復コードがソートを使用してインデックスを作成している。

  • Repair with keycache 修復コードが、キーキャッシュにより、キーを 1 つずつ作成している。これは、Repair by sorting よりも大幅に時間がかかる。

  • Searching rows for update スレッドがレコード更新の初期段階として、更新対象の一致レコードを検索中である。レコード検索に使用するインデックスを UPDATE が変更すると、この段階が必要となる。

  • Sleeping スレッドが、クライアントから新しいコマンドが送信されるのを待っている。

  • System lock スレッドが、テーブルの外部システムロックを待っている。同じテーブルにアクセスする複数の mysqld サーバを使用していない場合、--skip-external-locking オプションでシステムロックを無効にできる。

  • Upgrading lock INSERT DELAYED ハンドラが、レコード挿入のためにテーブルをロックしようとしている。

  • Updating スレッドが更新対象レコードを検索して更新している。

  • User Lock スレッドが GET_LOCK() を待っている。

  • Waiting for tables 下のテーブル構造が変更されているため、テーブルを開き直して新しい構造を取得する必要があるという通知をスレッドが受け取った。テーブルを開き直すためには、他のすべてのスレッドがそのテーブルを閉じるのを待つ必要がある。

    この通知は、他のスレッドがそのテーブルに対して FLUSH TABLESFLUSH TABLES table_nameALTER TABLERENAME TABLEREPAIR TABLEANALYZE TABLEOPTIMIZE TABLE のいずれかを実行している場合に発生する。

  • waiting for handler insert INSERT DELAYED ハンドラがすべての挿入処理を完了し、新規の挿入を待機中である。

ほとんどの状態はすぐに終わります。何秒も同じ状態が続く場合は、問題のある可能性があるので、調査が必要です。

第4章 データベース管理

1年前 | | 2011年 1月 26日 | このエントリーを含むはてなブックマーク