每当发生可审计事件时,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_命令值。例如,xxxCreate DB和Change user分别对应于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/命令计数器。例如,对于xxxDROP 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的事件伴随XXXQuery事件。例如,以下语句生成一个Query事件、两个TableRead事件和一个TableInsert事件INSERT INTO t3 SELECT t1.* FROM t1 JOIN t2;每个
Table事件都有XXXTABLE和DB属性,用于标识事件引用的表以及包含该表的数据库。旧式 XML 审计日志格式的
Connect事件不包含连接属性。RECORD_ID审计记录的唯一标识符。该值由序列号和时间戳组成,格式为
。当审计日志插件打开审计日志文件时,它会将序列号初始化为审计日志文件的大小,然后为记录的每条记录将序列号递增 1。时间戳是一个 UTC 值,格式为SEQ_TIMESTAMP,表示审计日志插件打开文件的日期和时间。YYYY-MM-DDThh:mm:ss示例:
RECORD_ID="12_2019-10-03T14:25:00"TIMESTAMP一个字符串,表示 UTC 值,格式为
,表示生成审计事件的日期和时间。例如,与从客户端接收到的 SQL 语句的执行相对应的事件的YYYY-MM-DDThh:mm:ssUTCTIMESTAMP值出现在语句完成后,而不是在接收到语句时。示例:
TIMESTAMP="2019-10-03T14:25:32 UTC"
以下属性在 <AUDIT_RECORD> 元素中是可选的。其中许多属性只出现在 NAME 属性具有特定值的元素中。
COMMAND_CLASS一个字符串,表示执行的操作类型。
示例:
COMMAND_CLASS="drop_table"这些值对应于
statement/sql/命令计数器。例如,对于xxxDROP 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 审计日志类和事件组合
类值 允许的事件值 auditstartup、shutdownconnectionconnect、change_user、disconnectgeneralstatustable_access_dataread、delete、insert、updateconnection_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": 5event一个字符串,表示事件类的子类。当与指定事件类的
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": 78858bytes_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": 1SQL 命令指示 SQL 语句类型的字符串。
示例
"sql_command": "insert"这些值对应于
statement/sql/命令计数器。例如,对于xxxDROP 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"