每当发生可审计事件时,MySQL 服务器都会调用审计日志插件,将其审计记录写入日志文件。通常,在插件启动后写入的第一个审计记录包含服务器描述和启动选项。随后的记录表示事件,例如客户端连接和断开连接事件、执行的 SQL 语句等。仅记录顶级语句,而不记录存储程序(如触发器或存储过程)中的语句。LOAD DATA
等语句引用的文件内容不会被记录。
要选择审计日志插件用来写入日志文件的格式,请在服务器启动时设置 audit_log_format
系统变量。以下格式可用
新式 XML 格式 (
audit_log_format=NEW
): 一种 XML 格式,与旧式 XML 格式相比,它与 Oracle Audit Vault 的兼容性更好。MySQL 9.0 默认使用新式 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>
审计日志文件以 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
。这些值中的很多与
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>
元素,用于显示客户端在连接时传递的连接属性。(有关这些属性的信息,这些属性也暴露在 Performance Schema 表中,请参见 第 29.12.9 节,“Performance Schema 连接属性表”。)该
<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,对于错误,STATUS_CODE
为 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
。这些值中的很多与
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="localhost"
IP
一个字符串,表示客户端 IP 地址。
示例:
IP="127.0.0.1"
MYSQL_版本
一个字符串,表示 MySQL 服务器版本。这与
VERSION()
函数或version
系统变量的值相同。示例:
MYSQL_VERSION="5.7.21-log"
OS_登录
表示在身份验证过程中使用的外部用户名的字符串,由用于对客户端进行身份验证的插件设置。使用本机(内置)MySQL 身份验证时,或者如果插件未设置值,则此属性为空。该值与
external_user
系统变量的值相同(请参见第 8.2.19 节,“代理用户”)。示例:
OS_LOGIN="jeffrey"
OS_版本
一个字符串,表示构建或运行服务器的操作系统。
示例:
OS_VERSION="x86_64-Linux"
PRIV_用户
表示服务器以该用户身份对客户端进行身份验证的字符串。这是服务器用于权限检查的用户名称,可能与
USER
值不同。示例:
PRIV_USER="jeffrey"
代理用户
一个字符串,表示代理用户(请参见 第 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_选项
表示在启动 MySQL 服务器时在命令行或选项文件中提供的选项的字符串。
示例:
STARTUP_OPTIONS="--port=3306 --log_output=FILE"
状态
表示命令状态的无符号整数:0 表示成功,非零表示发生错误。这与
mysql_errno()
C API 函数的值相同。请参见STATUS_CODE
的描述,了解其与STATUS
的不同之处。审计日志不包含 SQLSTATE 值或错误消息。要查看错误代码、SQLSTATE 值和消息之间的关联,请参见 服务器错误消息参考。
警告不会被记录。
示例:
STATUS="1051"
状态代码
一个无符号整数,表示命令状态:0 表示成功,1 表示发生错误。
该
STATUS_CODE
值与STATUS
值不同:对于成功,STATUS_CODE
为 0,对于错误,STATUS_CODE
为 1,这与 Audit Vault 的 EZ_collector 消费者兼容。STATUS
是mysql_errno()
C API 函数的值。对于成功,它为 0,对于错误,它为非零,因此对于错误,它不一定是 1。示例:
STATUS_CODE="0"
表格
一个字符串,表示表名。
示例:
TABLE="t3"
用户
表示客户端发送的用户名的字符串。这可能与
PRIV_USER
值不同。版本
一个无符号整数,表示审计日志文件格式的版本。
示例:
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
哈希。对于具有哈希值的项目,说明只列出该哈希中的项目名称。有关第二级哈希项目的更完整说明,请参见本节后面的内容。
帐户
与事件关联的 MySQL 帐户。该值是一个哈希,包含这些与
CURRENT_USER()
函数值等效的项目:user
、host
。示例
"account": { "user": "root", "host": "localhost" }
类
表示事件类的字符串。该类定义了事件的类型,当与指定事件子类的
event
项目结合时。示例
"class": "connection"
下表显示了
class
和event
值的允许组合。表 8.33 审计日志类和事件组合
类值 允许的事件值 审计
startup
、shutdown
连接
connect
、change_user
、disconnect
一般
状态
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
项目,以显示客户端在连接时传递的连接属性。(有关这些属性的信息,这些属性也在性能架构表中公开,请参见第 29.12.9 节,“性能架构连接属性表”。)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
事件
表示事件子类的字符串。该子类定义了事件的类型,当与指定事件类的
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
对是唯一的。这些对是标识日志中事件位置的书签。登录
指示客户端如何连接到服务器的信息。该值是一个哈希,包含以下项目:
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" }
时间
此字段与
timestamp
字段中的字段类似,但该值是一个整数,表示指示生成审计事件的日期和时间的 UNIX 时间戳值。示例
"time" : 1618498687
仅当
audit_log_format_unix_timestamp
系统变量已启用时,time
字段才会出现在 JSON 格式的日志文件中。时间戳
表示 UTC 值的字符串,格式为
YYYY-MM-DD hh:mm:ss
,指示生成审计事件的日期和时间。例如,与从客户端接收到的 SQL 语句执行相对应的事件具有在语句完成之后发生的timestamp
值,而不是在收到语句时。示例
"timestamp": "2019-10-03 13:50:01"
对于具有相同
timestamp
值的审计记录,它们的id
值将区分它们并形成一个序列。在审计日志中,timestamp
/id
对是唯一的。这些对是标识日志中事件位置的书签。
这些项目出现在与 JSON 格式审计记录的顶层项目关联的哈希值中
参数
启动 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;
状态
表示命令状态的无符号整数:0 表示成功,非零表示出现错误。这与
mysql_errno()
C API 函数的值相同。审计日志不包含 SQLSTATE 值或错误消息。要查看错误代码、SQLSTATE 值和消息之间的关联,请参见 服务器错误消息参考。
警告不会被记录。
示例
"status": 1051
表
一个字符串,表示表名。
示例
"table": "t1"
用户
表示用户名的字符串。含义取决于
user
出现的项。在
account
项中,user
是表示服务器用其身份验证客户端的用户的字符串。这是服务器用于权限检查的用户名。在
login
项中,user
是表示客户端发送的用户名的字符串。
示例
"user": "root"