Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.2Mb


このページは機械翻訳したものです。

6.4.5.4 監査ログファイル形式

MySQL サーバーは、監査可能なイベントが発生するたびに、監査ログプラグインを呼び出して監査レコードをそのログファイルに書き込みます。 通常、プラグインの起動後に書き込まれる最初の監査レコードには、サーバーの説明と起動オプションが含まれます。 そのあとの要素は、クライアントの接続および切断イベント、SQL ステートメントの実行などのイベントを表します。 最上位のステートメントのみのログが記録され、トリガーやストアドプロシージャーなどのストアドプログラム内のステートメントのログは記録されません。 LOAD DATA などのステートメントで参照されるファイルの内容は記録されません。

監査ログプラグインがログファイルの書き込みに使用するログ形式を選択するには、サーバーの起動時に audit_log_format システム変数を設定します。 次の形式を使用できます:

  • 新しいスタイルの XML 形式 (audit_log_format=NEW): 古い形式の XML 形式よりも Oracle Audit Vault との互換性が高いXML形式。 MySQL 8.0 では、デフォルトで新しいスタイルの XML 形式が使用されます。

  • 「古いスタイルの XML」形式 (audit_log_format=OLD): 古い MySQL シリーズでデフォルトで使用される元の監査ログ形式。

  • JSON 形式 (audit_log_format=JSON)

デフォルトでは、監査ログファイルの内容は、圧縮や暗号化を行わずに新しい形式の XML 形式で書き込まれます。

注記

ログ形式を変更する際に考慮する問題の詳細は、監査ログファイル形式の選択 を参照してください。

次の各セクションでは、使用可能な監査ロギング形式について説明します:

新規スタイルの XML 監査ログファイル形式

次に、読みやすくするために若干再フォーマットされた新しい形式の XML 形式 (audit_log_format=NEW) のサンプルログファイルを示します:

<?xml version="1.0" encoding="utf-8"?>
<AUDIT>
 <AUDIT_RECORD>
  <TIMESTAMP>2019-10-03T14:06:33 UTC</TIMESTAMP>
  <RECORD_ID>1_2019-10-03T14:06:33</RECORD_ID>
  <NAME>Audit</NAME>
  <SERVER_ID>1</SERVER_ID>
  <VERSION>1</VERSION>
  <STARTUP_OPTIONS>/usr/local/mysql/bin/mysqld
    --socket=/usr/local/mysql/mysql.sock
    --port=3306</STARTUP_OPTIONS>
  <OS_VERSION>i686-Linux</OS_VERSION>
  <MYSQL_VERSION>5.7.21-log</MYSQL_VERSION>
 </AUDIT_RECORD>
 <AUDIT_RECORD>
  <TIMESTAMP>2019-10-03T14:09:38 UTC</TIMESTAMP>
  <RECORD_ID>2_2019-10-03T14:06:33</RECORD_ID>
  <NAME>Connect</NAME>
  <CONNECTION_ID>5</CONNECTION_ID>
  <STATUS>0</STATUS>
  <STATUS_CODE>0</STATUS_CODE>
  <USER>root</USER>
  <OS_LOGIN/>
  <HOST>localhost</HOST>
  <IP>127.0.0.1</IP>
  <COMMAND_CLASS>connect</COMMAND_CLASS>
  <CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE>
  <CONNECTION_ATTRIBUTES>
   <ATTRIBUTE>
    <NAME>_pid</NAME>
    <VALUE>42794</VALUE>
   </ATTRIBUTE>
   ...
   <ATTRIBUTE>
    <NAME>program_name</NAME>
    <VALUE>mysqladmin</VALUE>
   </ATTRIBUTE>
  </CONNECTION_ATTRIBUTES>
  <PRIV_USER>root</PRIV_USER>
  <PROXY_USER/>
  <DB>test</DB>
 </AUDIT_RECORD>

...

 <AUDIT_RECORD>
  <TIMESTAMP>2019-10-03T14:09:38 UTC</TIMESTAMP>
  <RECORD_ID>6_2019-10-03T14:06:33</RECORD_ID>
  <NAME>Query</NAME>
  <CONNECTION_ID>5</CONNECTION_ID>
  <STATUS>0</STATUS>
  <STATUS_CODE>0</STATUS_CODE>
  <USER>root[root] @ localhost [127.0.0.1]</USER>
  <OS_LOGIN/>
  <HOST>localhost</HOST>
  <IP>127.0.0.1</IP>
  <COMMAND_CLASS>drop_table</COMMAND_CLASS>
  <SQLTEXT>DROP TABLE IF EXISTS t</SQLTEXT>
 </AUDIT_RECORD>

...

 <AUDIT_RECORD>
  <TIMESTAMP>2019-10-03T14:09:39 UTC</TIMESTAMP>
  <RECORD_ID>8_2019-10-03T14:06:33</RECORD_ID>
  <NAME>Quit</NAME>
  <CONNECTION_ID>5</CONNECTION_ID>
  <STATUS>0</STATUS>
  <STATUS_CODE>0</STATUS_CODE>
  <USER>root</USER>
  <OS_LOGIN/>
  <HOST>localhost</HOST>
  <IP>127.0.0.1</IP>
  <COMMAND_CLASS>connect</COMMAND_CLASS>
  <CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE>
 </AUDIT_RECORD>

...

 <AUDIT_RECORD>
  <TIMESTAMP>2019-10-03T14:09:43 UTC</TIMESTAMP>
  <RECORD_ID>11_2019-10-03T14:06:33</RECORD_ID>
  <NAME>Quit</NAME>
  <CONNECTION_ID>6</CONNECTION_ID>
  <STATUS>0</STATUS>
  <STATUS_CODE>0</STATUS_CODE>
  <USER>root</USER>
  <OS_LOGIN/>
  <HOST>localhost</HOST>
  <IP>127.0.0.1</IP>
  <COMMAND_CLASS>connect</COMMAND_CLASS>
  <CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE>
 </AUDIT_RECORD>
 <AUDIT_RECORD>
  <TIMESTAMP>2019-10-03T14:09:45 UTC</TIMESTAMP>
  <RECORD_ID>12_2019-10-03T14:06:33</RECORD_ID>
  <NAME>NoAudit</NAME>
  <SERVER_ID>1</SERVER_ID>
 </AUDIT_RECORD>
</AUDIT>

監査ログファイルは、UTF-8 (1 文字当たり最大 4 バイト) を使用した XML として記述されています。 ルート要素は、<AUDIT> です。 ルート要素には、<AUDIT_RECORD> 要素が含まれています。この要素のそれぞれは、監査対象のイベントに関する情報を提供します。 監査ログプラグインは、新しいログファイルの書き込みを開始すると、XML 宣言と開始 <AUDIT> ルート要素タグを書き込みます。 プラグインは、ログファイルを閉じると、終了 </AUDIT> ルート要素タグを書き込みます。 ファイルが開いている間は、終了タグは存在しません。

<AUDIT_RECORD> 要素内の要素には、次の特性があります:

  • 一部の要素はすべての <AUDIT_RECORD> 要素に表示されます。 その他はオプションで、監査レコードタイプに応じて表示される場合があります。

  • <AUDIT_RECORD> 要素内の要素の順序は保証されません。

  • 要素値が固定長ではありません。 長い値は、後で説明する要素の説明に従って切り捨てられる場合があります。

  • <>"、および & 文字は、それぞれ &lt;&gt;&quot;、および &amp; としてエンコードされます。 NUL バイト (U+00) は、? 文字としてエンコードされます。

  • XML 文字として有効でない文字は、数値の文字参照を使用してエンコードされます。 有効な XML 文字は次のとおりです。

    #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

次の要素は、すべての <AUDIT_RECORD> 要素で必須です。

  • <NAME>

    監査イベントを生成した命令 (サーバーがクライアントから受信したコマンドなど) のタイプを表す文字列。

    例:

    <NAME>Query</NAME>

    一部の一般的な <NAME> 値:

    Audit    When auditing starts, which may be server startup time
    Connect  When a client connects, also known as logging in
    Query    An SQL statement (executed directly)
    Prepare  Preparation of an SQL statement; usually followed by Execute
    Execute  Execution of an SQL statement; usually follows Prepare
    Shutdown Server shutdown
    Quit     When a client disconnects
    NoAudit  Auditing has been turned off

    使用可能な値は Audit, Binlog Dump, Change user, Close stmt, Connect Out, Connect, Create DB, Daemon, Debug, Delayed insert, Drop DB, Execute, Fetch, Field List, Init DB, Kill, Long Data, NoAudit, Ping, Prepare, Processlist, Query, Quit, Refresh, Register Slave, Reset stmt, Set option, Shutdown, Sleep, Statistics, Table Dump, TableDelete, TableInsert, TableRead, TableUpdate, Time です。

    これらの値の多くは、my_command.h ヘッダーファイルにリストされている COM_xxx コマンド値に対応しています。 たとえば、Create DB および Change user は、それぞれ COM_CREATE_DB および COM_CHANGE_USER に対応します。

    TableXXX<NAME> 値を持つイベントには、Query イベントが付随します。 たとえば、次のステートメントは、1 つの Query イベント、2 つの TableRead イベントおよび TableInsert イベントを生成します:

    INSERT INTO t3 SELECT t1.* FROM t1 JOIN t2;

    TableXXX イベントには、イベントが参照するテーブルを識別する <DB> および <TABLE> 要素が含まれます。

  • <RECORD_ID>

    監査レコードを表す一意の識別子。 この値はシーケンス番号とタイムスタンプで構成され、形式は SEQ_TIMESTAMP です。 監査ログプラグインが監査ログファイルを開くと、順序番号が監査ログファイルのサイズに初期化され、記録されるレコードごとに順序が 1 ずつ増分されます。 タイムスタンプは、監査ログプラグインがファイルを開いた日時を示す YYYY-MM-DDThh:mm:ss 形式の UTC 値です。

    例:

    <RECORD_ID>12_2019-10-03T14:06:33</RECORD_ID>
  • <TIMESTAMP>

    監査イベントが生成された日時を示す YYYY-MM-DDThh:mm:ss UTC 形式の UTC 値を表す文字列。 たとえば、クライアントから受信した SQL ステートメントの実行に対応するイベントの <TIMESTAMP> 値は、受信時ではなく、ステートメントの終了後に発生します。

    例:

    <TIMESTAMP>2019-10-03T14:09:45 UTC</TIMESTAMP>

次の要素は、<AUDIT_RECORD> 要素ではオプションです。 これらの多くは、特定の <NAME> 要素値でのみ発生します。

  • <COMMAND_CLASS>

    実行されたアクションのタイプを示す文字列。

    例:

    <COMMAND_CLASS>drop_table</COMMAND_CLASS>

    値は statement/sql/xxx コマンドカウンタに対応しています。 たとえば、xxx は、DROP TABLE および SELECT ステートメントのそれぞれ drop_table および select です。 次のステートメントは、使用可能な名前を表示します:

    SELECT REPLACE(EVENT_NAME, 'statement/sql/', '') AS name
    FROM performance_schema.events_statements_summary_global_by_event_name
    WHERE EVENT_NAME LIKE 'statement/sql/%'
    ORDER BY name;
  • <CONNECTION_ATTRIBUTES>

    MySQL 8.0.19 では、<COMMAND_CLASS> 値が connect のイベントに <CONNECTION_ATTRIBUTES> 要素が含まれ、接続時にクライアントによって渡される接続属性が表示される場合があります。 (「パフォーマンススキーマ」テーブルでも公開されるこれらの属性の詳細は、セクション27.12.9「パフォーマンススキーマ接続属性テーブル」 を参照してください。)

    <CONNECTION_ATTRIBUTES> 要素には属性ごとに 1 つの <ATTRIBUTE> 要素が含まれ、それぞれに属性名と値を示す <NAME> 要素と <VALUE> 要素が含まれます。

    例:

    <CONNECTION_ATTRIBUTES>
     <ATTRIBUTE>
      <NAME>_pid</NAME>
      <VALUE>42794</VALUE>
     </ATTRIBUTE>
     <ATTRIBUTE>
      <NAME>_os</NAME>
      <VALUE>macos10.14</VALUE>
     </ATTRIBUTE>
     <ATTRIBUTE>
      <NAME>_platform</NAME>
      <VALUE>x86_64</VALUE>
     </ATTRIBUTE>
     <ATTRIBUTE>
      <NAME>_client_version</NAME>
      <VALUE>8.0.19</VALUE>
     </ATTRIBUTE>
     <ATTRIBUTE>
      <NAME>_client_name</NAME>
      <VALUE>libmysql</VALUE>
     </ATTRIBUTE>
     <ATTRIBUTE>
      <NAME>program_name</NAME>
      <VALUE>mysqladmin</VALUE>
     </ATTRIBUTE>
    </CONNECTION_ATTRIBUTES>

    イベントに接続属性が存在しない場合、何も記録されず、<CONNECTION_ATTRIBUTES> 要素は表示されません。 これは、接続試行が成功しなかった場合、クライアントが属性を渡さなかった場合、またはサーバーの起動時やプラグインによって開始されたときなどに接続が内部的に発生した場合に発生することがあります。

  • <CONNECTION_ID>

    クライアント接続識別子を表す符号なし整数。 これは、セッション内の CONNECTION_ID() 関数によって戻される値と同じです。

    例:

    <CONNECTION_ID>127</CONNECTION_ID>
  • <CONNECTION_TYPE>

    サーバーへの接続のセキュリティ状態。 許可される値は、TCP/IP (暗号化なしで確立された TCP/IP 接続)、SSL/TLS (暗号化で確立された TCP/IP 接続)、Socket (Unix ソケットファイル接続)、Named Pipe (Windows 名前付きパイプ接続) および Shared Memory (Windows 共有メモリー接続) です。

    例:

    <CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE>
  • <DB>

    デフォルトのデータベース名を表す文字列。

    例:

    <DB>test</DB>
  • <HOST>

    クライアントのホスト名を表す文字列。

    例:

    <HOST>localhost</HOST>
  • <IP>

    クライアントの IP アドレスを表す文字列。

    例:

    <IP>127.0.0.1</IP>
  • <MYSQL_VERSION>

    MySQL サーバーのバージョンを表す文字列。 これは、セッション内の VERSION() 関数または version システム変数の値と同じです。

    例:

    <MYSQL_VERSION>5.7.21-log</MYSQL_VERSION>
  • <OS_LOGIN>

    認証プロセス中に使用される外部ユーザー名を表す文字列。クライアントの認証に使用されるプラグインによって設定されます。 ネイティブ (組込み) MySQL 認証の場合、またはプラグインで値が設定されていない場合、この要素は空です。 この値は、external_user システム変数の値と同じです (セクション6.2.18「プロキシユーザー」 を参照)。

    例:

    <OS_LOGIN>jeffrey</OS_LOGIN>
  • <OS_VERSION>

    サーバーが構築された、または実行されているオペレーティングシステムを表す文字列。

    例:

    <OS_VERSION>x86_64-Linux</OS_VERSION>
  • <PRIV_USER>

    サーバーがクライアントを認証する際に使用したユーザーを表す文字列。 これは、サーバーが権限チェックを行う際に使用するユーザー名であり、<USER> の値とは異なる可能性があります。

    例:

    <PRIV_USER>jeffrey</PRIV_USER>
  • <PROXY_USER>

    プロキシユーザーを表す文字列 (セクション6.2.18「プロキシユーザー」 を参照)。 ユーザーのプロキシ処理が有効になっていない場合は、値が空です。

    例:

    <PROXY_USER>developer</PROXY_USER>
  • <SERVER_ID>

    サーバー ID を表す符号なし整数。 これは、server_id システム変数の値と同じです。

    例:

    <SERVER_ID>1</SERVER_ID>
  • <SQLTEXT>

    SQL ステートメントのテキストを表す文字列。 この値は、空にすることができます。 長い値は、切り捨てられる可能性があります。 監査ログファイル自体などの文字列は、UTF-8 (1 文字当たり最大 4 バイト) を使用して記述されるため、この値が変換の結果となる場合があります。 たとえば、元のステートメントは、SJIS 文字列としてクライアントから受信された可能性があります。

    例:

    <SQLTEXT>DELETE FROM t1</SQLTEXT>
  • <STARTUP_OPTIONS>

    MySQL サーバーの起動時に、コマンド行またはオプションファイルで指定されたオプションを表す文字列。 最初のオプションは、サーバー実行可能ファイルへのパスです。

    例:

    <STARTUP_OPTIONS>/usr/local/mysql/bin/mysqld
      --port=3306 --log_output=FILE</STARTUP_OPTIONS>
  • <STATUS>

    コマンドのステータスを表す符号なし整数 (成功した場合は 0、エラーが発生した場合はゼロ以外)。 これは、mysql_errno() C API 関数の値と同じです。 <STATUS> と異なる点については、<STATUS_CODE> の説明を参照してください。

    監査ログには、SQLSTATE 値またはエラーメッセージが含まれていません。 エラーコード、SQLSTATE 値、およびメッセージ間の関連性を確認する方法については、Server Error Message Referenceを参照してください。

    警告のログは記録されません。

    例:

    <STATUS>1051</STATUS>
  • <STATUS_CODE>

    コマンドのステータスを表す符号なし整数 (成功した場合は 0、エラーが発生した場合は 1)。

    STATUS_CODE の値は、STATUS の値とは異なります。STATUS_CODE は、成功した場合は 0、エラーが発生した場合は 1 であり、Audit Vault の EZ_collector コンシューマとの互換性があります。 STATUS は、mysql_errno() C API 関数の値です。 これは、成功した場合は 0、エラーが発生した場合はゼロ以外です。そのため、エラーが発生した場合、必ずしも 1 であるとはかぎりません。

    例:

    <STATUS_CODE>0</STATUS_CODE>
  • <TABLE>

    テーブル名を表す文字列。

    例:

    <TABLE>t3</TABLE>
  • <USER>

    クライアントによって送信されたユーザー名を表す文字列。 これは、<PRIV_USER> の値とは異なる可能性があります。

    例:

    <USER>root[root] @ localhost [127.0.0.1]</USER>
  • <VERSION>

    監査ログファイル形式のバージョンを表す符号なし整数。

    例:

    <VERSION>1</VERSION>
古い形式の XML 監査ログファイル形式

次に、読みやすくするために若干再フォーマットされた古い形式の XML 形式 (audit_log_format=OLD) のサンプルログファイルを示します:

<?xml version="1.0" encoding="utf-8"?>
<AUDIT>
  <AUDIT_RECORD
    TIMESTAMP="2019-10-03T14:25:00 UTC"
    RECORD_ID="1_2019-10-03T14:25:00"
    NAME="Audit"
    SERVER_ID="1"
    VERSION="1"
    STARTUP_OPTIONS="--port=3306"
    OS_VERSION="i686-Linux"
    MYSQL_VERSION="5.7.21-log"/>
  <AUDIT_RECORD
    TIMESTAMP="2019-10-03T14:25:24 UTC"
    RECORD_ID="2_2019-10-03T14:25:00"
    NAME="Connect"
    CONNECTION_ID="4"
    STATUS="0"
    STATUS_CODE="0"
    USER="root"
    OS_LOGIN=""
    HOST="localhost"
    IP="127.0.0.1"
    COMMAND_CLASS="connect"
    CONNECTION_TYPE="SSL/TLS"
    PRIV_USER="root"
    PROXY_USER=""
    DB="test"/>

...

  <AUDIT_RECORD
    TIMESTAMP="2019-10-03T14:25:24 UTC"
    RECORD_ID="6_2019-10-03T14:25:00"
    NAME="Query"
    CONNECTION_ID="4"
    STATUS="0"
    STATUS_CODE="0"
    USER="root[root] @ localhost [127.0.0.1]"
    OS_LOGIN=""
    HOST="localhost"
    IP="127.0.0.1"
    COMMAND_CLASS="drop_table"
    SQLTEXT="DROP TABLE IF EXISTS t"/>

...

  <AUDIT_RECORD
    TIMESTAMP="2019-10-03T14:25:24 UTC"
    RECORD_ID="8_2019-10-03T14:25:00"
    NAME="Quit"
    CONNECTION_ID="4"
    STATUS="0"
    STATUS_CODE="0"
    USER="root"
    OS_LOGIN=""
    HOST="localhost"
    IP="127.0.0.1"
    COMMAND_CLASS="connect"
    CONNECTION_TYPE="SSL/TLS"/>
  <AUDIT_RECORD
    TIMESTAMP="2019-10-03T14:25:32 UTC"
    RECORD_ID="12_2019-10-03T14:25:00"
    NAME="NoAudit"
    SERVER_ID="1"/>
</AUDIT>

監査ログファイルは、UTF-8 (1 文字当たり最大 4 バイト) を使用した XML として記述されています。 ルート要素は、<AUDIT> です。 ルート要素には、<AUDIT_RECORD> 要素が含まれています。この要素のそれぞれは、監査対象のイベントに関する情報を提供します。 監査ログプラグインは、新しいログファイルの書き込みを開始すると、XML 宣言と開始 <AUDIT> ルート要素タグを書き込みます。 プラグインは、ログファイルを閉じると、終了 </AUDIT> ルート要素タグを書き込みます。 ファイルが開いている間は、終了タグは存在しません。

<AUDIT_RECORD> 要素の属性には、次のような特性があります。

  • 一部の属性はすべての <AUDIT_RECORD> 要素に表示されます。 その他はオプションで、監査レコードタイプに応じて表示される場合があります。

  • <AUDIT_RECORD> 要素内の属性の順序は保証されません。

  • 属性値は固定長ではありません。 あとで属性の説明で示すように、長い値は切り捨てられる可能性があります。

  • <>"、および & 文字は、それぞれ &lt;&gt;&quot;、および &amp; としてエンコードされます。 NUL バイト (U+00) は、? 文字としてエンコードされます。

  • XML 文字として有効でない文字は、数値の文字参照を使用してエンコードされます。 有効な XML 文字は次のとおりです。

    #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

次の属性は、すべての <AUDIT_RECORD> 要素で必須です。

  • NAME

    監査イベントを生成した命令 (サーバーがクライアントから受信したコマンドなど) のタイプを表す文字列。

    例: NAME="Query"

    一部の一般的な NAME 値:

    Audit    When auditing starts, which may be server startup time
    Connect  When a client connects, also known as logging in
    Query    An SQL statement (executed directly)
    Prepare  Preparation of an SQL statement; usually followed by Execute
    Execute  Execution of an SQL statement; usually follows Prepare
    Shutdown Server shutdown
    Quit     When a client disconnects
    NoAudit  Auditing has been turned off

    使用可能な値は Audit, Binlog Dump, Change user, Close stmt, Connect Out, Connect, Create DB, Daemon, Debug, Delayed insert, Drop DB, Execute, Fetch, Field List, Init DB, Kill, Long Data, NoAudit, Ping, Prepare, Processlist, Query, Quit, Refresh, Register Slave, Reset stmt, Set option, Shutdown, Sleep, Statistics, Table Dump, TableDelete, TableInsert, TableRead, TableUpdate, Time です。

    これらの値の多くは、my_command.h ヘッダーファイルにリストされている COM_xxx コマンド値に対応しています。 たとえば、"Create DB"および"Change user"は、それぞれ COM_CREATE_DB および COM_CHANGE_USER に対応します。

    TableXXXNAME 値を持つイベントには、Query イベントが付随します。 たとえば、次のステートメントは、1 つの Query イベント、2 つの TableRead イベントおよび TableInsert イベントを生成します:

    INSERT INTO t3 SELECT t1.* FROM t1 JOIN t2;

    TableXXX イベントには、イベントが参照するテーブルを識別するための DB および TABLE 属性があります。

    古い形式の XML 監査ログ形式の Connect イベントには、接続属性は含まれません。

  • RECORD_ID

    監査レコードを表す一意の識別子。 この値はシーケンス番号とタイムスタンプで構成され、形式は SEQ_TIMESTAMP です。 監査ログプラグインが監査ログファイルを開くと、順序番号が監査ログファイルのサイズに初期化され、記録されるレコードごとに順序が 1 ずつ増分されます。 タイムスタンプは、監査ログプラグインがファイルを開いた日時を示す YYYY-MM-DDThh:mm:ss 形式の UTC 値です。

    例: RECORD_ID="12_2019-10-03T14:25:00"

  • TIMESTAMP

    監査イベントが生成された日時を示す YYYY-MM-DDThh:mm:ss UTC 形式の UTC 値を表す文字列。 たとえば、クライアントから受信した SQL ステートメントの実行に対応するイベントの TIMESTAMP 値は、受信時ではなく、ステートメントの終了後に発生します。

    例: TIMESTAMP="2019-10-03T14:25:32 UTC"

次の属性は、<AUDIT_RECORD> 要素ではオプションです。 これらの多くは、NAME 属性の特定の値を含む要素でのみ発生します。

  • COMMAND_CLASS

    実行されたアクションのタイプを示す文字列。

    例: COMMAND_CLASS="drop_table"

    値は statement/sql/xxx コマンドカウンタに対応しています。 たとえば、xxx は、DROP TABLE および SELECT ステートメントのそれぞれ drop_table および select です。 次のステートメントは、使用可能な名前を表示します:

    SELECT REPLACE(EVENT_NAME, 'statement/sql/', '') AS name
    FROM performance_schema.events_statements_summary_global_by_event_name
    WHERE EVENT_NAME LIKE 'statement/sql/%'
    ORDER BY name;
  • CONNECTION_ID

    クライアント接続識別子を表す符号なし整数。 これは、セッション内の CONNECTION_ID() 関数によって戻される値と同じです。

    例: CONNECTION_ID="127"

  • CONNECTION_TYPE

    サーバーへの接続のセキュリティ状態。 許可される値は、TCP/IP (暗号化なしで確立された TCP/IP 接続)、SSL/TLS (暗号化で確立された TCP/IP 接続)、Socket (Unix ソケットファイル接続)、Named Pipe (Windows 名前付きパイプ接続) および Shared Memory (Windows 共有メモリー接続) です。

    例: CONNECTION_TYPE="SSL/TLS"

  • DB

    デフォルトのデータベース名を表す文字列。

    例: DB="test"

  • HOST

    クライアントのホスト名を表す文字列。

    例: HOST="localhost"

  • IP

    クライアントの IP アドレスを表す文字列。

    例: IP="127.0.0.1"

  • MYSQL_VERSION

    MySQL サーバーのバージョンを表す文字列。 これは、セッション内の VERSION() 関数または version システム変数の値と同じです。

    例: MYSQL_VERSION="5.7.21-log"

  • OS_LOGIN

    認証プロセス中に使用される外部ユーザー名を表す文字列。クライアントの認証に使用されるプラグインによって設定されます。 ネイティブ (組込み) MySQL 認証の場合、またはプラグインで値が設定されていない場合、この属性は空です。 この値は、external_user システム変数の値と同じです (セクション6.2.18「プロキシユーザー」 を参照)。

    例: OS_LOGIN="jeffrey"

  • OS_VERSION

    サーバーが構築された、または実行されているオペレーティングシステムを表す文字列。

    例: OS_VERSION="x86_64-Linux"

  • PRIV_USER

    サーバーがクライアントを認証する際に使用したユーザーを表す文字列。 これは、サーバーが権限チェックに使用するユーザー名で、USER の値とは異なる場合があります。

    例: PRIV_USER="jeffrey"

  • PROXY_USER

    プロキシユーザーを表す文字列 (セクション6.2.18「プロキシユーザー」 を参照)。 ユーザーのプロキシ処理が有効になっていない場合は、値が空です。

    例: PROXY_USER="developer"

  • SERVER_ID

    サーバー ID を表す符号なし整数。 これは、server_id システム変数の値と同じです。

    例: SERVER_ID="1"

  • SQLTEXT

    SQL ステートメントのテキストを表す文字列。 この値は、空にすることができます。 長い値は、切り捨てられる可能性があります。 監査ログファイル自体などの文字列は、UTF-8 (1 文字当たり最大 4 バイト) を使用して記述されるため、この値が変換の結果となる場合があります。 たとえば、元のステートメントは、SJIS 文字列としてクライアントから受信された可能性があります。

    例: SQLTEXT="DELETE FROM t1"

  • STARTUP_OPTIONS

    MySQL サーバーの起動時に、コマンド行またはオプションファイルで指定されたオプションを表す文字列。

    例: STARTUP_OPTIONS="--port=3306 --log_output=FILE"

  • STATUS

    コマンドのステータスを表す符号なし整数 (成功した場合は 0、エラーが発生した場合はゼロ以外)。 これは、mysql_errno() C API 関数の値と同じです。 STATUS との違いの詳細は、STATUS_CODE の説明を参照してください。

    監査ログには、SQLSTATE 値またはエラーメッセージが含まれていません。 エラーコード、SQLSTATE 値、およびメッセージ間の関連性を確認する方法については、Server Error Message Referenceを参照してください。

    警告のログは記録されません。

    例: STATUS="1051"

  • STATUS_CODE

    コマンドのステータスを表す符号なし整数 (成功した場合は 0、エラーが発生した場合は 1)。

    STATUS_CODE の値は、STATUS の値とは異なります。STATUS_CODE は、成功した場合は 0、エラーが発生した場合は 1 であり、Audit Vault の EZ_collector コンシューマとの互換性があります。 STATUS は、mysql_errno() C API 関数の値です。 これは、成功した場合は 0、エラーが発生した場合はゼロ以外です。そのため、エラーが発生した場合、必ずしも 1 であるとはかぎりません。

    例: STATUS_CODE="0"

  • TABLE

    テーブル名を表す文字列。

    例: TABLE="t3"

  • USER

    クライアントによって送信されたユーザー名を表す文字列。 これは PRIV_USER の値とは異なる場合があります。

  • VERSION

    監査ログファイル形式のバージョンを表す符号なし整数。

    例: VERSION="1"

JSON 監査ログファイル形式

JSON 形式の監査ロギング (audit_log_format=JSON) の場合、ログファイルの内容は、監査対象イベントをキーと値のペアの JSON ハッシュとして表す各配列要素を持つ JSON 配列を形成します。 完全なイベントレコードの例は、このセクションの後半で説明します。 部分的なイベントの抜粋を次に示します:

[
  {
    "timestamp": "2019-10-03 13:50:01",
    "id": 0,
    "class": "audit",
    "event": "startup",
    ...
  },
  {
    "timestamp": "2019-10-03 15:02:32",
    "id": 0,
    "class": "connection",
    "event": "connect",
    ...
  },
  ...
  {
    "timestamp": "2019-10-03 17:37:26",
    "id": 0,
    "class": "table_access",
    "event": "insert",
      ...
  }
  ...
]

監査ログファイルは、UTF-8 を使用して書き込まれます (文字当たり最大 4 バイト)。 監査ログプラグインは、新しいログファイルの書き込みを開始すると、開いている[アレイマーカーを書き込みます。 プラグインは、ログファイルを閉じるときに、閉じている]配列マーカーを書き込みます。 ファイルが開いている間は、閉じマーカーは存在しません。

監査レコード内の項目には、次の特性があります:

  • 一部の項目は、すべての監査レコードに表示されます。 その他はオプションで、監査レコードタイプに応じて表示される場合があります。

  • 監査レコード内の項目の順序は保証されません。

  • アイテム値が固定長ではありません。 長い値は、後で指定する品目摘要で示されるように切り捨てられる場合があります。

  • "および\の文字は、それぞれ"および\\としてエンコードされます。

次の例は、読みやすくするために若干再フォーマットされた様々なイベントタイプ (class および event 項目で示される) の JSON オブジェクト形式を示しています:

起動イベントの監査:

{ "timestamp": "2019-10-03 14:21:56",
  "id": 0,
  "class": "audit",
  "event": "startup",
  "connection_id": 0,
  "startup_data": { "server_id": 1,
                    "os_version": "i686-Linux",
                    "mysql_version": "5.7.21-log",
                    "args": ["/usr/local/mysql/bin/mysqld",
                             "--loose-audit-log-format=JSON",
                             "--log-error=log.err",
                             "--pid-file=mysqld.pid",
                             "--port=3306" ] } }

(実行時に有効にされるのではなく) サーバーの起動の結果として監査ログプラグインが起動すると、connection_id は 0 に設定され、account および login は存在しません。

停止イベントの監査:

{ "timestamp": "2019-10-03 14:28:20",
  "id": 3,
  "class": "audit",
  "event": "shutdown",
  "connection_id": 0,
  "shutdown_data": { "server_id": 1 } }

(実行時に無効にされるのではなく) サーバーのシャットダウンの結果として監査ログプラグインがアンインストールされると、connection_id は 0 に設定され、account および login は存在しません。

Connect または change-user イベント:

{ "timestamp": "2019-10-03 14:23:18",
  "id": 1,
  "class": "connection",
  "event": "connect",
  "connection_id": 5,
  "account": { "user": "root", "host": "localhost" },
  "login": { "user": "root", "os": "", "ip": "::1", "proxy": "" },
  "connection_data": { "connection_type": "ssl",
                       "status": 0,
                       "db": "test",
                       "connection_attributes": {
                         "_pid": "43236",
                         ...
                         "program_name": "mysqladmin"
                       } }
}

切断イベント:

{ "timestamp": "2019-10-03 14:24:45",
  "id": 3,
  "class": "connection",
  "event": "disconnect",
  "connection_id": 5,
  "account": { "user": "root", "host": "localhost" },
  "login": { "user": "root", "os": "", "ip": "::1", "proxy": "" },
  "connection_data": { "connection_type": "ssl" } }

クエリーイベント:

{ "timestamp": "2019-10-03 14:23:35",
  "id": 2,
  "class": "general",
  "event": "status",
  "connection_id": 5,
  "account": { "user": "root", "host": "localhost" },
  "login": { "user": "root", "os": "", "ip": "::1", "proxy": "" },
  "general_data": { "command": "Query",
                    "sql_command": "show_variables",
                    "query": "SHOW VARIABLES",
                    "status": 0 } }

テーブルアクセスイベント (読取り、削除、挿入、更新):

{ "timestamp": "2019-10-03 14:23:41",
  "id": 0,
  "class": "table_access",
  "event": "insert",
  "connection_id": 5,
  "account": { "user": "root", "host": "localhost" },
  "login": { "user": "root", "os": "", "ip": "127.0.0.1", "proxy": "" },
  "table_access_data": { "db": "test",
                         "table": "t1",
                         "query": "INSERT INTO t1 (i) VALUES(1),(2),(3)",
                         "sql_command": "insert" } }

次のリストの項目は、JSON 形式の監査レコードの最上位レベルに表示されます: 各アイテム値はスカラーまたは JSON ハッシュのいずれかです。 ハッシュ値を持つアイテムの場合、説明にはそのハッシュ内のアイテム名のみがリストされます。 セカンドレベルハッシュアイテムの詳細は、このセクションの後半のを参照してください。

  • account

    イベントに関連付けられた MySQL アカウント。 この値は、セクション内の CURRENT_USER() 関数の値と同等の項目を含むハッシュです: userhost

    例:

    "account": { "user": "root", "host": "localhost" }
  • class

    イベントクラスを表す文字列。 このクラスは、イベントサブクラスを指定する event アイテムとともに取得されるイベントのタイプを定義します。

    例:

    "class": "connection"

    次のテーブルに、class 値と event 値の許可される組合せを示します。

    表 6.28 監査ログクラスとイベントの組合せ

    クラス値 許可されたイベント値
    audit startup, shutdown
    接続 connect, change_user, disconnect
    general status
    table_access_data read, delete, insert, update

  • connection_data

    クライアント接続に関する情報。 値は、これらのアイテムを含むハッシュです: connection_type, status, db、および場合によっては connection_attributes。 この項目は、class 値が connection の監査レコードに対してのみ発生します。

    例:

    "connection_data": { "connection_type": "ssl",
                         "status": 0,
                         "db": "test" }

    MySQL 8.0.19 の時点では、class 値が connectionevent 値が connect のイベントには、接続時にクライアントによって渡された接続属性を表示するための connection_attributes アイテムが含まれる場合があります。 (「パフォーマンススキーマ」テーブルでも公開されるこれらの属性の詳細は、セクション27.12.9「パフォーマンススキーマ接続属性テーブル」 を参照してください。)

    connection_attributes 値は、各属性をその名前と値で表すハッシュです。

    例:

    "connection_attributes": {
      "_pid": "43236",
      "_os": "macos10.14",
      "_platform": "x86_64",
      "_client_version": "8.0.19",
      "_client_name": "libmysql",
      "program_name": "mysqladmin"
    }

    イベントに接続属性が存在しない場合、何も記録されず、connection_attributes アイテムは表示されません。 これは、接続試行が成功しなかった場合、クライアントが属性を渡さなかった場合、またはサーバーの起動時やプラグインによって開始されたときなどに接続が内部的に発生した場合に発生することがあります。

  • connection_id

    クライアント接続識別子を表す符号なし整数。 これは、セッション内の CONNECTION_ID() 関数によって戻される値と同じです。

    例:

    "connection_id": 5
  • event

    イベントクラスのサブクラスを表す文字列。 サブクラスは、イベントクラスを指定する class アイテムとともに取得されるイベントのタイプを定義します。 詳細は、class アイテムの説明を参照してください。

    例:

    "event": "connect"
  • general_data

    実行されたステートメントまたはコマンドに関する情報。 値は、これらのアイテムを含むハッシュです: command, sql_command, query, status。 この項目は、class 値が general の監査レコードに対してのみ発生します。

    例:

    "general_data": { "command": "Query",
                      "sql_command": "show_variables",
                      "query": "SHOW VARIABLES",
                      "status": 0 }
  • id

    イベント ID を表す符号なし整数。

    例:

    "id": 2

    同じ timestamp 値を持つ監査レコードの場合、id 値によってそれらが区別され、順序が形成されます。 監査ログ内では、timestamp/id のペアは一意です。 これらのペアは、ログ内のイベントの場所を識別するブックマークです。

  • login

    クライアントがサーバーに接続した方法を示す情報。 値は、これらのアイテムを含むハッシュです: user, os, ip, proxy

    例:

    "login": { "user": "root", "os": "", "ip": "::1", "proxy": "" }
  • shutdown_data

    監査ログプラグインの終了に関する情報。 値は、これらのアイテムを含むハッシュです: server_id この項目は、class 値と event 値がそれぞれ audit および shutdown である監査レコードに対してのみ発生します。

    例:

    "shutdown_data": { "server_id": 1 }
  • startup_data

    監査ログプラグインの初期化に関する情報。 値は、これらのアイテムを含むハッシュです: server_id, os_version, mysql_version, args。 この項目は、class 値と event 値がそれぞれ audit および startup である監査レコードに対してのみ発生します。

    例:

    "startup_data": { "server_id": 1,
                      "os_version": "i686-Linux",
                      "mysql_version": "5.7.21-log",
                      "args": ["/usr/local/mysql/bin/mysqld",
                               "--loose-audit-log-format=JSON",
                               "--log-error=log.err",
                               "--pid-file=mysqld.pid",
                               "--port=3306" ] }
  • table_access_data

    テーブルへのアクセスに関する情報。 値は、これらのアイテムを含むハッシュです: db, table, query, sql_command、この項目は、class 値が table_access の監査レコードに対してのみ発生します。

    例:

    "table_access_data": { "db": "test",
                           "table": "t1",
                           "query": "INSERT INTO t1 (i) VALUES(1),(2),(3)",
                           "sql_command": "insert" }
  • timestamp

    監査イベントが生成された日時を示す YYYY-MM-DD hh:mm:ss 形式の UTC 値を表す文字列。 たとえば、クライアントから受信した SQL ステートメントの実行に対応するイベントの timestamp 値は、受信時ではなく、ステートメントの終了後に発生します。

    例:

    "timestamp": "2019-10-03 13:50:01"

    同じ timestamp 値を持つ監査レコードの場合、id 値によってそれらが区別され、順序が形成されます。 監査ログ内では、timestamp/id のペアは一意です。 これらのペアは、ログ内のイベントの場所を識別するブックマークです。

JSON 形式の監査レコードのトップレベル項目に関連付けられたハッシュ値内には、次の項目が表示されます:

  • args

    MySQL サーバーの起動時にコマンド行またはオプションファイルで指定されたオプションの配列。 最初のオプションは、サーバー実行可能ファイルへのパスです。

    例:

    "args": ["/usr/local/mysql/bin/mysqld",
             "--loose-audit-log-format=JSON",
             "--log-error=log.err",
             "--pid-file=mysqld.pid",
             "--port=3306" ]
  • command

    監査イベントを生成した命令 (サーバーがクライアントから受信したコマンドなど) のタイプを表す文字列。

    例:

    "command": "Query"
  • connection_type

    サーバーへの接続のセキュリティ状態。 許可される値は、tcp/ip (暗号化なしで確立された TCP/IP 接続)、ssl (暗号化で確立された TCP/IP 接続)、socket (Unix ソケットファイル接続)、named_pipe (Windows 名前付きパイプ接続) および shared_memory (Windows 共有メモリー接続) です。

    例:

    "connection_type": "tcp/tcp"
  • db

    データベース名を表す文字列。 connection_data の場合、これはデフォルトのデータベースです。 table_access_data の場合は、テーブルデータベースです。

    例:

    "db": "test"
  • ホスト

    クライアントのホスト名を表す文字列。

    例:

    "host": "localhost"
  • ip

    クライアントの IP アドレスを表す文字列。

    例:

    "ip": "::1"
  • mysql_version

    MySQL サーバーのバージョンを表す文字列。 これは、セッション内の VERSION() 関数または version システム変数の値と同じです。

    例:

    "mysql_version": "5.7.21-log"
  • os

    認証プロセス中に使用される外部ユーザー名を表す文字列。クライアントの認証に使用されるプラグインによって設定されます。 ネイティブ (組込み) MySQL 認証の場合、またはプラグインで値が設定されていない場合、この属性は空です。 この値は、external_user システム変数の値と同じです。 セクション6.2.18「プロキシユーザー」を参照してください。

    例:

    "os": "jeffrey"
  • os_version

    サーバーが構築された、または実行されているオペレーティングシステムを表す文字列。

    例:

    "os_version": "i686-Linux"
  • プロキシ

    プロキシユーザーを表す文字列 (セクション6.2.18「プロキシユーザー」 を参照)。 ユーザーのプロキシ処理が有効になっていない場合は、値が空です。

    例:

    "proxy": "developer"
  • クエリー

    SQL ステートメントのテキストを表す文字列。 この値は、空にすることができます。 長い値は、切り捨てられる可能性があります。 監査ログファイル自体などの文字列は、UTF-8 (1 文字当たり最大 4 バイト) を使用して記述されるため、この値が変換の結果となる場合があります。 たとえば、元のステートメントは、SJIS 文字列としてクライアントから受信された可能性があります。

    例:

    "query": "DELETE FROM t1"
  • server_id

    サーバー ID を表す符号なし整数。 これは、server_id システム変数の値と同じです。

    例:

    "server_id": 1
  • sql_command

    SQL ステートメントのタイプを示す文字列。

    例:

    "sql_command": "insert"

    値は statement/sql/xxx コマンドカウンタに対応しています。 たとえば、xxx は、DROP TABLE および SELECT ステートメントのそれぞれ drop_table および select です。 次のステートメントは、使用可能な名前を表示します:

    SELECT REPLACE(EVENT_NAME, 'statement/sql/', '') AS name
    FROM performance_schema.events_statements_summary_global_by_event_name
    WHERE EVENT_NAME LIKE 'statement/sql/%'
    ORDER BY name;
  • status

    コマンドのステータスを表す符号なし整数 (成功した場合は 0、エラーが発生した場合はゼロ以外)。 これは、mysql_errno() C API 関数の値と同じです。

    監査ログには、SQLSTATE 値またはエラーメッセージが含まれていません。 エラーコード、SQLSTATE 値、およびメッセージ間の関連性を確認する方法については、Server Error Message Referenceを参照してください。

    警告のログは記録されません。

    例:

    "status": 1051
  • table

    テーブル名を表す文字列。

    例:

    "table": "t1"
  • user

    ユーザー名を表す文字列。 意味は、user が発生するアイテムによって異なります:

    • account アイテム内の user は、サーバーがクライアントを認証したユーザーを表す文字列です。 これは、サーバーが権限チェックに使用するユーザー名です。

    • login アイテム内の user は、クライアントによって送信されるユーザー名を表す文字列です。

    例:

    "user": "root"