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。 -
元素值不是固定长度。长值可能会被截断,如后面给出的元素说明中所述。
-
<
,>
,"
和&
字符分别编码为<
,>
,"
和&
。 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
可能的值是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
,_21,Ping
Refresh
,Register Slave
,Reset stmt
,Set option
,Shutdown
,Sleep
,Statistics
,Table Dump
,TableDelete
,TableInsert
,TableRead
,TableUpdate
,Time
。
其中许多值与my_command.h
头文件中列出的COM_xxx
命令值相对应。例如,Create DB
和Change user
分别对应于COM_CREATE_DB
和COM_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 TABLE和SELECT语句,* xxx
*分别是drop_table
和select
。以下语句显示可能的名称:
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_CODE
table 示成功为 0,table 示错误为 1,与 Audit Vault 的 EZ_collector 使用者兼容。 STATUS
是mysql_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。 -
属性值不是固定长度。长值可能会被截断,如后面给出的属性描述中所示。
-
<
,>
,"
和&
字符分别编码为<
,>
,"
和&
。 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
可能的值是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
,_21,Ping
Refresh
,Register Slave
,Reset stmt
,Set option
,Shutdown
,Sleep
,Statistics
,Table Dump
,TableDelete
,TableInsert
,TableRead
,TableUpdate
,Time
。
其中许多值与my_command.h
头文件中列出的COM_xxx
命令值相对应。例如,"Create DB"
和"Change user"
分别对应于COM_CREATE_DB
和COM_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 值,指示审核日志插件打开文件的日期和时间。
示例: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 TABLE和SELECT语句,* xxx
*分别是drop_table
和select
。以下语句显示可能的名称:
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_CODE
table 示成功为 0,table 示错误为 1,与 Audit Vault 的 EZ_collector 使用者兼容。 STATUS
是mysql_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。
-
项目值不是固定长度。长值可能会被截断,如后面给出的项目说明中所述。
-
"
和\
字符分别编码为\"
和\\
。
以下示例显示了不同事件类型(如class
和event
项所示)的 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,而account
和login
不存在。
审核关闭事件:
{ "timestamp": "2019-10-03 14:28:20",
"id": 3,
"class": "audit",
"event": "shutdown",
"connection_id": 0,
"shutdown_data": { "server_id": 1 } }
由于服务器关闭(而不是在运行时禁用)而卸载了审计日志插件时,connection_id
设置为 0,而account
和login
不存在。
连接或更改用户事件:
{ "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 帐户。该值是一个散列,其中包含与user
,host
部分中的CURRENT_USER()函数的值等效的这些项。
Example:
"account": { "user": "root", "host": "localhost" }
class
table 示事件类的字符串。该类与指定事件子类的event
项一起定义事件的类型。
Example:
"class": "connection"
下 table 显示了class
和event
值的允许组合。
table6.25 审核日志类别和事件组合
Class Value | 允许的事件值 |
---|---|
audit |
startup , shutdown |
connection |
connect , change_user , disconnect |
general |
status |
table_access_data |
read , delete , insert , update |
connection_data
有关 Client 端连接的信息。该值为包含以下各项的哈希值:connection_type
,status
,db
。此项仅针对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
有关已执行的语句或命令的信息。该值为包含以下各项的哈希值:command
,sql_command
,query
,status
。此项仅适用于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 端如何连接到服务器的信息。该值为包含以下各项的哈希值:user
,os
,ip
,proxy
。
Example:
"login": { "user": "root", "os": "", "ip": "::1", "proxy": "" }
shutdown_data
有关审核日志插件终止的信息。该值是包含以下项目的哈希:server_id
仅对于分别具有audit
和shutdown
的class
和event
值的审计记录,才出现此项目。
Example:
"shutdown_data": { "server_id": 1 }
startup_data
与审核日志插件初始化有关的信息。该值为包含以下各项的哈希值:server_id
,os_version
,mysql_version
,args
。仅对于class
和event
值分别为audit
和startup
的审计记录,才出现此项。
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 的信息。该值是包含以下项目的哈希:db
,table
,query
,sql_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 TABLE和SELECT语句,* xxx
*分别是drop_table
和select
。以下语句显示可能的名称:
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"