6.4.5.4 审核日志文件格式

每当发生可审核事件时,MySQL 服务器就会调用审核日志插件将审核记录写入其日志文件。通常,在插件启动后编写的第一条审核记录包含服务器描述和启动选项。紧随其后的元素 table 示事件,例如 Client 端连接和断开事件,已执行的 SQL 语句等。仅记录顶层语句,而不记录诸如触发器或存储过程之类的存储程序中的语句。诸如LOAD DATA之类的语句引用的文件的内容未记录。

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

  • 新型 XML 格式(audit_log_format=NEW):与老式 XML 格式相比,与 Oracle Audit Vault 兼容性更好的 XML 格式。 MySQL 5.7 默认使用新型 XML 格式。

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

  • JSON 格式(audit_log_format=JSON)

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

Note

有关更改日志格式时要考虑的问题的信息,请参阅选择审核日志文件格式

以下各节描述了可用的审核日志记录格式:

新型 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>
  <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(每个字符最多 4 个字节)以 XML 格式编写。根元素是<AUDIT>。根元素包含<AUDIT_RECORD>个元素,每个元素都提供有关已审核事件的信息。当审核日志插件开始编写新的日志文件时,它将编写 XML 声明并打开<AUDIT>根元素标记。当插件关闭日志文件时,它会写入结束</AUDIT>根元素标签。文件打开时,关闭标签不存在。

<AUDIT_RECORD>个元素中的元素具有以下 Feature:

  • 有些元素会出现在每个<AUDIT_RECORD>元素中。其他是可选的,并且可能会出现,具体取决于审核记录类型。

  • 不能保证<AUDIT_RECORD>元素中元素的 Sequences。

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

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

  • 无效的 XML 字符是使用数字字符引用编码的。有效的 XML 字符是:

#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

每个<AUDIT_RECORD>元素都必须包含以下元素:

  • <NAME>

一个字符串,代 table 生成审核事件的指令的类型,例如服务器从 Client 端收到的命令。

Example:

<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 DataNoAudit,_21,Ping RefreshRegister 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事件包含<DB><TABLE>元素,以标识该事件所引用的 table。

  • <RECORD_ID>

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

Example:

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

YYYY-MM-DDThh:mm:ss UTC格式 table 示 UTC 值的字符串,table 示生成审核事件的日期和时间。例如,与从 Client 端接收到的 SQL 语句的执行相对应的事件具有<TIMESTAMP>值,该值在该语句完成之后而不是在接收到它时发生。

Example:

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

以下元素是<AUDIT_RECORD>元素中的可选元素。其中许多仅发生在特定的<NAME>元素值上。

  • <COMMAND_CLASS>

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

Example:

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

代 tableClient 端连接标识符的无符号整数。这与会话中CONNECTION_ID()函数返回的值相同。

Example:

<CONNECTION_ID>127</CONNECTION_ID>
  • <CONNECTION_TYPE>

与服务器的连接的安全状态。允许的值为TCP/IP(未加密构建的 TCP/IP 连接),SSL/TLS(通过加密构建的 TCP/IP 连接),Socket(Unix 套接字文件连接),Named Pipe(Windows 命名管道连接)和Shared Memory(Windows 共享内存连接)。

Example:

<CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE>
  • <DB>

代 table 默认数据库名称的字符串。

Example:

<DB>test</DB>
  • <HOST>

代 tableClient 端主机名的字符串。

Example:

<HOST>localhost</HOST>
  • <IP>

代 tableClient 端 IP 地址的字符串。

Example:

<IP>127.0.0.1</IP>
  • <MYSQL_VERSION>

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

Example:

<MYSQL_VERSION>5.7.21-log</MYSQL_VERSION>
  • <OS_LOGIN>

一个字符串,代 table 在身份验证过程中使用的外部用户名,该字符串由用于身份验证 Client 端的插件设置。使用本地(内置)MySQL 身份验证,或者如果插件未设置值,则此元素为空。该值与external_user系统变量的值相同(请参见第 6.2.14 节“代理用户”)。

Example:

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

一个字符串,table 示在其上构建或正在运行服务器的 os。

Example:

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

一个字符串,代 table 服务器验证 Client 端身份的用户。这是服务器用于特权检查的用户名,并且可能与<USER>值不同。

Example:

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

代 table 代理用户的字符串(请参见第 6.2.14 节“代理用户”)。如果用户代理无效,则该值为空。

Example:

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

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

Example:

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

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

Example:

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

一个字符串,table 示启动 MySQL 服务器时在命令行或选项文件中给出的选项。第一个选项是服务器可执行文件的路径。

Example:

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

table 示命令状态的无符号整数:0table 示成功,如果发生错误则非零。这与mysql_errno() C API 函数的值相同。有关其与<STATUS>的区别的信息,请参见<STATUS_CODE>的描述。

审核日志不包含 SQLSTATE 值或错误消息。要查看错误代码,SQLSTATE 值和消息之间的关联,请参见第 B.3.1 节“服务器错误消息参考”

没有记录警告。

Example:

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

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

STATUS_CODE值与STATUS值不同:STATUS_CODEtable 示成功为 0,table 示错误为 1,与 Audit Vault 的 EZ_collector 使用者兼容。 STATUSmysql_errno() C API 函数的值。对于成功,该值为 0,对于错误,该值为非零,因此对于错误,不一定为 1.

Example:

<STATUS_CODE>0</STATUS_CODE>
  • <TABLE>

代 tabletable 名的字符串。

Example:

<TABLE>t3</TABLE>
  • <USER>

代 tableClient 端发送的用户名的字符串。这可能与<PRIV_USER>值不同。

Example:

<USER>root[root] @ localhost [127.0.0.1]</USER>
  • <VERSION>

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

Example:

<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(每个字符最多 4 个字节)以 XML 格式编写。根元素是<AUDIT>。根元素包含<AUDIT_RECORD>个元素,每个元素都提供有关已审核事件的信息。当审核日志插件开始编写新的日志文件时,它将编写 XML 声明并打开<AUDIT>根元素标记。当插件关闭日志文件时,它会写入结束</AUDIT>根元素标签。文件打开时,关闭标签不存在。

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

  • 一些属性出现在每个<AUDIT_RECORD>元素中。其他是可选的,并且可能会出现,具体取决于审核记录类型。

  • 不能保证<AUDIT_RECORD>元素内的属性 Sequences。

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

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

  • 无效的 XML 字符是使用数字字符引用编码的。有效的 XML 字符是:

#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

以下属性在每个<AUDIT_RECORD>元素中都是必需的:

  • NAME

一个字符串,代 table 生成审核事件的指令的类型,例如服务器从 Client 端收到的命令。

示例: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 DataNoAudit,_21,Ping RefreshRegister 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事件具有DBTABLE属性,以标识该事件所引用的 table。

  • RECORD_ID

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

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

  • TIMESTAMP

YYYY-MM-DDThh:mm:ss UTC格式 table 示 UTC 值的字符串,table 示生成审核事件的日期和时间。例如,与从 Client 端接收到的 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

代 tableClient 端连接标识符的无符号整数。这与会话中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

代 table 默认数据库名称的字符串。

示例:DB="test"

  • HOST

代 tableClient 端主机名的字符串。

示例:HOST="localhost"

  • IP

代 tableClient 端 IP 地址的字符串。

示例:IP="127.0.0.1"

  • MYSQL_VERSION

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

示例:MYSQL_VERSION="5.7.21-log"

  • OS_LOGIN

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

示例:OS_LOGIN="jeffrey"

  • OS_VERSION

一个字符串,table 示在其上构建或正在运行服务器的 os。

示例:OS_VERSION="x86_64-Linux"

  • PRIV_USER

一个字符串,代 table 服务器验证 Client 端身份的用户。这是服务器用于特权检查的用户名,它可能与USER值不同。

示例:PRIV_USER="jeffrey"

  • PROXY_USER

代 table 代理用户的字符串(请参见第 6.2.14 节“代理用户”)。如果用户代理无效,则该值为空。

示例:PROXY_USER="developer"

  • SERVER_ID

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

示例:SERVER_ID="1"

  • SQLTEXT

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

示例:SQLTEXT="DELETE FROM t1"

  • STARTUP_OPTIONS

一个字符串,table 示启动 MySQL 服务器时在命令行或选项文件中给出的选项。

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

  • STATUS

table 示命令状态的无符号整数:0table 示成功,如果发生错误则非零。这与mysql_errno() C API 函数的值相同。有关其与STATUS的区别的信息,请参见STATUS_CODE的描述。

审核日志不包含 SQLSTATE 值或错误消息。要查看错误代码,SQLSTATE 值和消息之间的关联,请参见第 B.3.1 节“服务器错误消息参考”

没有记录警告。

示例:STATUS="1051"

  • STATUS_CODE

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

STATUS_CODE值与STATUS值不同:STATUS_CODEtable 示成功为 0,table 示错误为 1,与 Audit Vault 的 EZ_collector 使用者兼容。 STATUSmysql_errno() C API 函数的值。对于成功,该值为 0,对于错误,该值为非零,因此对于错误,不一定为 1.

示例:STATUS_CODE="0"

  • TABLE

代 tabletable 名的字符串。

示例:TABLE="t3"

  • USER

代 tableClient 端发送的用户名的字符串。这可能与PRIV_USER值不同。

  • VERSION

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

示例:VERSION="1"

JSON 审核日志文件格式

对于 JSON 格式的审核日志记录(audit_log_format=JSON),日志文件的内容形成一个JSON数组,每个数组元素将已审核的事件 table 示为键值对的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 个字节)。当审核日志插件开始写入新的日志文件时,它将写入开头的[数组标记。当插件关闭日志文件时,它将写入结束]数组标记。文件打开时,关闭标记不存在。

审核 Logging 的项目具有以下 Feature:

  • 一些项出现在每个审核 Logging。其他是可选的,并且可能会出现,具体取决于审核记录类型。

  • 不能保证审核 Logging 的项目 Sequences。

  • 项目值不是固定长度。长值可能会被截断,如后面给出的项目说明中所述。

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

以下示例显示了不同事件类型(如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" } }

Disconnect event:

{ "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" } }

Query event:

{ "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 } }

table 访问事件(读取,删除,插入,更新):

{ "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" } }

以下列 table 中的项目出现在 JSON 格式审核记录的顶级:每个项目值可以是标量或JSON哈希。对于具有哈希值的项目,描述仅列出该哈希内的项目名称。有关第二级哈希项的更完整说明,请参阅本节后面。

  • account

与事件关联的 MySQL 帐户。该值是一个散列,其中包含与userhost部分中的CURRENT_USER()函数的值等效的这些项。

Example:

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

table 示事件类的字符串。该类与指定事件子类的event项一起定义事件的类型。

Example:

"class": "connection"

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

table6.25 审核日志类别和事件组合

Class Value允许的事件值
auditstartup , shutdown
connectionconnect , change_user , disconnect
generalstatus
table_access_dataread , delete , insert , update
  • connection_data

有关 Client 端连接的信息。该值为包含以下各项的哈希值:connection_typestatusdb。此项仅针对class值为connection的审核记录出现。

Example:

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

代 tableClient 端连接标识符的无符号整数。这与会话中CONNECTION_ID()函数返回的值相同。

Example:

"connection_id": 5
  • event

一个字符串,代 table 事件类的子类。子类与指定事件类的class项一起定义事件的类型。有关更多信息,请参见class项说明。

Example:

"event": "connect"
  • general_data

有关已执行的语句或命令的信息。该值为包含以下各项的哈希值:commandsql_commandquerystatus。此项仅适用于class值为general的审核记录。

Example:

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

table 示事件 ID 的无符号整数。

Example:

"id": 2

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

  • login

指示 Client 端如何连接到服务器的信息。该值为包含以下各项的哈希值:userosipproxy

Example:

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

有关审核日志插件终止的信息。该值是包含以下项目的哈希:server_id仅对于分别具有auditshutdownclassevent值的审计记录,才出现此项目。

Example:

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

与审核日志插件初始化有关的信息。该值为包含以下各项的哈希值:server_idos_versionmysql_versionargs。仅对于classevent值分别为auditstartup的审计记录,才出现此项。

Example:

"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

有关访问 table 的信息。该值是包含以下项目的哈希:dbtablequerysql_command,仅对于class值为table_access的审计记录,才出现此项目。

Example:

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

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

Example:

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

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

这些项目显示在与 JSON 格式审核记录的顶级项目相关的哈希值中:

  • args

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

Example:

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

一个字符串,代 table 生成审核事件的指令的类型,例如服务器从 Client 端收到的命令。

Example:

"command": "Query"
  • connection_type

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

Example:

"connection_type": "tcp/tcp"
  • db

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

Example:

"db": "test"
  • host

代 tableClient 端主机名的字符串。

Example:

"host": "localhost"
  • ip

代 tableClient 端 IP 地址的字符串。

Example:

"ip": "::1"
  • mysql_version

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

Example:

"mysql_version": "5.7.21-log"
  • os

一个字符串,代 table 在身份验证过程中使用的外部用户名,该字符串由用于身份验证 Client 端的插件设置。使用本地(内置)MySQL 身份验证,或者如果插件未设置值,则此属性为空。该值与external_user系统变量的值相同。参见第 6.2.14 节“代理用户”

Example:

"os": "jeffrey"
  • os_version

一个字符串,table 示在其上构建或正在运行服务器的 os。

Example:

"os_version": "i686-Linux"
  • proxy

代 table 代理用户的字符串(请参见第 6.2.14 节“代理用户”)。如果用户代理无效,则该值为空。

Example:

"proxy": "developer"
  • query

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

Example:

"query": "DELETE FROM t1"
  • server_id

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

Example:

"server_id": 1
  • sql_command

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

Example:

"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

table 示命令状态的无符号整数:0table 示成功,如果发生错误则非零。这与mysql_errno() C API 函数的值相同。

审核日志不包含 SQLSTATE 值或错误消息。要查看错误代码,SQLSTATE 值和消息之间的关联,请参见第 B.3.1 节“服务器错误消息参考”

没有记录警告。

Example:

"status": 1051
  • table

代 tabletable 名的字符串。

Example:

"table": "t1"
  • user

代 table 用户名的字符串。含义因发生user的项目而异:

  • account个项目中,user是一个字符串,代 table 服务器验证 Client 端身份的用户。这是服务器用于特权检查的用户名。

    • login个项目中,user是代 tableClient 端发送的用户名的字符串。

Example:

"user": "root"