8.4.5.4 审计日志文件格式
MySQL 服务器在发生可审计事件时,调用 audit 日志插件将其写入到日志文件中。通常,启动后第一个audit记录包含服务器描述和启动选项。随后的元素表示客户端连接和断开、执行的 SQL 语句等事件。只记录顶层语句,不记录存储程序中的语句,如触发器或存储过程。引用文件内容,如LOAD DATA,不被记录。
要选择 audit 日志插件用于写入日志文件的格式,服务器启动时设置audit_log_format系统变量。可用的格式有:
-
新式 XML 格式 (
audit_log_format=NEW):一个与 Oracle 审计库更好的 XML 格式。MySQL 8.4 默认使用新式 XML 格式。 -
老式 XML 格式 (
audit_log_format=OLD):原来的 audit 日志格式,用于更早的 MySQL 系列中默认。 -
JSON 格式 (
audit_log_format=JSON):将 audit 日志写入 JSON 数组。只有这个格式支持可选的查询时间和大小统计信息。
默认情况下,audit 日志文件内容使用新式 XML 格式,不压缩也不加密。
如果您更改audit_log_format,建议同时更改audit_log_file。例如,如果您将audit_log_format设置为JSON,则将audit_log_file设置为audit.json。否则,新的日志文件将具有不同的格式,而所有文件都将具有相同的基本名称,但没有指示格式变更时的信息。
以下是一个新式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>元素中的子元素顺序不保证。 -
元素值不是固定长度。长值可能会像后续描述中所示被截断。
-
标签
<、>、"和&编码为<、>、"和&,分别。空字节(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可能的值是
Audit,Binlog Dump,Change user,Close stmt,Connect Out,Connect,Create DB,Daemon,Debug,Delayed insert,Drop DB,Execute,Fetch,Field List,Init DB,Kill,Long Data,NoAudit,Ping,Prepare,Processlist,Query,Quit,Refresh,Register Slave,Reset stmt,Set option,Shutdown,Sleep,Statistics,Table Dump,TableDelete,TableInsert,TableRead,TableUpdate,Time.这些值对应于
my_command.h头文件中列出的COM_命令值。例如,xxxCreate DB和Change user分别对应于COM_CREATE_DB和COM_CHANGE_USER。具有
<NAME>值为Table的事件伴随着XXXQuery事件。例如,以下语句生成一个Query事件,两个TableRead事件和一个TableInsert事件:INSERT INTO t3 SELECT t1.* FROM t1 JOIN t2;每个
Table事件包含XXX<TABLE>和<DB>元素,以标识该事件所指的表和包含该表的数据库。 -
<RECORD_ID>审核记录的唯一标识符。值由顺序号和时间戳组成,格式为
。当审核日志插件打开审核日志文件时,它将初始化顺序号为审核日志文件的大小,然后对每个记录递增顺序号。时间戳是 UTC 值,格式为SEQ_TIMESTAMP,表示审核日志插件打开文件的日期和时间。YYYY-MM-DDThh:mm:ss示例:
<RECORD_ID>12_2019-10-03T14:06:33</RECORD_ID> -
<TIMESTAMP>表示UTC值的字符串,格式为
,指示审核事件生成时间。例如,对于来自客户端的SQL语句执行事件,YYYY-MM-DDThh:mm:ssUTC<TIMESTAMP>值发生在语句完成后,而不是接收时。示例:
<TIMESTAMP>2019-10-03T14:09:45 UTC</TIMESTAMP>
<AUDIT_RECORD> 元素中的许多元素只与特定的 <NAME> 元素值一起出现。
-
<COMMAND_CLASS>表示执行的操作类型的字符串。
示例:
<COMMAND_CLASS>drop_table</COMMAND_CLASS>这些值对应于
statement/sql/命令计数器。例如,xxxxxx是drop_table和select对应于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_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>对于 connect 事件,这个元素表示默认数据库;如果没有默认数据库,元素为空。对于 table-access 事件,元素表示访问的表所属的数据库。
-
<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>用于身份验证过程中的外部用户名称,通过客户端认证插件设置的字符串。如果使用native(内置)MySQL身份验证或插件未设置该值,这个元素为空。该值与
external_user系统变量相同(见第8.2.19节,“代理用户”)。<OS_LOGIN>jeffrey</OS_LOGIN> -
<OS_VERSION>表示服务器在built或运行的操作系统名称。
<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 语句的字符串。该值可以为空。长值可能会被截断。这个字符串,像 audit 日志文件本身一样,使用 UTF-8 编码(每个字符最多 4 个字节),因此该值可能是转换结果。例如,原始语句可能来自客户端作为 SJIS 字符串。
示例:
<SQLTEXT>DELETE FROM t1</SQLTEXT> -
<STARTUP_OPTIONS>表示服务器启动时从命令行或选项文件中给定的选项字符串。第一个选项是服务器可执行文件的路径。
示例:
<STARTUP_OPTIONS>/usr/local/mysql/bin/mysqld --port=3306 --log_output=FILE</STARTUP_OPTIONS> -
<STATUS>表示命令状态的无符号整数:0 表示成功,非零表示错误发生。这与
mysql_errno()C API 函数的值相同。见<STATUS_CODE>的描述,以了解它与<STATUS>的区别。audit 日志不包含 SQLSTATE 值或错误信息。要查看错误代码、SQLSTATE 值和消息的关联,见 服务器错误参考。
警告信息不被记录。
示例:
<STATUS>1051</STATUS> -
<STATUS_CODE>表示命令状态的无符号整数:0 表示成功,1 表示错误发生。
STATUS_CODE 值与 STATUS 值不同:STATUS_CODE 为成功时为 0,错误时为 1,这与 Audit Vault 的 EZ_collector 消费者兼容。STATUS 是
mysql_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>表示 audit 日志文件格式版本的无符号整数。
<VERSION>1</VERSION>
<?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>元素中的属性顺序不保证。 -
属性值不是固定长度。长值可能会被截断,如后续的属性描述中所示。
-
字符 `<`、`>`、`"` 和 `&` 编码为 `
-
不合法的 XML 字符使用数字字符引用编码。有效的 XML 字符是:
#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
以下属性在每个 <AUDIT_RECORD> 元素中都是必需的:
-
NAME表示生成审核事件的指令类型,例如服务器从客户端接收到的命令。
示例:
NAME="Query"一些常见的
NAME值:Audit When auditing starts, which may be server startup time Connect When a client connects, also known as logging in Query An SQL statement (executed directly) Prepare Preparation of an SQL statement; usually followed by Execute Execute Execution of an SQL statement; usually follows Prepare Shutdown Server shutdown Quit When a client disconnects NoAudit Auditing has been turned off可能的值是
Audit,Binlog Dump,Change user,Close stmt,Connect Out,Connect,Create DB,Daemon,Debug,Delayed insert,Drop DB,Execute,Fetch,Field List,Init DB,Kill,Long Data,NoAudit,Ping,Prepare,Processlist,Query,Quit,Refresh,Register Slave,Reset stmt,Set option,Shutdown,Sleep,Statistics,Table Dump,TableDelete,TableInsert,TableRead,TableUpdate,Time.这些值对应于
my_command.h头文件中列出的COM_命令值。例如,xxx"Create DB"和"Change user"分别对应COM_CREATE_DB和COM_CHANGE_USER。具有
NAME值为Table的事件伴随着XXXQuery事件。例如,以下语句生成一个Query事件,两个TableRead事件和一个TableInsert事件:INSERT INTO t3 SELECT t1.* FROM t1 JOIN t2;每个
Table事件都有XXXTABLE和DB属性来标识该事件所指向的表和包含该表的数据库。Connect事件对于老式 XML 审计日志格式不包括连接属性。 -
RECORD_ID审核记录的唯一标识符。该值由顺序号和时间戳组成,格式为
。当审核日志插件打开审核日志文件时,它将初始化顺序号为审核日志文件的大小,然后对每个记录递增顺序号。时间戳是 UTC 值,格式为SEQ_TIMESTAMP,表示审核日志插件打开文件的日期和时间。YYYY-MM-DDThh:mm:ss示例:
RECORD_ID="12_2019-10-03T14:25:00" -
TIMESTAMP表示UTC值的字符串,格式为
,指示审核事件生成时间。例如,对于来自客户端的SQL语句执行事件,YYYY-MM-DDThh:mm:ssUTCTIMESTAMP值发生在语句完成后,而不是接收时。示例:
TIMESTAMP="2019-10-03T14:25:32 UTC"
<AUDIT_RECORD> 元素的以下属性是可选的。其中许多只在 NAME 属性值为特定值时出现。
-
COMMAND_CLASS表示执行的操作类型。
示例:
COMMAND_CLASS="drop_table"这些值对应于
statement/sql/命令计数器。例如,xxxxxx是drop_table和select对应于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无符号整数,表示客户端连接标识符。这与会话中的
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用于身份验证过程中的外部用户名称,通过客户端认证插件设置的值。使用native(内置)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 语句的文本字符串。该值可以为空。长值可能会被截断。这个字符串,像 audit 日志文件本身一样,使用 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的区别。audit 日志不包含 SQLSTATE 值或错误信息。要查看错误代码、SQLSTATE 值和消息的关联,见服务器错误参考。
警告信息不被记录。
示例:
STATUS="1051" -
STATUS_CODE一个无符号整数,表示命令状态:0 表示成功,1 表示错误发生。
STATUS_CODE 值与 STATUS 值不同: STATUS_CODE 为 0 表示成功,1 表示错误,这与 Audit Vault 的 EZ_collector 消费者兼容。 STATUS 是
mysql_errno()C API 函数的返回值,为 0 表示成功,非零表示错误,但不一定是 1。示例:
STATUS_CODE="0" -
TABLE一个表名字符串。
示例:
TABLE="t3" -
USER客户端发送的用户名字符串,这可能与
PRIV_USER值不同。 -
VERSION一个无符号整数,表示 audit 日志文件格式版本。
示例:
VERSION="1"
对于 JSON 格式的 audit 记录日志 (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_sent和bytes_received字段被填充,系统变量log_slow_extra必须设置为ON。
以下示例展示了不同事件类型的JSON对象格式(由class和event项所指示),以提高可读性进行了重新格式化:
启动事件:
{ "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不 presente。
关闭事件:
{ "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不 presente。
连接或更改用户事件:
{ "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 账户。值是一个包含以下项目的哈希:
user,host。该值等同于CURRENT_USER()函数在该部分中的值。示例:
"account": { "user": "root", "host": "localhost" } -
class表示事件的字符串。类别与指定事件子类别的
event项目一起定义事件类型。示例:
"class": "connection"以下表格显示了
class和event值的合法组合。表 8.34 审核日志类别和事件组合
Class Value Permitted Event Values auditstartup,shutdownconnectionconnect,change_user,disconnectgeneralstatustable_access_dataread,delete,insert,update -
connection_data客户端连接信息。该值是一个哈希,包含这些项目:
connection_type、status、db,可能还有connection_attributes。这个项目只在 audit 记录的class值为connection时出现。示例:
"connection_data": { "connection_type": "ssl", "status": 0, "db": "test" }事件的
class值为connection,event值为connect可能包含一个connection_attributes项,以显示客户端在连接时传递的连接属性。 (关于这些属性的信息,请参见第29.12.9节,“性能_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关于执行的语句或命令的信息。值是一个哈希,包含这些项目:
command、sql_command、query、status。只有在class值为general的审核记录中出现该项目。"general_data": { "command": "Query", "sql_command": "show_variables", "query": "SHOW VARIABLES", "status": 0 } -
id一个无符号整数,表示事件ID。
"id": 2对于具有相同
timestamp值的审核记录,它们的id值可以区分它们,并形成一个顺序。在审核日志中,timestamp/id对是唯一的。这些对标识了日志中的事件位置。 -
login表示客户端如何连接到服务器的信息。值是一个哈希,包含这些项目:
user、os、ip、proxy。"login": { "user": "root", "os": "", "ip": "::1", "proxy": "" } -
query_statistics检测异常查询的可选查询统计信息。值是一个哈希,包含这些项目:
query_time、rows_sent、rows_examined、bytes_received、bytes_sent。要设置查询统计信息,请参阅添加检测异常查询的查询统计信息。示例:
"query_statistics": { "query_time": 0.116250, "bytes_sent": 18384, "bytes_received": 78858, "rows_sent": 3, "rows_examined": 20878 } -
shutdown_data关机日志插件终止相关信息。值是一个哈希,包含这些项目:
server_id。这个项目只在audit和shutdown的类别和事件值中出现。示例:
"shutdown_data": { "server_id": 1 } -
startup_data启动日志插件初始化相关信息。值是一个哈希,包含这些项目:
server_id、os_version、mysql_version、args。这个项目只在audit和startup的类别和事件值中出现。示例:
"startup_data": { "server_id": 1, "os_version": "i686-Linux", "mysql_version": "5.7.21-log", "args": ["/usr/local/mysql/bin/mysqld", "--loose-audit-log-format=JSON", "--log-error=log.err", "--pid-file=mysqld.pid", "--port=3306" ] } -
table_access_data表的访问信息。该值是一个哈希,包含以下项目:
db、table、query、sql_command,只有 audit 记录的class值为table_access时才出现。"table_access_data": { "db": "test", "table": "t1", "query": "INSERT INTO t1 (i) VALUES(1),(2),(3)", "sql_command": "insert" } -
time这个字段类似于
timestamp字段,但值是一个整数,表示 audit 事件生成的日期和时间,以 UNIX 时间戳形式表示。"time" : 1618498687只有在启用了
audit_log_format_unix_timestamp系统变量时,time字段才出现在 JSON 格式的日志文件中。 -
timestamp以
YYYY-MM-DD hh:mm:ss格式表示 audit 事件生成的日期和时间。例如,执行 SQL 语句的事件对应的timestamp值是在语句完成后出现,而不是在接收到语句时。"timestamp": "2019-10-03 13:50:01"具有相同
timestamp值的 audit 记录,通过id值来区分它们,并形成一个顺序。在 audit 日志中,timestamp/id对是唯一的。这些对标识日志中的事件位置。
-
args启动 MySQL 服务器时,命令行或选项文件中给定的数组。第一个选项是服务器可执行文件的路径。
"args": ["/usr/local/mysql/bin/mysqld", "--loose-audit-log-format=JSON", "--log-error=log.err", "--pid-file=mysqld.pid", "--port=3306" ] -
bytes_received从客户端接收的字节数。这是一个可选查询统计信息的一部分。为该字段被填充,系统变量
log_slow_extra必须设置为ON。"bytes_received": 78858 -
bytes_sent发送到客户端的字节数。这是一个可选查询统计信息的一部分。为该字段被填充,系统变量
log_slow_extra必须设置为ON。"bytes_sent": 18384 -
command生成审核事件的指令类型,例如服务器从客户端接收到的命令。
"command": "Query" -
connection_type连接到服务器的安全状态。允许值是
tcp/ip(未加密的 TCP/IP 连接)、ssl(加密的 TCP/IP 连接)、socket( Unix 套接字文件连接)、named_pipe( Windows 命名管道连接)和shared_memory( Windows 共享内存连接)。"connection_type": "tcp/tcp" -
db表示一个数据库名称。对于
connection_datatable_access_data"db": "test" -
host表示客户端主机名称。"host": "localhost" -
ip表示客户端IP地址。"ip": "::1" -
mysql_version表示MySQL服务器版本。这与VERSION()函数或version系统变量的值相同。"mysql_version": "5.7.21-log" -
os表示在身份验证过程中使用的外部用户名, 由用于验证客户端的插件设置。使用native(内置)MySQL身份验证或插件不设置值时,这个属性为空。该值与external_user系统变量相同。请参阅第8.2.19节,“代理用户”。"os": "jeffrey" -
os_version表示服务器在哪个操作系统上构建或运行的。"os_version": "i686-Linux" -
proxy表示代理用户(请参阅第8.2.19节,“代理用户”)。如果不在有效状态下,这个值为空。示例:
"proxy": "developer" -
query表示一个SQL语句的文本。该值可以为空。长值可能会被截断。字符串,像审核日志文件本身一样,使用 UTF-8(每个字符4字节)写入,所以该值可能是转换结果。例如,原始语句可能来自客户端作为SJIS字符串。
示例:
"query": "DELETE FROM t1" -
query_time查询执行时间(如果选择了
longlong数据类型),以微秒表示(如果选择了double数据类型),以秒表示。这项是可选的查询统计信息的一部分。示例:
"query_time": 0.116250 -
rows_examined查询过程中访问的行数。这项是可选的查询统计信息的一部分。
示例:
"rows_examined": 20878 -
rows_sent将结果发送给客户端的行数。这项是可选的查询统计信息的一部分。
示例:
"rows_sent": 3 -
server_id无符号整数,表示服务器ID。这个值与
server_id系统变量的值相同。示例:
"server_id": 1 -
sql_command表示SQL语句类型的字符串。
示例:
"sql_command": "insert"这些值对应于
statement/sql/命令计数器。例如,xxxxxx是drop_table和select,对应于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一个无符号整数,表示命令状态:0 表示成功,非零表示错误发生。这与
mysql_errno()C API 函数的值相同。审核日志不包含 SQLSTATE 值或错误信息。要查看错误代码、SQLSTATE 值和消息之间的关联,见服务器错误参考。
警告不被记录。
示例:
"status": 1051 -
table一个字符串,表示表名。
示例:
"table": "t1" -
user一个字符串,表示用户名称。该名称的含义取决于
user所在的项目:-
在
account项中,user是服务器认证客户端后使用的用户名称,这是服务器用于权限检查的用户名。 -
在
登录项中,用户是一个客户端发送的用户名字符串。
"user": "root" -