文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

8.4.5.4 审计日志文件格式

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

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

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

    可能的值为 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> 元素,用于显示客户端在连接时传递的连接属性。(有关这些属性的信息,这些属性也暴露在 Performance Schema 表中,请参见 第 29.12.9 节,“Performance Schema 连接属性表”。)

    <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,对于错误,STATUS_CODE 为 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

    可能的值为 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="localhost"

  • IP

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

    示例:IP="127.0.0.1"

  • MYSQL_版本

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

    示例:MYSQL_VERSION="5.7.21-log"

  • OS_登录

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

    示例:OS_LOGIN="jeffrey"

  • OS_版本

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

    示例:OS_VERSION="x86_64-Linux"

  • PRIV_用户

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

    示例:PRIV_USER="jeffrey"

  • 代理用户

    一个字符串,表示代理用户(请参见 第 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_选项

    表示在启动 MySQL 服务器时在命令行或选项文件中提供的选项的字符串。

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

  • 状态

    表示命令状态的无符号整数:0 表示成功,非零表示发生错误。这与mysql_errno() C API 函数的值相同。请参见STATUS_CODE的描述,了解其与STATUS的不同之处。

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

    警告不会被记录。

    示例:STATUS="1051"

  • 状态代码

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

    STATUS_CODE 值与 STATUS 值不同:对于成功,STATUS_CODE 为 0,对于错误,STATUS_CODE 为 1,这与 Audit Vault 的 EZ_collector 消费者兼容。 STATUSmysql_errno() C API 函数的值。对于成功,它为 0,对于错误,它为非零,因此对于错误,它不一定是 1。

    示例:STATUS_CODE="0"

  • 表格

    一个字符串,表示表名。

    示例:TABLE="t3"

  • 用户

    表示客户端发送的用户名的字符串。这可能与PRIV_USER值不同。

  • 版本

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

    示例: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 哈希。对于具有哈希值的项目,说明只列出该哈希中的项目名称。有关第二级哈希项目的更完整说明,请参见本节后面的内容。

  • 帐户

    与事件关联的 MySQL 帐户。该值是一个哈希,包含这些与CURRENT_USER()函数值等效的项目:userhost

    示例

    "account": { "user": "root", "host": "localhost" }
  • 表示事件类的字符串。该类定义了事件的类型,当与指定事件子类的event项目结合时。

    示例

    "class": "connection"

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

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

    类值 允许的事件值
    审计 startupshutdown
    连接 connectchange_userdisconnect
    一般 状态
    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项目,以显示客户端在连接时传递的连接属性。(有关这些属性的信息,这些属性也在性能架构表中公开,请参见第 29.12.9 节,“性能架构连接属性表”。)

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

    表示事件子类的字符串。该子类定义了事件的类型,当与指定事件类的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对是唯一的。这些对是标识日志中事件位置的书签。

  • 登录

    指示客户端如何连接到服务器的信息。该值是一个哈希,包含以下项目: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" }
  • 时间

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

    示例

    "time" : 1618498687

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

  • 时间戳

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

    示例

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

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

这些项目出现在与 JSON 格式审计记录的顶层项目关联的哈希值中

  • 参数

    启动 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;
  • 状态

    表示命令状态的无符号整数:0 表示成功,非零表示出现错误。这与 mysql_errno() C API 函数的值相同。

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

    警告不会被记录。

    示例

    "status": 1051
  • 一个字符串,表示表名。

    示例

    "table": "t1"
  • 用户

    表示用户名的字符串。含义取决于 user 出现的项。

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

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

    示例

    "user": "root"