文档主页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  审计日志文件格式

8.4.5.4 审计日志文件格式

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

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

  • 新式 XML 格式 (audit_log_format=NEW):一种与 Oracle Audit Vault 相比具有更好兼容性的 XML 格式。MySQL 8.4 默认使用新式 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>

审计日志文件使用 UTF-8 编码编写为 XML(每个字符最多 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

    可能的值有 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。当审计日志插件打开审计日志文件时,它会将序列号初始化为审计日志文件的大小,然后为记录的每条记录将序列号递增 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 命令计数器。例如,对于 DROP TABLESELECT 语句,xxx 分别为 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>

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

  • <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 系统变量的值相同(请参阅第 8.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>

    一个字符串,表示代理用户(请参阅第 8.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_CODE> 的描述。

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

    不会记录警告。

    示例

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

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

    STATUS_CODE 值与 STATUS 值不同: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>

审计日志文件使用 UTF-8 编码编写为 XML(每个字符最多 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

    可能的值有 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 属性,用于标识事件引用的表以及包含该表的数据库。

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

  • RECORD_ID

    审计记录的唯一标识符。该值由序列号和时间戳组成,格式为 SEQ_TIMESTAMP。当审计日志插件打开审计日志文件时,它会将序列号初始化为审计日志文件的大小,然后为记录的每条记录将序列号递增 1。时间戳是一个 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 命令计数器。例如,对于 DROP TABLESELECT 语句,xxx 分别为 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_CODE 的描述。

    审计日志不包含 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。

以下示例显示了不同事件类型的 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() 函数值的项目:userhost

    示例

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

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

    示例

    "class": "connection"

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

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

    类值 允许的事件值
    audit startupshutdown
    connection connectchange_userdisconnect
    general status
    table_access_data readdeleteinsertupdate

  • connection_data

    有关客户端连接的信息。该值是一个哈希,包含以下项目:connection_typestatusdb,以及可能的 connection_attributes。此项目仅出现在 class 值为 connection 的审计记录中。

    示例

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

    class 值为 connectionevent 值为 connect 的事件可能包含 connection_attributes 项目,以显示客户端在连接时传递的连接属性。(有关这些属性的信息,这些属性也在 Performance Schema 表中公开,请参阅 第 29.12.9 节“Performance 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。此项目仅出现在 classevent 值分别为 auditshutdown 的审计记录中。

    示例

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

    与审计日志插件初始化相关的信息。该值是一个哈希,包含以下项目:server_idos_versionmysql_versionargs。此项目仅出现在 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

    有关访问表的信息。该值是一个哈希,包含以下项目:dbtablequerysql_command。此项目仅出现在 class 值为 table_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

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

  • 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" ]
  • bytes_received

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

    示例

    "bytes_received": 78858
  • bytes_sent

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

    示例

    "bytes_sent": 18384
  • 命令

    一个字符串,表示生成审计事件的指令类型,例如服务器从客户端接收到的命令。

    示例

    "command": "Query"
  • 连接类型

    与服务器连接的安全状态。允许的值为 tcp/ip(建立未加密的 TCP/IP 连接)、ssl(建立加密的 TCP/IP 连接)、socket(Unix 套接字文件连接)、named_pipe(Windows 命名管道连接)和 shared_memory(Windows 共享内存连接)。

    示例

    "connection_type": "tcp/tcp"
  • 数据库

    表示数据库名称的字符串。对于 connection_data,它是默认数据库。对于 table_access_data,它是表数据库。

    示例

    "db": "test"
  • 主机

    表示客户端主机名的字符串。

    示例

    "host": "localhost"
  • IP 地址

    表示客户端 IP 地址的字符串。

    示例

    "ip": "::1"
  • MySQL 版本

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

    示例

    "mysql_version": "5.7.21-log"
  • 操作系统

    表示在身份验证过程中使用的外部用户名,由用于对客户端进行身份验证的插件设置。使用原生(内置)MySQL 身份验证,或者如果插件未设置该值,则此属性为空。该值与 external_user 系统变量的值相同。请参阅 第 8.2.19 节“代理用户”

    示例

    "os": "jeffrey"
  • 操作系统版本

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

    示例

    "os_version": "i686-Linux"
  • 代理

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

    示例

    "proxy": "developer"
  • 查询

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

    示例

    "query": "DELETE FROM t1"
  • 查询时间

    查询执行时间,以微秒(如果选择 longlong 数据类型)或秒(如果选择 double 数据类型)为单位。此项是可选查询统计信息的一部分。

    示例

    "query_time": 0.116250
  • 检查的行数

    查询期间访问的行数。此项是可选查询统计信息的一部分。

    示例

    "rows_examined": 20878
  • 发送的行数

    作为结果发送到客户端的行数。此项是可选查询统计信息的一部分。

    示例

    "rows_sent": 3
  • 服务器 ID

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

    示例

    "server_id": 1
  • SQL 命令

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

    示例

    "sql_command": "insert"

    这些值对应于 statement/sql/xxx 命令计数器。例如,对于 DROP TABLESELECT 语句,xxx 分别为 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": "t1"
  • 用户

    表示用户名的字符串。user 的含义因其出现的项目而异

    • account 项目中,user 是表示服务器对客户端进行身份验证时所使用的用户的字符串。这是服务器用于权限检查的用户名。

    • login 项目中,user 是表示客户端发送的用户名。

    示例

    "user": "root"