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_
命令值。例如,xxx
Create DB
和Change user
分别对应于COM_CREATE_DB
和COM_CHANGE_USER
。具有
<NAME>
值为Table
的事件伴随着XXX
Query
事件。例如,以下语句生成一个Query
事件,两个TableRead
事件和一个TableInsert
事件:INSERT INTO t3 SELECT t1.* FROM t1 JOIN t2;
每个
Table
事件包含XXX
<TABLE>
和<DB>
元素,以标识该事件所指的表和包含该表的数据库。 -
<RECORD_ID>
审核记录的唯一标识符。值由顺序号和时间戳组成,格式为
。当审核日志插件打开审核日志文件时,它将初始化顺序号为审核日志文件的大小,然后对每个记录递增顺序号。时间戳是 UTC 值,格式为SEQ_TIMESTAMP
,表示审核日志插件打开文件的日期和时间。YYYY-MM-DD
Thh:mm:ss
示例:
<RECORD_ID>12_2019-10-03T14:06:33</RECORD_ID>
-
<TIMESTAMP>
表示UTC值的字符串,格式为
,指示审核事件生成时间。例如,对于来自客户端的SQL语句执行事件,YYYY-MM-DD
Thh:mm:ss
UTC<TIMESTAMP>
值发生在语句完成后,而不是接收时。示例:
<TIMESTAMP>2019-10-03T14:09:45 UTC</TIMESTAMP>
<AUDIT_RECORD>
元素中的许多元素只与特定的 <NAME>
元素值一起出现。
-
<COMMAND_CLASS>
表示执行的操作类型的字符串。
示例:
<COMMAND_CLASS>drop_table</COMMAND_CLASS>
这些值对应于
statement/sql/
命令计数器。例如,xxx
xxx
是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
的事件伴随着XXX
Query
事件。例如,以下语句生成一个Query
事件,两个TableRead
事件和一个TableInsert
事件:INSERT INTO t3 SELECT t1.* FROM t1 JOIN t2;
每个
Table
事件都有XXX
TABLE
和DB
属性来标识该事件所指向的表和包含该表的数据库。Connect
事件对于老式 XML 审计日志格式不包括连接属性。 -
RECORD_ID
审核记录的唯一标识符。该值由顺序号和时间戳组成,格式为
。当审核日志插件打开审核日志文件时,它将初始化顺序号为审核日志文件的大小,然后对每个记录递增顺序号。时间戳是 UTC 值,格式为SEQ_TIMESTAMP
,表示审核日志插件打开文件的日期和时间。YYYY-MM-DD
Thh:mm:ss
示例:
RECORD_ID="12_2019-10-03T14:25:00"
-
TIMESTAMP
表示UTC值的字符串,格式为
,指示审核事件生成时间。例如,对于来自客户端的SQL语句执行事件,YYYY-MM-DD
Thh:mm:ss
UTCTIMESTAMP
值发生在语句完成后,而不是接收时。示例:
TIMESTAMP="2019-10-03T14:25:32 UTC"
<AUDIT_RECORD>
元素的以下属性是可选的。其中许多只在 NAME 属性值为特定值时出现。
-
COMMAND_CLASS
表示执行的操作类型。
示例:
COMMAND_CLASS="drop_table"
这些值对应于
statement/sql/
命令计数器。例如,xxx
xxx
是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 audit
startup
,shutdown
connection
connect
,change_user
,disconnect
general
status
table_access_data
read
,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_data
table_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/
命令计数器。例如,xxx
xxx
是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"
-