Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


8.4.5.4 审计日志文件格式

MySQL 服务器在发生可审计事件时,调用 audit 日志插件将其写入到日志文件中。通常,启动后第一个audit记录包含服务器描述和启动选项。随后的元素表示客户端连接和断开、执行的 SQL 语句等事件。只记录顶层语句,不记录存储程序中的语句,如触发器或存储过程。引用文件内容,如LOAD DATA,不被记录。

要选择 audit 日志插件用于写入日志文件的格式,服务器启动时设置audit_log_format系统变量。可用的格式有:

  • 新式 XML 格式 (audit_log_format=NEW):一个与 Oracle 审计库更好的 XML 格式。MySQL 8.4 默认使用新式 XML 格式。

  • 老式 XML 格式 (audit_log_format=OLD):原来的 audit 日志格式,用于更早的 MySQL 系列中默认。

  • JSON 格式 (audit_log_format=JSON):将 audit 日志写入 JSON 数组。只有这个格式支持可选的查询时间和大小统计信息。

默认情况下,audit 日志文件内容使用新式 XML 格式,不压缩也不加密。

如果您更改audit_log_format,建议同时更改audit_log_file。例如,如果您将audit_log_format设置为JSON,则将audit_log_file设置为audit.json。否则,新的日志文件将具有不同的格式,而所有文件都将具有相同的基本名称,但没有指示格式变更时的信息。

以下是一个新式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>

审计日志文件以 XML 格式写入,使用 UTF-8 编码(每个字符最多 4 个字节)。根元素是 <AUDIT>。根元素包含 <AUDIT_RECORD> 元素,每个元素提供关于审计事件的信息。当审计日志插件开始写入新日志文件时,它写入 XML 声明和打开 <AUDIT> 根元素标签。當插件关闭日志文件时,它写入关闭 </AUDIT> 根元素标签。关闭标签在文件打开期间不出现。

<AUDIT_RECORD> 元素中的子元素具有以下特征:

  • 一些元素总是出现在 <AUDIT_RECORD> 元素中。其他元素可能根据审计记录类型出现。

  • <AUDIT_RECORD> 元素中的子元素顺序不保证。

  • 元素值不是固定长度。长值可能会像后续描述中所示被截断。

  • 标签 <>"& 编码为 &lt;&gt;&quot;&amp;,分别。空字节(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

    可能的值是 AuditBinlog DumpChange userClose stmtConnect OutConnectCreate DBDaemonDebugDelayed insertDrop DBExecuteFetchField ListInit DBKillLong DataNoAuditPingPrepareProcesslistQueryQuitRefreshRegister SlaveReset stmtSet optionShutdownSleepStatisticsTable DumpTableDeleteTableInsertTableReadTableUpdateTime.

    这些值对应于 my_command.h 头文件中列出的 COM_xxx 命令值。例如,Create DBChange user 分别对应于 COM_CREATE_DBCOM_CHANGE_USER

    具有 <NAME> 值为 TableXXX 的事件伴随着 Query 事件。例如,以下语句生成一个 Query 事件,两个 TableRead 事件和一个 TableInsert 事件:

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

    每个 TableXXX 事件包含 <TABLE><DB> 元素,以标识该事件所指的表和包含该表的数据库。

  • <RECORD_ID>

    审核记录的唯一标识符。值由顺序号和时间戳组成,格式为 SEQ_TIMESTAMP。当审核日志插件打开审核日志文件时,它将初始化顺序号为审核日志文件的大小,然后对每个记录递增顺序号。时间戳是 UTC 值,格式为 YYYY-MM-DDThh:mm:ss,表示审核日志插件打开文件的日期和时间。

    示例:

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

    表示UTC值的字符串,格式为YYYY-MM-DDThh:mm:ss 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 命令计数器。例如,xxxdrop_tableselect 对应于 DROP TABLESELECT 语句,分别。以下语句显示了可能的名称:

    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>

    具有 <COMMAND_CLASS> 值为 connect 的事件可能包含一个 <CONNECTION_ATTRIBUTES> 元素,以显示客户端在连接时传递的连接属性。关于这些属性的信息,请参见第29.12.9节,“性能架构连接属性表”

    <CONNECTION_ATTRIBUTES> 元素包含一个或多个 <ATTRIBUTE> 元素,每个元素都包含 <NAME><VALUE> 元素,分别表示属性名称和值。

    示例:

    <CONNECTION_ATTRIBUTES>
     <ATTRIBUTE>
      <NAME>_pid</NAME>
      <VALUE>42794</VALUE>
     </ATTRIBUTE>
     <ATTRIBUTE>
      <NAME>_os</NAME>
      <VALUE>macos0.14</VALUE>
     </ATTRIBUTE>
     <ATTRIBUTE>
      <NAME>_platform</NAME>
      <VALUE>x86_64</VALUE>
     </ATTRIBUTE>
     <ATTRIBUTE>
      <NAME>_client_version</NAME>
      <VALUE>8.4.0</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>

    对于 connect 事件,这个元素表示默认数据库;如果没有默认数据库,元素为空。对于 table-access 事件,元素表示访问的表所属的数据库。

  • <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>

    用于身份验证过程中的外部用户名称,通过客户端认证插件设置的字符串。如果使用native(内置)MySQL身份验证或插件未设置该值,这个元素为空。该值与external_user系统变量相同(见第8.2.19节,“代理用户”)。

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

    表示服务器在built或运行的操作系统名称。

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

    表示服务器对客户端进行身份验证后的用户名称。这是服务器用于权限检查的用户名,可能与<USER>值不同。

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

    表示代理用户(见第8.2.19节,“代理用户”)。如果不在代理用户状态下,该值为空。

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

    无符号整数,表示服务器ID。这与server_id系统变量相同。

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

    表示一个 SQL 语句的字符串。该值可以为空。长值可能会被截断。这个字符串,像 audit 日志文件本身一样,使用 UTF-8 编码(每个字符最多 4 个字节),因此该值可能是转换结果。例如,原始语句可能来自客户端作为 SJIS 字符串。

    示例:

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

    表示服务器启动时从命令行或选项文件中给定的选项字符串。第一个选项是服务器可执行文件的路径。

    示例:

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

    表示命令状态的无符号整数:0 表示成功,非零表示错误发生。这与 mysql_errno() C API 函数的值相同。见 <STATUS_CODE> 的描述,以了解它与 <STATUS> 的区别。

    audit 日志不包含 SQLSTATE 值或错误信息。要查看错误代码、SQLSTATE 值和消息的关联,见 服务器错误参考

    警告信息不被记录。

    示例:

    <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>

    表示 audit 日志文件格式版本的无符号整数。

    <VERSION>1</VERSION>

<?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>

审计日志文件以 XML 格式写入,使用 UTF-8 编码(每个字符最多 4 个字节)。根元素是 <AUDIT>。根元素包含 <AUDIT_RECORD> 元素,每个元素提供关于审计事件的信息。当审计日志插件开始写入新日志文件时,它写入 XML 声明和打开 <AUDIT> 根元素标签。當插件关闭日志文件时,它写入关闭 </AUDIT> 根元素标签。关闭标签在文件打开期间不出现。

<AUDIT_RECORD> 元素的属性具有以下特征:

  • 一些属性总是出现在每个 <AUDIT_RECORD> 元素中。其他属性根据审计记录类型而出现。

  • <AUDIT_RECORD> 元素中的属性顺序不保证。

  • 属性值不是固定长度。长值可能会被截断,如后续的属性描述中所示。

  • 字符 `<`、`>`、`"` 和 `&` 编码为 `

  • 不合法的 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

    可能的值是 AuditBinlog DumpChange userClose stmtConnect OutConnectCreate DBDaemonDebugDelayed insertDrop DBExecuteFetchField ListInit DBKillLong DataNoAuditPingPrepareProcesslistQueryQuitRefreshRegister SlaveReset stmtSet optionShutdownSleepStatisticsTable DumpTableDeleteTableInsertTableReadTableUpdateTime.

    这些值对应于 my_command.h 头文件中列出的 COM_xxx 命令值。例如,"Create DB""Change user" 分别对应 COM_CREATE_DBCOM_CHANGE_USER

    具有 NAME 值为 TableXXX 的事件伴随着 Query 事件。例如,以下语句生成一个 Query 事件,两个 TableRead 事件和一个 TableInsert 事件:

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

    每个 TableXXX 事件都有 TABLEDB 属性来标识该事件所指向的表和包含该表的数据库。

    Connect 事件对于老式 XML 审计日志格式不包括连接属性。

  • RECORD_ID

    审核记录的唯一标识符。该值由顺序号和时间戳组成,格式为 SEQ_TIMESTAMP。当审核日志插件打开审核日志文件时,它将初始化顺序号为审核日志文件的大小,然后对每个记录递增顺序号。时间戳是 UTC 值,格式为 YYYY-MM-DDThh:mm:ss,表示审核日志插件打开文件的日期和时间。

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

  • TIMESTAMP

    表示UTC值的字符串,格式为YYYY-MM-DDThh:mm:ss UTC,指示审核事件生成时间。例如,对于来自客户端的SQL语句执行事件,TIMESTAMP值发生在语句完成后,而不是接收时。

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

<AUDIT_RECORD> 元素的以下属性是可选的。其中许多只在 NAME 属性值为特定值时出现。

  • COMMAND_CLASS

    表示执行的操作类型。

    示例:COMMAND_CLASS="drop_table"

    这些值对应于 statement/sql/xxx 命令计数器。例如,xxxdrop_tableselect 对应于 DROP TABLESELECT 语句,分别。以下语句显示了可能的名称:

    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

    用于身份验证过程中的外部用户名称,通过客户端认证插件设置的值。使用native(内置)MySQL身份验证或插件未设置该值时,该属性为空。该值与external_user系统变量相同(见第8.2.19节,“代理用户”)。

    OS_LOGIN="jeffrey"

  • OS_VERSION

    表示服务器在哪个操作系统上构建或运行的字符串。

    OS_VERSION="x86_64-Linux"

  • PRIV_USER

    表示服务器认证客户端的用户名称。服务器用于权限检查,可能与USER值不同。

    PRIV_USER="jeffrey"

  • PROXY_USER

    表示代理用户(见第8.2.19节,“代理用户”)。如果不在代理用户状态下,该值为空。

    PROXY_USER="developer"

  • SERVER_ID

    无符号整数,表示服务器ID。该值与server_id系统变量相同。

    SERVER_ID="1"

  • SQLTEXT

    表示一个 SQL 语句的文本字符串。该值可以为空。长值可能会被截断。这个字符串,像 audit 日志文件本身一样,使用 UTF-8 编码(每个字符最多 4 个字节),因此该值可能是转换结果。例如,原始语句可能来自客户端作为 SJIS 字符串。

    示例:SQLTEXT="DELETE FROM t1"

  • STARTUP_OPTIONS

    表示 MySQL 服务器启动时从命令行或选项文件中给定的选项字符串。

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

  • STATUS

    一个无符号整数,表示命令状态:0 表示成功,非零表示错误发生。这与 mysql_errno() C API 函数的值相同。见 STATUS_CODE 的描述,以了解它与 STATUS 的区别。

    audit 日志不包含 SQLSTATE 值或错误信息。要查看错误代码、SQLSTATE 值和消息的关联,见服务器错误参考

    警告信息不被记录。

    示例: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

    一个无符号整数,表示 audit 日志文件格式版本。

    示例:VERSION="1"

对于 JSON 格式的 audit 记录日志 (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 个字节)。当审计插件开始写入新日志文件时,它写入开启的 [ 数组标记。关闭日志文件时,插件写入关闭的 ] 数组标记。在文件打开期间不出现关闭标记。

审计记录中的项目具有以下特征:

  • 一些项目总是出现在每个审计记录中。其他项目可能根据审计记录类型而出现。

  • 审计记录中的项目顺序不保证。

  • 项目值不是固定长度。长值可能会像后续描述的那样被截断。

  • 字符 "\ 编码为 \"\\,分别。

JSON 格式是唯一支持可选查询时间和大小统计信息的审计日志文件格式。这类数据在慢查询日志中可用于资格查询,并且在审计日志上下文中也帮助检测活动分析中的异常值。

要将查询统计信息添加到日志文件中,您必须使用audit_log_filter_set_filter()审核日志函数作为服务元素的JSON过滤语法来设置它们。关于如何执行此操作,请参阅添加查询统计信息以检测异常。要使bytes_sentbytes_received字段被填充,系统变量log_slow_extra必须设置为ON。

以下示例展示了不同事件类型的JSON对象格式(由classevent项所指示),以提高可读性进行了重新格式化:

启动事件:

{ "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,accountlogin不 presente。

关闭事件:

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

当审核日志插件在服务器关闭时(而不是在运行时禁用)卸载时,connection_id设置为0,accountlogin不 presente。

连接或更改用户事件:

{ "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": "2022-01-28 13:09:30", 
  "id": 0, 
  "class": "general", 
  "event": "status", 
  "connection_id": 46, 
  "account": { "user": "user", "host": "localhost" }, 
  "login": { "user": "user", “os": "", “ip": "127.0.0.1", “proxy": "" }, 
  "general_data": { "command": "Query", 
                    "sql_command": "insert",
	            "query": "INSERT INTO audit_table VALUES(4)",
	            "status": 1146 }
  "query_statistics": { "query_time": 0.116250,
                        "bytes_sent": 18384,
                        "bytes_received": 78858,
                        "rows_sent": 3,
                        "rows_examined": 20878 } }

表访问事件(读取、删除、插入、更新):

{ "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 账户。值是一个包含以下项目的哈希:userhost。该值等同于CURRENT_USER()函数在该部分中的值。

    示例:

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

    表示事件的字符串。类别与指定事件子类别的event项目一起定义事件类型。

    示例:

    "class": "connection"

    以下表格显示了classevent值的合法组合。

    表 8.34 审核日志类别和事件组合

    Class Value Permitted Event Values
    audit startup, shutdown
    connection connect, change_user, disconnect
    general status
    table_access_data read, delete, insert, update

  • connection_data

    客户端连接信息。该值是一个哈希,包含这些项目:connection_typestatusdb,可能还有 connection_attributes。这个项目只在 audit 记录的 class 值为 connection 时出现。

    示例:

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

    事件的 class 值为 connectionevent 值为 connect 可能包含一个 connection_attributes 项,以显示客户端在连接时传递的连接属性。 (关于这些属性的信息,请参见第29.12.9节,“性能_schema连接属性表”。)

    connection_attributes 值是一个哈希,通过每个属性的名称和值来表示。

    示例:

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

    如果事件中没有连接属性,那么就不记录任何属性,并且不会出现 connection_attributes 项。这可能发生在连接尝试失败、客户端不传递属性或连接是由插件内部启动时。

  • connection_id

    一个无符号整数,表示客户端连接标识符。这与会话中的CONNECTION_ID()函数返回的值相同。

    "connection_id": 5
  • event

    一个字符串,表示事件子类别。子类别与class项一起指定事件类型。更多信息,请查看class项描述。

    "event": "connect"
  • general_data

    关于执行的语句或命令的信息。值是一个哈希,包含这些项目:commandsql_commandquerystatus。只有在class值为general的审核记录中出现该项目。

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

    一个无符号整数,表示事件ID。

    "id": 2

    对于具有相同timestamp值的审核记录,它们的id值可以区分它们,并形成一个顺序。在审核日志中,timestamp/id对是唯一的。这些对标识了日志中的事件位置。

  • login

    表示客户端如何连接到服务器的信息。值是一个哈希,包含这些项目:userosipproxy

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

    检测异常查询的可选查询统计信息。值是一个哈希,包含这些项目:query_timerows_sentrows_examinedbytes_receivedbytes_sent。要设置查询统计信息,请参阅添加检测异常查询的查询统计信息

    示例:

    "query_statistics": { "query_time": 0.116250,
                          "bytes_sent": 18384,
                          "bytes_received": 78858,
                          "rows_sent": 3,
                          "rows_examined": 20878 }
  • shutdown_data

    关机日志插件终止相关信息。值是一个哈希,包含这些项目:server_id。这个项目只在auditshutdown的类别和事件值中出现。

    示例:

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

    启动日志插件初始化相关信息。值是一个哈希,包含这些项目:server_idos_versionmysql_versionargs。这个项目只在auditstartup的类别和事件值中出现。

    示例:

    "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

    表的访问信息。该值是一个哈希,包含以下项目:dbtablequerysql_command,只有 audit 记录的 class 值为 table_access 时才出现。

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

    这个字段类似于 timestamp 字段,但值是一个整数,表示 audit 事件生成的日期和时间,以 UNIX 时间戳形式表示。

    "time" : 1618498687

    只有在启用了audit_log_format_unix_timestamp 系统变量时,time 字段才出现在 JSON 格式的日志文件中。

  • timestamp

    YYYY-MM-DD hh:mm:ss 格式表示 audit 事件生成的日期和时间。例如,执行 SQL 语句的事件对应的 timestamp 值是在语句完成后出现,而不是在接收到语句时。

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

    具有相同 timestamp 值的 audit 记录,通过 id 值来区分它们,并形成一个顺序。在 audit 日志中,timestamp/id 对是唯一的。这些对标识日志中的事件位置。

  • args

    启动 MySQL 服务器时,命令行或选项文件中给定的数组。第一个选项是服务器可执行文件的路径。

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

    从客户端接收的字节数。这是一个可选查询统计信息的一部分。为该字段被填充,系统变量log_slow_extra必须设置为ON

    "bytes_received": 78858
  • bytes_sent

    发送到客户端的字节数。这是一个可选查询统计信息的一部分。为该字段被填充,系统变量log_slow_extra必须设置为ON

    "bytes_sent": 18384
  • 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_datatable_access_data

    "db": "test"
  • host

    表示客户端主机名称。

    "host": "localhost"
  • ip

    表示客户端IP地址。

    "ip": "::1"
  • mysql_version

    表示MySQL服务器版本。这与VERSION()函数或version系统变量的值相同。

    "mysql_version": "5.7.21-log"
  • os

    表示在身份验证过程中使用的外部用户名, 由用于验证客户端的插件设置。使用native(内置)MySQL身份验证或插件不设置值时,这个属性为空。该值与external_user系统变量相同。请参阅第8.2.19节,“代理用户”

    "os": "jeffrey"
  • os_version

    表示服务器在哪个操作系统上构建或运行的。

    "os_version": "i686-Linux"
  • proxy

    表示代理用户(请参阅第8.2.19节,“代理用户”)。如果不在有效状态下,这个值为空。

    示例:

    "proxy": "developer"
  • query

    表示一个SQL语句的文本。该值可以为空。长值可能会被截断。字符串,像审核日志文件本身一样,使用 UTF-8(每个字符4字节)写入,所以该值可能是转换结果。例如,原始语句可能来自客户端作为SJIS字符串。

    示例:

    "query": "DELETE FROM t1"
  • query_time

    查询执行时间(如果选择了longlong数据类型),以微秒表示(如果选择了double数据类型),以秒表示。这项是可选的查询统计信息的一部分。

    示例:

    "query_time": 0.116250
  • rows_examined

    查询过程中访问的行数。这项是可选的查询统计信息的一部分。

    示例:

    "rows_examined": 20878
  • rows_sent

    将结果发送给客户端的行数。这项是可选的查询统计信息的一部分。

    示例:

    "rows_sent": 3
  • server_id

    无符号整数,表示服务器ID。这个值与server_id系统变量的值相同。

    示例:

    "server_id": 1
  • sql_command

    表示SQL语句类型的字符串。

    示例:

    "sql_command": "insert"

    这些值对应于 statement/sql/xxx 命令计数器。例如,xxxdrop_tableselect,对应于 DROP TABLESELECT 语句,分别。以下语句显示了可能的名称:

    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 值和消息之间的关联,见服务器错误参考

    警告不被记录。

    示例:

    "status": 1051
  • table

    一个字符串,表示表名。

    示例:

    "table": "t1"
  • user

    一个字符串,表示用户名称。该名称的含义取决于user所在的项目:

    • account 项中,user 是服务器认证客户端后使用的用户名称,这是服务器用于权限检查的用户名。

    • 登录项中,用户是一个客户端发送的用户名字符串。

    "user": "root"