Documentation Home
MySQL 8.0 参考手册  / 第 6 章 安全  / 6.4 安全组件和插件  / 6.4.5 MySQL企业审计  /  6.4.5.4 审计日志文件格式

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):将审核日志写入 JSON 数组。只有这种格式支持可选的查询时间和大小统计信息,这些信息从 MySQL 8.0.30 开始可用。

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

如果你改变audit_log_format了,建议你也改变 audit_log_file。例如,如果您设置audit_log_formatJSON,则设置 audit_log_fileaudit.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>不保证 元素内元素的顺序 。

  • 元素值不是固定长度的。如稍后给出的元素描述中所示,长值可能会被截断。

  • <、和字符分别 编码为>、 、 和 。NUL 字节 (U+00) 被编码为字符。 "&&lt;&gt;&quot;&amp;?

  • 作为 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, TableReadTableUpdateTime

    其中许多值对应 于头文件 中列出的命令值 。例如,和分别对应于 和 。 COM_xxxmy_command.hCreate DBChange userCOM_CREATE_DBCOM_CHANGE_USER

    具有 伴随事件<NAME>值的 事件。例如,以下语句生成一个 事件、两个 事件和一个 事件: TableXXXQueryQueryTableReadTableInsert

    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 值的字符串,其 格式指示生成审计事件的日期和时间。例如,对应于执行从客户端接收到的 SQL 语句的事件具有 在语句完成之后发生的值,而不是在接收到语句时发生的值。 YYYY-MM-DDThh:mm:ss UTC<TIMESTAMP>

    例子:

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

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

  • <COMMAND_CLASS>

    指示执行的操作类型的字符串。

    例子:

    <COMMAND_CLASS>drop_table</COMMAND_CLASS>

    这些值对应于 命令计数器。例如, 分别是 is 和 for and 语句。以下语句显示可能的名称: statement/sql/xxxxxxdrop_tableselectDROP 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>

    从 MySQL 8.0.19 开始, <COMMAND_CLASS>值为 的 事件connect可能包含一个 <CONNECTION_ATTRIBUTES>元素,用于显示客户端在连接时传递的连接属性。(有关这些属性的信息,这些属性也在性能模式表中公开,请参阅 第 27.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.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.19 节,“代理用户”)。

    例子:

    <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.19 节,“代理用户”)。如果用户代理未生效,则该值为空。

    例子:

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

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

    例子:

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

    表示 SQL 语句文本的字符串。该值可以为空。长值可能会被截断。该字符串与审计日志文件本身一样,是使用 UTF-8 编写的(每个字符最多 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_CODE>有关它与 的区别的信息, 请参阅说明 <STATUS>

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

    不记录警告。

    例子:

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

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

    STATUS_CODE值与 以下值不同STATUSSTATUS_CODE0 表示成功,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>不保证元素 内属性的顺序 。

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

  • <、和字符分别 编码为>、 、 和 。NUL 字节 (U+00) 被编码为字符。 "&&lt;&gt;&quot;&amp;?

  • 作为 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, TableReadTableUpdateTime

    其中许多值对应 于头文件 中列出的命令值 。例如,和 分别对应于 和 。 COM_xxxmy_command.h"Create DB""Change user"COM_CREATE_DBCOM_CHANGE_USER

    具有 伴随事件NAME值的 事件。例如,以下语句生成一个 事件、两个 事件和一个 事件: TableXXXQueryQueryTableReadTableInsert

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

    每个 事件都有和 属性来标识事件所引用的表和包含该表的数据库。 TableXXXTABLEDB

    Connect旧式 XML 审计日志格式的事件不包括连接属性。

  • RECORD_ID

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

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

  • TIMESTAMP

    表示 UTC 值的字符串,其 格式指示生成审计事件的日期和时间。例如,对应于执行从客户端接收到的 SQL 语句的事件具有在语句完成之后发生的值,而不是在接收到语句时发生的值。 YYYY-MM-DDThh:mm:ss UTCTIMESTAMP

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

以下属性在 <AUDIT_RECORD>元素中是可选的。其中许多只发生在具有特定属性值的元素中 NAME

  • COMMAND_CLASS

    指示执行的操作类型的字符串。

    例子:COMMAND_CLASS="drop_table"

    这些值对应于 命令计数器。例如, 分别是 is 和 for and 语句。以下语句显示可能的名称: statement/sql/xxxxxxdrop_tableselectDROP 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该值与系统变量的值相同(请参阅第 6.2.19 节,“代理用户”)。

    例子:OS_LOGIN="jeffrey"

  • OS_VERSION

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

    例子:OS_VERSION="x86_64-Linux"

  • PRIV_USER

    一个字符串,表示服务器将客户端验证为的用户。这是服务器用于权限检查的用户名,它可能与USER值不同。

    例子:PRIV_USER="jeffrey"

  • PROXY_USER

    表示代理用户的字符串(请参阅 第 6.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值与 以下值不同STATUSSTATUS_CODE0 表示成功,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 格式是唯一支持可选查询时间和大小统计信息的审计日志文件格式,从 MySQL 8.0.30 开始可用。此数据在慢速查询日志中可用于符合条件的查询,在审计日志的上下文中,它同样有助于检测异常值以进行活动分析。

要将查询统计信息添加到日志文件,您必须使用 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不存在。

审计关机事件:

{ "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()于以下部分中函数的值:user, host

    例子:

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

    表示事件类的字符串。event当与指定事件子类 的项目一起使用时,类定义事件的类型 。

    例子:

    "class": "connection"

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

    表 6.34 审计日志类和事件组合

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

  • connection_data

    有关客户端连接的信息。该值是包含以下项目的散列: connection_typestatusdb,可能还有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": "macos0.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": "" }
  • query_statistics

    异常值检测的可选查询统计信息。该值是包含这些项目的散列: query_time, rows_sent, rows_examined, bytes_received, bytes_sent。有关设置查询统计信息的说明,请参阅 为离群值检测添加查询统计信息

    例子:

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

    有关审计日志插件终止的信息。该值是包含这些项目的散列: server_id该项目仅出现在 和 的审计记录中class, 分别 eventaudit和。shutdown

    例子:

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

    有关审计日志插件初始化的信息。该值是包含这些项目的散列: server_id, os_version, mysql_version, args。此项仅针对分别具有 和 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" ] }
  • table_access_data

    有关对表的访问的信息。该值是包含以下项目的散列:db, table, query, , 该项目仅出现在值为 的 sql_command审计记录中。 classtable_access

    例子:

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

    该字段与字段中的字段类似 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该值与系统变量的值相同。请参阅第 6.2.19 节,“代理用户”

    例子:

    "os": "jeffrey"
  • os_version

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

    例子:

    "os_version": "i686-Linux"
  • proxy

    表示代理用户的字符串(请参阅 第 6.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"

    这些值对应于 命令计数器。例如, 分别是 is 和 for and 语句。以下语句显示可能的名称: statement/sql/xxxxxxdrop_tableselectDROP 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是一个字符串,表示服务器对客户端进行身份验证的用户。这是服务器用于权限检查的用户名。

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

    例子:

    "user": "root"