每当发生可审计事件时,MySQL 服务器调用审计日志插件将审计记录写入其日志文件。通常在插件启动后写入的第一条审计记录包含服务器描述和启动选项。紧随其后的元素表示诸如客户端连接和断开连接事件、执行的 SQL 语句等事件。仅记录顶级语句,而不记录存储程序(例如触发器或存储过程)中的语句。语句引用的文件内容,例如LOAD
DATA
未记录。
要选择审计日志插件用于写入其日志文件的日志格式,请
audit_log_format
在服务器启动时设置系统变量。这些格式可用:
新式 XML 格式 (
audit_log_format=NEW
):与旧式 XML 格式相比,与 Oracle Audit Vault 具有更好兼容性的 XML 格式。MySQL 8.0 默认使用新式的 XML 格式。旧式 XML 格式 (
audit_log_format=OLD
):旧版 MySQL 系列中默认使用的原始审计日志格式。JSON 格式 (
audit_log_format=JSON
):将审核日志写入 JSON 数组。只有这种格式支持可选的查询时间和大小统计信息,这些信息从 MySQL 8.0.30 开始可用。
默认情况下,审计日志文件内容以新式 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>
不保证 元素内元素的顺序 。元素值不是固定长度的。如稍后给出的元素描述中所示,长值可能会被截断。
、
<
、和字符分别 编码为>
、 、 和 。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
可能 的 值为
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
其中许多值对应 于头文件 中列出的命令值 。例如,和分别对应于 和 。
COM_
xxx
my_command.h
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>
审计记录的唯一标识符。该值由序列号和时间戳组成,格式为
. 当审计日志插件打开审计日志文件时,它会将序列号初始化为审计日志文件的大小,然后为记录的每条记录将序列号递增 1。时间戳是一个 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>
这些值对应于 命令计数器。例如, 分别是 is 和 for and 语句。以下语句显示可能的名称:
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>
从 MySQL 8.0.19 开始,
<COMMAND_CLASS>
值为 的 事件connect
可能包含一个<CONNECTION_ATTRIBUTES>
元素,用于显示客户端在连接时传递的连接属性。(有关这些属性的信息,这些属性也在性能模式表中公开,请参阅 第 27.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.0.19</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
该值与系统变量的值相同(请参阅第 6.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>
表示代理用户的字符串(请参阅 第 6.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>
。审核日志不包含 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>
表示审计日志文件格式版本的无符号整数。
例子:
<VERSION>1</VERSION>
以下是旧式 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>
不保证元素 内属性的顺序 。属性值不是固定长度的。如稍后给出的属性描述中所示,长值可能会被截断。
、
<
、和字符分别 编码为>
、 、 和 。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
可能 的 值为
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
其中许多值对应 于头文件 中列出的命令值 。例如,和 分别对应于 和 。
COM_
xxx
my_command.h
"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
审计记录的唯一标识符。该值由序列号和时间戳组成,格式为
. 当审计日志插件打开审计日志文件时,它会将序列号初始化为审计日志文件的大小,然后为记录的每条记录将序列号递增 1。时间戳是一个 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"
这些值对应于 命令计数器。例如, 分别是 is 和 for and 语句。以下语句显示可能的名称:
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
表示身份验证过程中使用的外部用户名的字符串,由用于对客户端进行身份验证的插件设置。使用本机(内置)MySQL 身份验证,或者如果插件未设置该值,则此属性为空。
external_user
该值与系统变量的值相同(请参阅第 6.2.19 节,“代理用户”)。例子:
OS_LOGIN="jeffrey"
OS_VERSION
表示构建或运行服务器的操作系统的字符串。
例子:
OS_VERSION="x86_64-Linux"
PRIV_USER
一个字符串,表示服务器将客户端验证为的用户。这是服务器用于权限检查的用户名,它可能与
USER
值不同。例子:
PRIV_USER="jeffrey"
PROXY_USER
表示代理用户的字符串(请参阅 第 6.2.19 节,“代理用户”)。如果用户代理未生效,则该值为空。
例子:
PROXY_USER="developer"
SERVER_ID
表示服务器 ID 的无符号整数。
server_id
这与系统变量 的值相同 。例子:
SERVER_ID="1"
SQLTEXT
表示 SQL 语句文本的字符串。该值可以为空。长值可能会被截断。该字符串与审计日志文件本身一样,是使用 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
。审核日志不包含 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
表示审计日志文件格式版本的无符号整数。
例子:
VERSION="1"
对于 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 格式是唯一支持可选查询时间和大小统计信息的审计日志文件格式,从 MySQL 8.0.30 开始可用。此数据在慢速查询日志中可用于符合条件的查询,在审计日志的上下文中,它同样有助于检测异常值以进行活动分析。
要将查询统计信息添加到日志文件,您必须使用
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
不存在。
审计关机事件:
{ "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",
"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 帐户。该值是一个散列,包含这些项,这些项等同
CURRENT_USER()
于以下部分中函数的值:user
,host
。例子:
"account": { "user": "root", "host": "localhost" }
class
表示事件类的字符串。
event
当与指定事件子类 的项目一起使用时,类定义事件的类型 。例子:
"class": "connection"
下表显示了
class
和event
值的允许组合。表 6.34 审计日志类和事件组合
类值 允许的事件值 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
。此项仅出现在class
值为 的 审计记录中connection
。例子:
"connection_data": { "connection_type": "ssl", "status": 0, "db": "test" }
从 MySQL 8.0.19 开始,
class
值为connection
和event
的 事件connect
可能包含一个connection_attributes
项目,用于显示客户端在连接时传递的连接属性。(有关这些属性的信息,这些属性也在性能模式表中公开,请参阅 第 27.12.9 节,“性能模式连接属性表”。)该
connection_attributes
值是一个散列,它通过名称和值表示每个属性。例子:
"connection_attributes": { "_pid": "43236", "_os": "macos0.14", "_platform": "x86_64", "_client_version": "8.0.19", "_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
该项目仅出现在 和 的审计记录中class
, 分别event
为audit
和。shutdown
例子:
"shutdown_data": { "server_id": 1 }
startup_data
有关审计日志插件初始化的信息。该值是包含这些项目的散列:
server_id
,os_version
,mysql_version
,args
。此项仅针对分别具有 和class
和event
的值的审计记录出现。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
审计记录中。class
table_access
例子:
"table_access_data": { "db": "test", "table": "t1", "query": "INSERT INTO t1 (i) VALUES(1),(2),(3)", "sql_command": "insert" }
time
该字段与字段中的字段类似
timestamp
,但值为整数,表示UNIX时间戳值,表示审计事件产生的日期和时间。例子:
"time" : 1618498687
仅当启用系统变量 时, 该
time
字段才会出现在 JSON 格式的日志文件 中。audit_log_format_unix_timestamp
timestamp
表示 UTC 值的字符串,其
YYYY-MM-DD hh:mm:ss
格式指示生成审计事件的日期和时间。例如,对应于执行从客户端接收到的 SQL 语句的事件具有timestamp
在语句完成之后发生的值,而不是在接收到语句时发生的值。例子:
"timestamp": "2019-10-03 13:50:01"
对于具有相同
timestamp
值的审计记录,它们的id
值将它们区分开来并形成一个序列。在审核日志中,timestamp
/id
对是唯一的。这些对是标识日志中事件位置的书签。
这些项目出现在与 JSON 格式审计记录的顶级项目关联的哈希值中:
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
表示身份验证过程中使用的外部用户名的字符串,由用于对客户端进行身份验证的插件设置。使用本机(内置)MySQL 身份验证,或者如果插件未设置该值,则此属性为空。
external_user
该值与系统变量的值相同。请参阅第 6.2.19 节,“代理用户”。例子:
"os": "jeffrey"
os_version
表示构建或运行服务器的操作系统的字符串。
例子:
"os_version": "i686-Linux"
proxy
表示代理用户的字符串(请参阅 第 6.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"
这些值对应于 命令计数器。例如, 分别是 is 和 for and 语句。以下语句显示可能的名称:
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
是一个字符串,表示服务器对客户端进行身份验证的用户。这是服务器用于权限检查的用户名。在
login
项目中,user
是一个字符串,表示客户端发送的用户名。
例子:
"user": "root"