MySQL审核日志文件格式
默认情况下,审核日志插件生成的审核日志文件的内容未加密,并且可能包含敏感信息,例如SQL语句的文本。出于安全原因,应将审核日志文件写入只有MySQL服务器和出于正当理由参见日志的用户才能访问的目录。默认文件名 udit.log在数据目录中。可以通过 udit_log_file在服务器启动时设置系统变量来更改此设置。由于日志轮换,可能还存在其他审核日志文件。
为了提高安全性,请启用审核日志文件加密。请参阅审核日志文件加密。
每当发生可审核事件时,MySQL服务器就会调用审核日志插件将审核记录写入其日志文件。通常,插件启动后写入的第一条审核记录包含服务器描述和启动选项。紧随其后的元素表示事件,例如客户端连接和断开事件,已执行的SQL语句等。仅记录顶级语句,而不记录诸如触发器或存储过程之类的存储程序中的语句。诸如此类的语句引用的文件的内容LOAD DATA未记录。
要选择审核日志插件用来写入其日志文件的日志格式,请 udit_log_format在服务器启动时设置系统变量。这些格式可用:
- 新型XML格式(
udit_log_format=NEW):一种XML格式,与老式XML格式相比,与Oracle Audit Vault的兼容性更好。MySQL 8.0默认使用新型XML格式。 - 旧式XML格式(
udit_log_format=OLD):旧版MySQL系列默认使用的原始审核日志格式。 - JSON格式(
udit_log_format=JSON)
默认情况下,审核日志文件的内容以新型XML格式编写,而不进行压缩或加密。
注意有关更改日志格式时要考虑的问题的信息,请参阅审核日志文件格式。
以下各节描述了可用的审核日志记录格式:
- 新型XML审核日志文件格式
- 旧式XML审核日志文件格式
- JSON审核日志文件格式
新型XML审核日志文件格式
这是新的XML格式( udit_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(每个字符最多4个字节)以XML格式编写。根元素是<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 Dat,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.hCreate DBChange userCOM_CREATE_DBCOM_CHANGE_USER具有伴随事件
<NAME>值的事件。例如,以下语句生成一个事件,两个事件和一个事件:TableXXXQueryQueryTableReadTableInsertINSERT INTO t3 SELECT t1.* FROM t1 JOIN t2;
每个事件都包含和元素,用于标识事件所引用的表。
TableXXX<DB><TABLE><RECORD_ID>审核记录的唯一标识符。该值由序列号和时间戳组成,格式为
SEQ_TIMESTAMP。当审核日志插件打开审核日志文件时,它将序列号初始化为审核日志文件的大小,然后为记录的每个记录将序列加1。时间戳记是UTC值,其格式表示审核日志插件打开文件的日期和时间。YYYY-MM-DDThh:mm:ss例:
<RECORD_ID>12_2019-10-03T14:06:33</RECORD_ID>
<TIMESTAMP>一个字符串,表示UTC值,其格式表示生成审核事件的日期和时间。例如,与从客户端接收到的SQL语句的执行相对应的事件具有一个值,该值在该语句完成之后而不是在接收到该语句之后发生。
YYYY-MM-DDThh: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 和statement。以下语句显示可能的名称:
statement/sql/xxxxxxdrop_tableselectDROP TABLESELECTSELECT REPLACE(EVENT_NAME, 'statement/sql/', '')AS name FROM performance_schem .events_statements_summary_global_by_event_nameWHERE EVENT_NAME LIKE 'statement/sql/%'ORDER BY name ;<CONNECTION_ATTRIBUTES>从MySQL 8.0.19开始,
<COMMAND_CLASS>值为的事件connect可能包含一个<CONNECTION_ATTRIBUTES>元素,用于显示客户端在连接时传递的连接属性。(有关这些属性的信息(也在性能模式表中公开),请参见“性能模式连接属性表”。)该
<CONNECTION_ATTRIBUTES>元件包含一个<ATTRIBUTE>每属性元素,其每一个包含<NAME>和<VALUE>元素以指示该属性的名称和值,分别。例:
<CONNECTION_ATTRIBUTES> <ATTRIBUTE> <NAME>_pid</NAME> <VALUE>42794</VALUE> </ATTRIBUTE> <ATTRIBUTE> <NAME>_os</NAME> <VALUE>osx10.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系统变量的值相同(请参见“代理用户”)。例:
<OS_LOGIN>jeffrey</OS_LOGIN>
<OS_VERSION>一个字符串,表示在其上构建或正在运行服务器的操作系统。
例:
<OS_VERSION>x86_64-Linux</OS_VERSION>
<PRIV_USER>一个字符串,代表服务器验证客户端身份的用户。这是服务器用于特权检查的用户名,并且可能与
<USER>值不同。例:
<PRIV_USER>jeffrey</PRIV_USER>
<PROXY_USER>代表代理用户的字符串(请参见“代理用户”)。如果用户代理无效,则该值为空。
例:
<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值和消息之间的关联,请参见第B.3.1节“服务器错误消息参考”。
不记录警告。
例:
<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审核日志文件格式
这是旧式XML格式( udit_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(每个字符最多4个字节)以XML格式编写。根元素是<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值: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 Dat,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"Create DB""Change user"COM_CREATE_DBCOM_CHANGE_USER具有伴随事件
NAME值的事件。例如,以下语句生成一个事件,两个事件和一个事件:TableXXXQueryQueryTableReadTableInsertINSERT INTO t3 SELECT t1.* FROM t1 JOIN t2;
每个事件都具有和属性,以标识事件所引用的表。
TableXXXDBTABLEConnect旧式XML审核日志格式的事件不包括连接属性。RECORD_ID审核记录的唯一标识符。该值由序列号和时间戳组成,格式为
SEQ_TIMESTAMP。当审核日志插件打开审核日志文件时,它将序列号初始化为审核日志文件的大小,然后为记录的每个记录将序列加1。时间戳记是UTC值,其格式表示审核日志插件打开文件的日期和时间。YYYY-MM-DDThh:mm:ss例:
RECORD_TIMESTAMP一个字符串,表示UTC值,其格式表示生成审核事件的日期和时间。例如,与从客户端接收到的SQL语句的执行相对应的事件具有一个值,该值在该语句完成之后而不是在接收到该语句之后发生。
YYYY-MM-DDThh:mm:ss UTCTIMESTAMP例:
TIMESTAMP="2019-10-03T14:25:32 UTC"
以下属性是<AUDIT_RECORD>元素中的可选属性。其中许多仅针对具有特定NAME属性值的元素发生。
COMMAND_CLASS指示执行的操作类型的字符串。
例:
COMMAND_这些值对应于命令计数器。例如,分别为is 和 for 和statement。以下语句显示可能的名称:
statement/sql/xxxxxxdrop_tableselectDROP TABLESELECTSELECT REPLACE(EVENT_NAME, 'statement/sql/', '')AS name FROM performance_schem .events_statements_summary_global_by_event_nameWHERE EVENT_NAME LIKE 'statement/sql/%'ORDER BY name ;CONNECTION_ID代表客户端连接标识符的无符号整数。这
CONNECTION_ID()与会话中的函数返回的值相同。例:
CONNECTION_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系统变量的值相同(请参见“代理用户”)。例:
OS_LOGIN="jeffrey"OS_VERSION一个字符串,表示在其上构建或正在运行服务器的操作系统。
例:
OS_VERSION="x86_64-Linux"PRIV_USER一个字符串,代表服务器验证客户端身份的用户。这是服务器用于特权检查的用户名,它可能与
USER值不同。例:
PRIV_USER="jeffrey"PROXY_USER代表代理用户的字符串(请参见“代理用户”)。如果用户代理无效,则该值为空。
例:
PROXY_USER="developer"SERVER_ID代表服务器ID的无符号整数。这与
server_id系统变量的值相同。例:
SERVER_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值和消息之间的关联,请参见第B.3.1节“服务器错误消息参考”。
不记录警告。
例:
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审核日志文件格式
对于JSON格式的审核日志记录( udit_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个字节)。当审核日志插件开始写入新的日志文件时,它将写入开始[数组标记。当插件关闭日志文件时,它将写入关闭]数组标记。文件打开时,关闭标记不存在。
审核记录中的项目具有以下特征:
- 一些项出现在每个审核记录中。其他是可选的,并且可能会出现,具体取决于审核记录类型。
- 不能保证审核记录中的项目顺序。
- 项目值不是固定长度。长值可能会被截断,如后面给出的项目说明中所述。
"和\字符被编码为\"与\\分别。
以下示例显示了不同事件类型(由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,并且 ccount与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,并且 ccount与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": "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哈希。对于具有哈希值的项目,描述仅列出该哈希内的项目名称。有关第二级哈希项的更完整说明,请参阅本节后面。
ccount与事件关联的MySQL帐户。该值是一个散列,其中包含
CURRENT_USER()与user,,中的函数值等效的这些项host。例:
"account": { "user": "root", "host": "localhost" }class表示事件类的字符串。当与
event指定事件子类的项目一起使用时,该类定义事件的类型。例:
"class": "connection"
下表显示了
class和event值的允许组合。表6.28审核日志类和事件组合
类值 允许的事件值 uditstartup,shutdownconnectionconnect,change_user,disconnectgeneralstatustable_access_datread,delete,insert,updateconnection_dat有关客户端连接的信息。的值是包含这些项目的哈希:
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显示由所述客户端在连接时通过连接属性的项目。(有关这些属性的信息(也在性能模式表中公开),请参见“性能模式连接属性表”。)该
connection_attributes值是一个哈希,通过其名称和值表示每个属性。例:
"connection_attributes": { "_pid": "43236", "_os": "osx10.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_dat有关已执行的语句或命令的信息。的值是包含这些项目的哈希:
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": "" }shutdown_dat有关审核日志插件终止的信息。该值是包含以下各项的哈希值:
server_id仅当审计记录的,class和分别event为udit和时shutdown,才出现该项目。例:
"shutdown_data": { "server_id": 1 }startup_dat与审核日志插件初始化有关的信息。的值是包含这些项目的哈希:
server_id,os_version,mysql_version,rgs。此产品仅适用于审计记录出现class和event值udit和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_dat有关访问表的信息。该值是包含这些项目的哈希:
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一个字符串,表示UTC值,其
YYYY-MM-DD hh:mm:ss格式表示生成审核事件的日期和时间。例如,与从客户端接收到的SQL语句的执行相对应的事件具有一个timestamp值,该值在该语句完成之后而不是在接收到该语句之后发生。例:
"timestamp": "2019-10-03 13:50:01"
对于具有相同
timestamp值的审核记录,它们的id值将它们区分并形成一个序列。在审核日志中,timestamp/id对是唯一的。这些对是书签,用于标识日志中的事件位置。
这些项目显示在与JSON格式审核记录的顶级项目相关的哈希值中:
rgs启动MySQL服务器时,在命令行或选项文件中提供的选项数组。第一个选项是服务器可执行文件的路径。
例:
"args": ["/usr/local/mysql/bin/mysqld", "--loose-audit-log-format=JSON", "--log-error=log.err", "--pid-file=mysqld.pid", "--port=3306" ]
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_dat,它是默认数据库。对于table_access_dat,它是表数据库。例:
"db": "test"
host代表客户端主机名的字符串。
例:
"host": "localhost"
ip代表客户端IP地址的字符串。
例:
"ip": "::1"
mysql_version代表MySQL服务器版本的字符串。这与
VERSION()函数或version系统变量的值相同。例:
"mysql_version": "5.7.21-log"
os一个字符串,代表在身份验证过程中使用的外部用户名,该字符串由用于身份验证客户端的插件设置。使用本地(内置)MySQL身份验证,或者如果插件未设置值,则此属性为空。该值与
external_user系统变量的值相同。请参见“代理用户”。例:
"os": "jeffrey"
os_version一个字符串,表示在其上构建或正在运行服务器的操作系统。
例:
"os_version": "i686-Linux"
proxy代表代理用户的字符串(请参见“代理用户”)。如果用户代理无效,则该值为空。
例:
"proxy": "developer"
query表示SQL语句文本的字符串。该值可以为空。长值可能会被截断。该字符串与审核日志文件本身一样,使用UTF-8写入(每个字符最多4个字节),因此该值可能是转换的结果。例如,原始语句可能已作为SJIS字符串从客户端收到。
例:
"query": "DELETE FROM t1"
server_id代表服务器ID的无符号整数。这与
server_id系统变量的值相同。例:
"server_id": 1
sql_command指示SQL语句类型的字符串。
例:
"sql_command": "insert"
这些值对应于命令计数器。例如,分别为is 和 for 和statement。以下语句显示可能的名称:
statement/sql/xxxxxxdrop_tableselectDROP TABLESELECTSELECT REPLACE(EVENT_NAME, 'statement/sql/', '')AS name FROM performance_schem .events_statements_summary_global_by_event_nameWHERE EVENT_NAME LIKE 'statement/sql/%'ORDER BY name ;status表示命令状态的无符号整数:0表示成功,如果发生错误则非零。这与
mysql_errno()C API函数的值相同。审核日志不包含SQLSTATE值或错误消息。要参见错误代码,SQLSTATE值和消息之间的关联,请参见第B.3.1节“服务器错误消息参考”。
不记录警告。
例:
"status": 1051
table代表表名的字符串。
例:
"table": "t1"
user代表用户名的字符串。含义因
user发生的项目而异:- 在
ccount项目中,user是一个字符串,代表服务器验证客户端身份的用户。这是服务器用于特权检查的用户名。 - 在
login项目中,user是一个字符串,代表客户端发送的用户名。
例:
"user": "root"
- 在
