Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

8.4.5.4 审计日志文件格式

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

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

  • 新式 XML 格式 (audit_log_format=NEW): 兼容 Oracle Audit Vault 的 XML 格式。MySQL 8.3 默认使用新式 XML 格式。

  • 旧式 XML 格式 (audit_log_format=OLD): 旧版本 MySQL 系列中使用的原始审计日志格式。

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

默认情况下,审计日志文件内容以新式 XML 格式写入,不进行压缩或加密。

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

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

审核日志文件以 XML 格式写入,使用 UTF-8 编码(每个字符最多 4 字节)。根元素是 <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

    许多这些值对应于 COM_xxx 命令值,列在 my_command.h 头文件中。例如, 创建 DB更改用户 对应于 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。当审核日志插件打开审核日志文件时,它将序列号初始化为审核日志文件的大小,然后为每个记录日志增加1。时间戳是一个 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.1.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>

    对于连接事件,这个元素表示默认数据库;如果没有默认数据库,则元素为空。对于表访问事件,该元素表示访问表所属的数据库。

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

    一个字符串,表示在身份验证过程中使用的外部用户名,由插件设置的客户端身份验证所用。在本机(built-in)MySQL身份验证中,或者如果插件不设置该值,则该元素为空。该值与external_user系统变量相同(见第 8.2.19 节,“代理用户”)。

    示例:

    <OS_LOGIN>jeffrey</OS_LOGIN>
  • <操作系统版本>

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

    示例:

    <OS_VERSION>x86_64-Linux</OS_VERSION>
  • <特权用户>

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

    示例:

    <PRIV_USER>jeffrey</PRIV_USER>
  • <代理用户>

    一个字符串,表示代理用户(见第 8.2.19 节,“代理用户”)。如果用户代理不生效,则该值为空。

    示例:

    <PROXY_USER>developer</PROXY_USER>
  • <服务器 ID>

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

    示例:

    <SERVER_ID>1</SERVER_ID>
  • <SQL 文本>

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

    示例:

    <SQLTEXT>DELETE FROM t1</SQLTEXT>
  • <启动选项>

    一个字符串,表示在启动 MySQL 服务器时提供的选项。第一个选项是服务器可执行文件的路径。

    示例:

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

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

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

    警告不被记录。

    示例:

    <STATUS>1051</STATUS>
  • <状态代码>

    一个无符号整数,表示命令状态:0 表示成功,1 表示错误发生。

    代码值与状态值不同:STATUS_CODE值为0表示成功,1表示错误,这与Audit Vault的EZ_collector消费者兼容。STATUSmysql_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>

审核日志文件以 XML 格式写入,使用 UTF-8 编码(每个字符最多 4 字节)。根元素是 <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

    可能的值是 审核, 二进制转储, 更改用户, 关闭语句, 连接出, 连接, 创建数据库, 守护进程, 调试, 延迟插入, 删除数据库, 执行, 获取, 字段列表, 初始化数据库, 杀死, 长数据, 无审核, Ping, 准备, 进程列表, 查询, 退出, 刷新, 注册从属, 重置语句, 设置选项, 关闭, 睡眠, 统计信息, 表转储, 表删除, 表插入, 表读取, 表更新, 时间

    许多这些值对应于 COM_xxx 命令值,列在 my_command.h 头文件中。例如, "创建数据库""更改用户" 对应于 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

    一个字符串,表示在身份验证过程中使用的外部用户名,由插件设置的客户端身份验证。使用本机(内置)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 语句的文本。该值可以为空。长值可能被截断。该字符串,以 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的区别。

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

    警告不被记录。

    示例:STATUS="1051"

  • STATUS_CODE

    一个无符号整数,表示命令状态:0 表示成功,1 表示错误。

    代码STATUS_CODE值与STATUS值不同:STATUS_CODE为0表示成功,1表示错误,这与Audit Vault的EZ_collector消费者兼容。STATUSmysql_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个字节)。当审核日志插件开始写入新日志文件时,它写入开头的[数组标记。当插件关闭日志文件时,它写入结尾的]数组标记。结尾标记在文件打开时不存在。

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

  • 一些项目出现在每个审核记录中。其他项目是可选的,可能根据审核记录类型出现。

  • 审核记录中的项目顺序不确定。

  • 项目值不是固定长度的。长值可能被截断,如项目描述中所示。

  • 双引号"和反斜杠\分别编码为\"\\

JSON格式是唯一支持可选查询时间和大小统计的审核日志文件格式。这项数据在慢查询日志中可用于检测异常活动。

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

以下示例显示了不同事件类型(由classevent项指示)的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,accountlogin不存在。

审核关闭事件:

{ "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不存在。

连接或更改用户事件:

{ "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帐户。该值是一个哈希,包含这些项目,相当于CURRENT_USER()函数中的值:userhost

    示例:

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

    一个字符串,表示事件类。该类定义了事件类型,当与指定事件子类的event项结合时。

    示例:

    "class": "connection"

    以下表显示了classevent值的允许组合。

    表 8.36 审核日志类和事件组合

    类值 允许的事件值
    audit startup, shutdown
    connection connect, change_user, disconnect
    general status
    table_access_data read, delete, insert, update

  • connection_data

    客户端连接信息。该值是一个哈希表,包含以下项目:connection_typestatusdb,可能还有connection_attributes。这项仅出现在审核记录的类值为connection时。

    示例:

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

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

    connection_attributes值是一个哈希表,按名称和值表示每个属性。

    示例:

    "connection_attributes": {
      "_pid": "43236",
      "_os": "macos0.14",
      "_platform": "x86_64",
      "_client_version": "8.1.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。这项仅出现在审核记录的类值为general时。

    示例:

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

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

    示例:

    "id": 2

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

  • 登录

    指示客户端如何连接到服务器的信息。该值是一个哈希,包含以下项目:用户osip代理

    示例:

    "login": { "user": "root", "os": "", "ip": "::1", "proxy": "" }
  • 查询统计信息

    可选的查询统计信息,用于异常检测。该值是一个哈希,包含以下项目:查询时间发送的行数检查的行数接收的字节发送的字节。有关设置查询统计信息的说明,请参阅添加查询统计信息以检测异常

    示例:

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

    与审核日志插件终止相关的信息。该值是一个哈希,包含以下项目:服务器 ID。该项目仅出现在审核记录的 classevent 值为 auditshutdown 的情况下。

    示例:

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

    与审核日志插件初始化相关的信息。该值是一个哈希,包含以下项目:服务器 ID操作系统版本MySQL 版本参数。该项目仅出现在审核记录的 classevent 值为 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" ] }
  • 表访问数据

    关于表访问的信息。该值是一个哈希,包含以下项目:数据库表名查询SQL 命令。该项目仅出现在审核记录的 class 值为 table_access 的情况下。

    示例:

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

    该字段与 timestamp 字段相似,但该值是一个整数,表示审核事件生成的日期和时间的 UNIX 时间戳值。

    示例:

    "time" : 1618498687

    time 字段仅在 JSON 格式日志文件中出现,如果启用了 audit_log_format_unix_timestamp 系统变量。

  • timestamp

    一个字符串,表示 UTC 值,以 YYYY-MM-DD hh:mm:ss 格式,表示审核事件生成的日期和时间。例如,来自客户端的 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" ]
  • 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_data,它是默认数据库。对于 table_access_data,它是表数据库。

    示例:

    "db": "test"
  • host

    一个字符串,表示客户端主机名。

    示例:

    "host": "localhost"
  • ip

    一个字符串,表示客户端 IP 地址。

    示例:

    "ip": "::1"
  • mysql_version

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

    示例:

    "mysql_version": "5.7.21-log"
  • os

    一个字符串,表示在身份验证过程中使用的外部用户名,由插件设置。使用本机(内置)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 表示成功,非零表示错误。这与 C API 函数 mysql_errno() 的值相同。

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

    警告不被记录。

    示例:

    "status": 1051
  • table

    一个字符串,表示表名。

    示例:

    "table": "t1"
  • user

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

    • account 项中,user 是一个字符串,表示服务器认证的客户端用户。这是服务器用于权限检查的用户名。

    • login 项中,user 是一个字符串,表示客户端发送的用户名。

    示例:

    "user": "root"