MySQL 服务器在审计日志插件中写入审计记录到其日志文件,每当发生可审计事件时。通常,插件启动后写入的第一个审计记录包含服务器描述和启动选项。其后的记录代表事件,如客户端连接和断开事件、执行的 SQL 语句等。只有顶级语句被记录,而不是存储程序中的语句,如触发器或存储过程。语句中引用的文件内容,如 LOAD DATA,不被记录。
要选择审计日志插件用于写入日志文件的格式,请在服务器启动时设置 audit_log_format 系统变量。可用的格式有:
-
新式 XML 格式 (
audit_log_format=NEW): 兼容 Oracle Audit Vault 的 XML 格式。MySQL 8.3 默认使用新式 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。许多这些值对应于
COM_命令值,列在xxxmy_command.h头文件中。例如,创建 DB和更改用户对应于COM_CREATE_DB和COM_CHANGE_USER,分别。具有
<NAME>值的事件Table伴随着XXXQuery事件。例如,以下语句生成一个Query事件,两个TableRead事件和一个TableInsert事件:INSERT INTO t3 SELECT t1.* FROM t1 JOIN t2;每个
Table事件包含XXX<TABLE>和<DB>元素,以标识事件所引用的表和包含该表的数据库。 -
<RECORD_ID>审核记录的唯一标识符。该值由序列号和时间戳组成,格式为
。当审核日志插件打开审核日志文件时,它将序列号初始化为审核日志文件的大小,然后为每个记录日志增加1。时间戳是一个 UTC 值,以SEQ_TIMESTAMP格式表示审核日志插件打开文件的日期和时间。YYYY-MM-DDThh:mm:ss示例:
<RECORD_ID>12_2019-10-03T14:06:33</RECORD_ID> -
<TIMESTAMP>一个字符串,表示 UTC 值,以
格式表示审核事件生成的日期和时间。例如,来自客户端的 SQL 语句的执行事件的YYYY-MM-DDThh:mm:ssUTC<TIMESTAMP>值发生在语句执行完成后,而不是在接收时。示例:
<TIMESTAMP>2019-10-03T14:09:45 UTC</TIMESTAMP>
以下元素在 <AUDIT_RECORD> 元素中是可选的。许多元素仅在特定的 <NAME> 元素值下出现。
-
<COMMAND_CLASS>一个字符串,指示执行的操作类型。
示例:
<COMMAND_CLASS>drop_table</COMMAND_CLASS>这些值对应于
statement/sql/命令计数器。例如,xxxxxx是drop_table和select,分别对应DROP TABLE和SELECT语句。以下语句显示可能的名称:SELECT REPLACE(EVENT_NAME, 'statement/sql/', '') AS name FROM performance_schema.events_statements_summary_global_by_event_name WHERE EVENT_NAME LIKE 'statement/sql/%' ORDER BY name; -
<CONNECTION_ATTRIBUTES>具有
<COMMAND_CLASS>值为connect的事件可能包含一个<CONNECTION_ATTRIBUTES>元素,以显示客户端在连接时传递的连接属性。(有关这些属性的信息,也可以在性能模式表中找到,见 第 29.12.9 节,“性能模式连接属性表”。)<CONNECTION_ATTRIBUTES>元素包含一个或多个<ATTRIBUTE>元素,每个元素都包含<NAME>和<VALUE>元素,以指示属性名称和值。示例:
<CONNECTION_ATTRIBUTES> <ATTRIBUTE> <NAME>_pid</NAME> <VALUE>42794</VALUE> </ATTRIBUTE> <ATTRIBUTE> <NAME>_os</NAME> <VALUE>macos0.14</VALUE> </ATTRIBUTE> <ATTRIBUTE> <NAME>_platform</NAME> <VALUE>x86_64</VALUE> </ATTRIBUTE> <ATTRIBUTE> <NAME>_client_version</NAME> <VALUE>8.1.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>一个字符串,表示在身份验证过程中使用的外部用户名,由插件设置的客户端身份验证所用。在本机(built-in)MySQL身份验证中,或者如果插件不设置该值,则该元素为空。该值与
external_user系统变量相同(见第 8.2.19 节,“代理用户”)。示例:
<OS_LOGIN>jeffrey</OS_LOGIN> -
<操作系统版本>一个字符串,表示服务器构建或运行的操作系统。
示例:
<OS_VERSION>x86_64-Linux</OS_VERSION> -
<特权用户>一个字符串,表示服务器对客户端进行身份验证的用户名称。这是服务器用于权限检查的用户名,可能与
<用户>值不同。示例:
<PRIV_USER>jeffrey</PRIV_USER> -
<代理用户>一个字符串,表示代理用户(见第 8.2.19 节,“代理用户”)。如果用户代理不生效,则该值为空。
示例:
<PROXY_USER>developer</PROXY_USER> -
<服务器 ID>一个无符号整数,表示服务器 ID。这与
server_id系统变量的值相同。示例:
<SERVER_ID>1</SERVER_ID> -
<SQL 文本>一个字符串,表示 SQL 语句的文本。该值可以为空。长值可能被截断。该字符串,如审核日志文件本身一样,使用 UTF-8 编写(每个字符最多 4 字节),因此该值可能是转换后的结果。例如,原始语句可能来自客户端的 SJIS 字符串。
示例:
<SQLTEXT>DELETE FROM t1</SQLTEXT> -
<启动选项>一个字符串,表示在启动 MySQL 服务器时提供的选项。第一个选项是服务器可执行文件的路径。
示例:
<STARTUP_OPTIONS>/usr/local/mysql/bin/mysqld --port=3306 --log_output=FILE</STARTUP_OPTIONS> -
<状态>一个无符号整数,表示命令状态:0 表示成功,非零表示错误发生。这与
mysql_errno()C API 函数的值相同。见<状态代码>的描述,以了解它与<状态>的区别。审核日志不包含 SQLSTATE 值或错误消息。要查看错误代码、SQLSTATE 值和消息的关联,请参阅服务器错误消息参考。
警告不被记录。
示例:
<STATUS>1051</STATUS> -
<状态代码>一个无符号整数,表示命令状态:0 表示成功,1 表示错误发生。
代码值与状态值不同:
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可能的值是
审核,二进制转储,更改用户,关闭语句,连接出,连接,创建数据库,守护进程,调试,延迟插入,删除数据库,执行,获取,字段列表,初始化数据库,杀死,长数据,无审核,Ping,准备,进程列表,查询,退出,刷新,注册从属,重置语句,设置选项,关闭,睡眠,统计信息,表转储,表删除,表插入,表读取,表更新,时间。许多这些值对应于
COM_命令值,列在xxxmy_command.h头文件中。例如,"创建数据库"和"更改用户"对应于COM_CREATE_DB和COM_CHANGE_USER,分别。具有
NAME值为Table的事件伴随XXXQuery事件。例如,以下语句生成一个Query事件,两个TableRead事件和一个TableInsert事件:INSERT INTO t3 SELECT t1.* FROM t1 JOIN t2;每个
Table事件都有XXXTABLE和DB属性,以标识事件所引用的表和包含该表的数据库。Connect事件对于旧式 XML 审核日志格式不包括连接属性。 -
RECORD_ID审核记录的唯一标识符。该值由序列号和时间戳组成,格式为
。当审核日志插件打开审核日志文件时,它将序列号初始化为审核日志文件的大小,然后为每个记录日志增加序列号。时间戳是一个 UTC 值,以SEQ_TIMESTAMP格式,表示审核日志插件打开文件的日期和时间。YYYY-MM-DDThh:mm:ss示例:
RECORD_ID="12_2019-10-03T14:25:00" -
TIMESTAMP一个表示 UTC 值的字符串,在
格式,表示审核事件生成的日期和时间。例如,来自客户端的 SQL 语句执行事件的 TIMESTAMP 值将在语句执行完成后生成,而不是在接收时。YYYY-MM-DDThh:mm:ssUTC示例:
TIMESTAMP="2019-10-03T14:25:32 UTC"
以下属性在 <AUDIT_RECORD> 元素中是可选的。许多属性仅出现在 NAME 属性具有特定值的元素中。
-
COMMAND_CLASS一个字符串,表示执行的操作类型。
示例:
COMMAND_CLASS="drop_table"这些值对应于
statement/sql/命令计数器。例如,xxxxxx是drop_table和select,分别对应DROP TABLE和SELECT语句。以下语句显示可能的名称:SELECT REPLACE(EVENT_NAME, 'statement/sql/', '') AS name FROM performance_schema.events_statements_summary_global_by_event_name WHERE EVENT_NAME LIKE 'statement/sql/%' ORDER BY name; -
CONNECTION_ID一个无符号整数,表示客户端连接标识符。这与会话中的
CONNECTION_ID()函数返回的值相同。示例:
CONNECTION_ID="127" -
CONNECTION_TYPE服务器连接的安全状态。允许的值是
TCP/IP(未加密的 TCP/IP 连接),SSL/TLS(加密的 TCP/IP 连接),Socket(Unix 套接字文件连接),Named Pipe(Windows 命名管道连接)和Shared Memory(Windows 共享内存连接)。示例:
CONNECTION_TYPE="SSL/TLS" -
DB一个字符串,表示数据库名称。
示例:
DB="test"对于连接事件,这个属性表示默认数据库;如果没有默认数据库,则该属性为空。对于表访问事件,该属性表示访问的表所属的数据库。
-
HOST一个字符串,表示客户端主机名。
示例:
HOST="localhost" -
IP一个字符串,表示客户端 IP 地址。
示例:
IP="127.0.0.1" -
MYSQL_VERSION一个字符串,表示 MySQL 服务器版本。这与
VERSION()函数或version系统变量的值相同。示例:
MYSQL_VERSION="5.7.21-log" -
OS_LOGIN一个字符串,表示在身份验证过程中使用的外部用户名,由插件设置的客户端身份验证。使用本机(内置)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的区别。审核日志不包含 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。
以下示例显示了不同事件类型(由class和event项指示)的JSON对象格式,稍微重新格式化以提高可读性:
审核启动事件:
{ "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.36 审核日志类和事件组合
类值 允许的事件值 auditstartup,shutdownconnectionconnect,change_user,disconnectgeneralstatustable_access_dataread,delete,insert,update -
connection_data客户端连接信息。该值是一个哈希表,包含以下项目:
connection_type、status、db,可能还有connection_attributes。这项仅出现在审核记录的类值为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.1.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。这项仅出现在审核记录的类值为general时。示例:
"general_data": { "command": "Query", "sql_command": "show_variables", "query": "SHOW VARIABLES", "status": 0 } -
id一个无符号整数,表示事件 ID。
示例:
"id": 2对于具有相同的
timestamp值的审核记录,其id值将它们区分开,并形成一个序列。在审核日志中,timestamp/id对是唯一的。这些对是标记事件在日志中的位置。 -
登录指示客户端如何连接到服务器的信息。该值是一个哈希,包含以下项目:
用户、os、ip、代理。示例:
"login": { "user": "root", "os": "", "ip": "::1", "proxy": "" } -
查询统计信息可选的查询统计信息,用于异常检测。该值是一个哈希,包含以下项目:
查询时间、发送的行数、检查的行数、接收的字节、发送的字节。有关设置查询统计信息的说明,请参阅添加查询统计信息以检测异常。示例:
"query_statistics": { "query_time": 0.116250, "bytes_sent": 18384, "bytes_received": 78858, "rows_sent": 3, "rows_examined": 20878 } -
shutdown_data与审核日志插件终止相关的信息。该值是一个哈希,包含以下项目:
服务器 ID。该项目仅出现在审核记录的class和event值为audit和shutdown的情况下。示例:
"shutdown_data": { "server_id": 1 } -
startup_data与审核日志插件初始化相关的信息。该值是一个哈希,包含以下项目:
服务器 ID、操作系统版本、MySQL 版本、参数。该项目仅出现在审核记录的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" ] } -
表访问数据关于表访问的信息。该值是一个哈希,包含以下项目:
数据库、表名、查询、SQL 命令。该项目仅出现在审核记录的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该
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系统变量的值相同。请参阅 第 8.2.19 节,“代理用户”。示例:
"os": "jeffrey" -
os_version一个字符串,表示服务器所在的操作系统或正在运行的操作系统。
示例:
"os_version": "i686-Linux" -
proxy一个字符串,表示代理用户(见第 8.2.19 节,“代理用户”)。如果没有代理用户,则该值为空。
示例:
"proxy": "developer" -
query一个字符串,表示 SQL 语句的文本。该值可以为空。长值可能会被截断。该字符串,以 UTF-8 编码(每个字符最多 4 字节)写入审核日志文件本身,因此该值可能是原始语句的转换结果。例如,原始语句可能来自客户端的 SJIS 字符串。
示例:
"query": "DELETE FROM t1" -
query_time查询执行时间,以微秒为单位(如果选择了 longlong 数据类型)或秒(如果选择了 double 数据类型)。这是可选的查询统计信息的一部分。
示例:
"query_time": 0.116250 -
rows_examined查询期间访问的行数。这是可选的查询统计信息的一部分。
示例:
"rows_examined": 20878 -
rows_sent客户端收到的行数。这是可选的查询统计信息的一部分。
示例:
"rows_sent": 3 -
server_id一个无符号整数,表示服务器 ID。这与系统变量
server_id的值相同。示例:
"server_id": 1 -
sql_command一个字符串,表示 SQL 语句的类型。
示例:
"sql_command": "insert"这些值对应于
statement/sql/命令计数器。例如,xxxxxx是drop_table和select,分别对应DROP TABLE和SELECT语句。SELECT REPLACE(EVENT_NAME, 'statement/sql/', '') AS name FROM performance_schema.events_statements_summary_global_by_event_name WHERE EVENT_NAME LIKE 'statement/sql/%' ORDER BY name; -
status一个无符号整数,表示命令状态:0 表示成功,非零表示错误。这与 C API 函数
mysql_errno()的值相同。审核日志不包含 SQLSTATE 值或错误消息。要查看错误代码、SQLSTATE 值和消息的关联,请参阅 服务器错误消息参考。
警告不被记录。
示例:
"status": 1051 -
table一个字符串,表示表名。
示例:
"table": "t1" -
user一个字符串,表示用户名。该值的含义取决于它所在的项目中:
user发生。-
在
account项中,user是一个字符串,表示服务器认证的客户端用户。这是服务器用于权限检查的用户名。 -
在
login项中,user是一个字符串,表示客户端发送的用户名。
示例:
"user": "root" -