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_xxx
my_command.h
Create DB
Change user
COM_CREATE_DB
COM_CHANGE_USER
具有伴随事件
<NAME>
值的事件。例如,以下语句生成一个事件,两个事件和一个事件:TableXXX
Query
Query
TableRead
TableInsert
INSERT 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/xxx
xxx
drop_table
select
DROP TABLE
SELECT
SELECT 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_xxx
my_command.h
"Create DB"
"Change user"
COM_CREATE_DB
COM_CHANGE_USER
具有伴随事件
NAME
值的事件。例如,以下语句生成一个事件,两个事件和一个事件:TableXXX
Query
Query
TableRead
TableInsert
INSERT INTO t3 SELECT t1.* FROM t1 JOIN t2;
每个事件都具有和属性,以标识事件所引用的表。
TableXXX
DB
TABLE
Connect
旧式XML审核日志格式的事件不包括连接属性。RECORD_ID
审核记录的唯一标识符。该值由序列号和时间戳组成,格式为
SEQ_TIMESTAMP
。当审核日志插件打开审核日志文件时,它将序列号初始化为审核日志文件的大小,然后为记录的每个记录将序列加1。时间戳记是UTC值,其格式表示审核日志插件打开文件的日期和时间。YYYY-MM-DDThh:mm:ss
例:
RECORD_
TIMESTAMP
一个字符串,表示UTC值,其格式表示生成审核事件的日期和时间。例如,与从客户端接收到的SQL语句的执行相对应的事件具有一个值,该值在该语句完成之后而不是在接收到该语句之后发生。
YYYY-MM-DDThh:mm:ss UTC
TIMESTAMP
例:
TIMESTAMP="2019-10-03T14:25:32 UTC"
以下属性是<AUDIT_RECORD>
元素中的可选属性。其中许多仅针对具有特定NAME
属性值的元素发生。
COMMAND_CLASS
指示执行的操作类型的字符串。
例:
COMMAND_
这些值对应于命令计数器。例如,分别为is 和 for 和statement。以下语句显示可能的名称:
statement/sql/xxx
xxx
drop_table
select
DROP TABLE
SELECT
SELECT 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审核日志类和事件组合
类值 允许的事件值 udit
startup
,shutdown
connection
connect
,change_user
,disconnect
general
status
table_access_dat
read
,delete
,insert
,update
connection_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/xxx
xxx
drop_table
select
DROP TABLE
SELECT
SELECT 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"
- 在