每当发生可审计事件时,MySQL 服务器都会调用审计日志插件将其审计记录写入其日志文件。通常,插件启动后写入的第一个审计记录包含服务器描述和启动选项。其后的元素表示事件,例如客户端连接和断开连接事件、执行的 SQL 语句等等。只记录顶层语句,不记录存储程序(如触发器或存储过程)中的语句。语句引用的文件内容(例如 LOAD DATA
)不会被记录。
要选择审计日志插件用于写入其日志文件的日志格式,请在服务器启动时设置 audit_log_format
系统变量。可以使用以下格式:
新式 XML 格式 (
audit_log_format=NEW
):一种与 Oracle Audit Vault 相比具有更好兼容性的 XML 格式。MySQL 8.4 默认使用新式 XML 格式。旧式 XML 格式 (
audit_log_format=OLD
):旧 MySQL 系列中默认使用的原始审计日志格式。JSON 格式 (
audit_log_format=JSON
):将审计日志写入为 JSON 数组。只有此格式支持可选的查询时间和大小统计信息。
默认情况下,审计日志文件内容以新式 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>
审计日志文件使用 UTF-8 编码编写为 XML(每个字符最多 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
。其中许多值对应于
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>
审计记录的唯一标识符。该值由序列号和时间戳组成,格式为
。当审计日志插件打开审计日志文件时,它会将序列号初始化为审计日志文件的大小,然后为记录的每条记录将序列号递增 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>
这些值对应于
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_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>
对于连接事件,此元素表示默认数据库;如果没有默认数据库,则此元素为空。对于表访问事件,此元素表示访问的表所属的数据库。
<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
系统变量的值相同(请参阅第 8.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>
一个字符串,表示代理用户(请参阅第 8.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_CODE>
的描述。审计日志不包含 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>
审计日志文件使用 UTF-8 编码编写为 XML(每个字符最多 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
。其中许多值对应于
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
属性,用于标识事件引用的表以及包含该表的数据库。旧式 XML 审计日志格式的
Connect
事件不包含连接属性。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"
这些值对应于
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
表示客户端连接标识符的无符号整数。这与会话中
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
系统变量的值相同(请参阅 第 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 语句文本的字符串。该值可以为空。长值可能会被截断。该字符串与审计日志文件本身一样,使用 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_CODE
的描述。审计日志不包含 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 格式是唯一支持可选查询时间和大小统计信息的审计日志文件格式。此数据在慢查询日志中可用于符合条件的查询,并且在审计日志的上下文中,它同样有助于检测活动分析的异常值。
要将查询统计信息添加到日志文件,必须使用 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
值的允许组合。表 8.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" }
class
值为connection
且event
值为connect
的事件可能包含connection_attributes
项目,以显示客户端在连接时传递的连接属性。(有关这些属性的信息,这些属性也在 Performance Schema 表中公开,请参阅 第 29.12.9 节“Performance 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
。此项目仅出现在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
仅当启用了
audit_log_format_unix_timestamp
系统变量时,time
字段才会出现在 JSON 格式的日志文件中。timestamp
一个字符串,表示
YYYY-MM-DD hh:mm:ss
格式的 UTC 值,指示生成审计事件的日期和时间。例如,与从客户端接收的 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": "Query"
连接类型
与服务器连接的安全状态。允许的值为
tcp/ip
(建立未加密的 TCP/IP 连接)、ssl
(建立加密的 TCP/IP 连接)、socket
(Unix 套接字文件连接)、named_pipe
(Windows 命名管道连接)和shared_memory
(Windows 共享内存连接)。示例
"connection_type": "tcp/tcp"
数据库
表示数据库名称的字符串。对于
connection_data
,它是默认数据库。对于table_access_data
,它是表数据库。示例
"db": "test"
主机
表示客户端主机名的字符串。
示例
"host": "localhost"
IP 地址
表示客户端 IP 地址的字符串。
示例
"ip": "::1"
MySQL 版本
表示 MySQL 服务器版本的字符串。这与
VERSION()
函数或version
系统变量的值相同。示例
"mysql_version": "5.7.21-log"
操作系统
表示在身份验证过程中使用的外部用户名,由用于对客户端进行身份验证的插件设置。使用原生(内置)MySQL 身份验证,或者如果插件未设置该值,则此属性为空。该值与
external_user
系统变量的值相同。请参阅 第 8.2.19 节“代理用户”。示例
"os": "jeffrey"
操作系统版本
一个字符串,表示构建或运行服务器的操作系统。
示例
"os_version": "i686-Linux"
代理
一个字符串,表示代理用户(请参阅第 8.2.19 节“代理用户”)。如果用户代理未生效,则该值为空。
示例
"proxy": "developer"
查询
表示 SQL 语句文本的字符串。该值可以为空。长值可能会被截断。该字符串与审计日志文件本身一样,使用 UTF-8 编写(每个字符最多 4 个字节),因此该值可能是转换的结果。例如,原始语句可能是从客户端作为 SJIS 字符串接收的。
示例
"query": "DELETE FROM t1"
查询时间
查询执行时间,以微秒(如果选择
longlong
数据类型)或秒(如果选择double
数据类型)为单位。此项是可选查询统计信息的一部分。示例
"query_time": 0.116250
检查的行数
查询期间访问的行数。此项是可选查询统计信息的一部分。
示例
"rows_examined": 20878
发送的行数
作为结果发送到客户端的行数。此项是可选查询统计信息的一部分。
示例
"rows_sent": 3
服务器 ID
表示服务器 ID 的无符号整数。这与
server_id
系统变量的值相同。示例
"server_id": 1
SQL 命令
指示 SQL 语句类型的字符串。
示例
"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
表示命令状态的无符号整数:0 表示成功,非零表示发生错误。这与
mysql_errno()
C API 函数的值相同。审计日志不包含 SQLSTATE 值或错误消息。要查看错误代码、SQLSTATE 值和消息之间的关联,请参阅服务器错误消息参考。
不会记录警告。
示例
"status": 1051
表
表示表名的字符串。
示例
"table": "t1"
用户
表示用户名的字符串。
user
的含义因其出现的项目而异在
account
项目中,user
是表示服务器对客户端进行身份验证时所使用的用户的字符串。这是服务器用于权限检查的用户名。在
login
项目中,user
是表示客户端发送的用户名。
示例
"user": "root"