MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  一般クエリーログおよびスロークエリーログの出力先の選択

5.4.1 一般クエリーログおよびスロークエリーログの出力先の選択

MySQL Server では、一般クエリーログおよびスロークエリーログが有効になっている場合は、それらのログに書き込まれる出力先を柔軟に制御できます。 ログエントリに使用可能な宛先は、ログファイル、または mysql システムデータベース内の general_log テーブルと slow_log テーブルです。 ファイル出力またはテーブル出力、あるいはその両方を選択できます。

サーバー起動時のログ制御

log_output システム変数は、ログ出力の出力先を指定します。 この変数を単独で設定してもログは有効になりません。個別に有効にする必要があります。

  • 起動時に log_output が指定されていない場合、デフォルトのロギング先は FILE です。

  • 起動時に log_output が指定された場合、その値は TABLE (テーブルに記録)、FILE (ファイルに記録) または NONE (テーブルまたはファイルに記録しない) から選択されたカンマ区切りの単語のリストです。 NONE がある場合は、ほかの指定子よりも優先されます。

general_log システム変数は、選択されたログ出力先についての一般クエリーログへのロギングを制御します。 サーバー起動時に指定された場合、general_log は、ログを有効化または無効化するためのオプション引数 1 または 0 を取ります。 ファイルロギングについて、デフォルト以外のファイル名を指定するには、general_log_file 変数を設定します。 同様に、slow_query_log 変数は、選択された出力先についてのスロークエリーログへのロギングを制御し、slow_query_log_file の設定は、ファイルロギングのためのファイル名を指定します。 いずれかのログが有効化された場合、サーバーは対応するログファイルを開き、ログファイルに起動メッセージを書き込みます。 ただし、FILE ログの出力先が選択されないかぎり、ファイルに対するそれ以上のクエリーのロギングは実行されません。

例:

  • 一般クエリーログエントリをログテーブルおよびログファイルに書き込むには、--log_output=TABLE,FILE を使用してログの宛先と --general_log の両方を選択し、一般クエリーログを有効にします。

  • 一般クエリーログエントリとスロークエリーログエントリのみをログテーブルに書き込むには、--log_output=TABLE を使用してログの宛先としてテーブルを選択し、--general_log--slow_query_log を使用して両方のログを有効にします。

  • スロークエリーログエントリをログファイルにのみ書き込むには、--log_output=FILE を使用してログの宛先としてファイルを選択し、--slow_query_log を使用してスロークエリーログを有効にします。 この場合、デフォルトのログ保存先は FILE であるため、log_output 設定を省略できます。

実行時のログ制御

ログテーブルおよびファイルに関連付けられたシステム変数によって、ロギングへの実行時制御が可能になります。

  • log_output 変数は、現在のロギング先を示します。 出力先を変更するために、これを実行時に変更できます。

  • general_log および slow_query_log 変数は、一般クエリーログとスロークエリーログが有効 (ON) か無効 (OFF) かを示します。 これらの変数を実行時に設定して、ログを有効化するかどうかを制御することができます。

  • general_log_file および slow_query_log_file 変数は、一般クエリーログおよびスロークエリーログファイルの名前を示します。 これらの変数をサーバー起動時または実行時に設定して、ログファイルの名前を変更することができます。

  • 現在のセッションの一般クエリーロギングを無効または有効にするには、セッション sql_log_off 変数を ON または OFF に設定します。 (これは、一般クエリーログ自体が有効になっていることを前提としています。)

ログテーブルの利点と特性

ログ出力用のテーブルを使用することには、次の利点があります。

  • ログエントリが標準形式を持ちます。 ログテーブルの現在の構造を表示するには、次のステートメントを使用します。

    SHOW CREATE TABLE mysql.general_log;
    SHOW CREATE TABLE mysql.slow_log;
  • ログ内容に SQL ステートメントを使用してアクセスできます。 これにより、特定の基準を満たすログエントリのみ選択するクエリーを使用することができます。 たとえば、特定のクライアントに関連したログ内容を選択するには (そのクライアントからの問題のあるクエリーを特定するために役立つことがあります)、ログファイルよりもログテーブルを使用して行う方が簡単です。

  • サーバーに接続してクエリーを発行できるすべてのクライアントを介して、ログにリモートからアクセスできます (クライアントが適切なログテーブル権限を持つ場合)。 サーバーホストにログインしてファイルシステムに直接アクセスする必要はありません。

ログテーブルの実装には次の特徴があります。

  • 一般的に、ログテーブルの主な目的は、サーバーのランタイム実行を観察するユーザーにインタフェースを提供することで、サーバーのランタイム実行を妨げません。

  • CREATE TABLEALTER TABLE、および DROP TABLE はログテーブル上での有効な操作です。 ALTER TABLE および DROP TABLE の場合、ログテーブルは使用中であってはならず、あとで説明するように無効にする必要があります。

  • デフォルトでは、ログテーブルは、カンマ区切り値形式でデータを書き込む CSV ストレージエンジンを使用します。 ログテーブルデータを含む .CSV ファイルにアクセスするユーザーの場合、CSV 入力を処理できるスプレッドシートなどのほかのプログラムにファイルを簡単にインポートできます。

    ログテーブルは、MyISAM ストレージエンジンを使用するように変更することができます。 使用中のログテーブルを変更するために、ALTER TABLE を使用することはできません。 ログを最初に無効にする必要があります。 CSV または MyISAM 以外のすべてのエンジンは、ログテーブルについて適正ではありません。

    ログテーブルおよび「開いているファイルが多すぎます」エラー.  ログの宛先として TABLE を選択し、ログテーブルが CSV ストレージエンジンを使用している場合、一般クエリーログまたはスロークエリーログを実行時に繰り返し無効にして有効にすると、.CSV ファイル用に多数のオープンファイル記述子が生成され、「開いているファイルが多すぎます」エラーが発生する可能性があります。 この問題を回避するには、FLUSH TABLES を実行するか、open_files_limit の値が table_open_cache_instances の値より大きいことを確認します。

  • ログテーブルを変更 (または削除) できるようにロギングを無効化するには、次の方法を使用することができます。 この例では一般クエリーログを使用しており、スロークエリーログについての手順も類似していますが、slow_log テーブルおよび slow_query_log システム変数を使用します。

    SET @old_log_state = @@GLOBAL.general_log;
    SET GLOBAL general_log = 'OFF';
    ALTER TABLE mysql.general_log ENGINE = MyISAM;
    SET GLOBAL general_log = @old_log_state;
  • TRUNCATE TABLE は、ログテーブル上での有効な操作です。 ログエントリを期限切れにするために使用できます。

  • RENAME TABLE は、ログテーブル上での有効な操作です。 次の方法を使用して、(たとえばログローテーションを実行するために) ログテーブルを原子的に名前変更できます。

    USE mysql;
    DROP TABLE IF EXISTS general_log2;
    CREATE TABLE general_log2 LIKE general_log;
    RENAME TABLE general_log TO general_log_backup, general_log2 TO general_log;
  • CHECK TABLE は、ログテーブル上での有効な操作です。

  • LOCK TABLES をログテーブル上で使用することはできません。

  • INSERTDELETE、および UPDATE をログテーブル上で使用することはできません。 これらの操作は、サーバー自体の内部でのみ許可されます。

  • FLUSH TABLES WITH READ LOCK および read_only システム変数の状態は、ログテーブルには影響しません。 サーバーは常にログテーブルに書き込むことができます。

  • ログテーブルに書き込まれたエントリはバイナリログに書き込まれないため、複製に複製されません。

  • ログテーブルまたはログファイルをフラッシュするには、FLUSH TABLES または FLUSH LOGS をそれぞれ使用します。

  • ログテーブルのパーティション化は許可されません。

  • mysqldump ダンプには、ダンプファイルのリロード後に欠落しないように、これらのテーブルを再作成するステートメントが含まれています。 ログテーブルの内容はダンプされません。


関連キーワード:  ログ, テーブル, サーバー, 変数, general, TABLE, 一般, 実行, 出力, 選択