每當發生可稽核事件時,MySQL 伺服器會呼叫稽核日誌外掛程式,將稽核記錄寫入其日誌檔案。通常,外掛程式啟動後寫入的第一個稽核記錄包含伺服器描述和啟動選項。後續的元素代表用戶端連線和中斷連線事件、執行的 SQL 陳述式等事件。僅記錄最上層陳述式,不記錄儲存程式(例如觸發器或儲存程序)內的陳述式。不會記錄 LOAD DATA 等陳述式所參考的檔案內容。
若要選取稽核日誌外掛程式用於寫入其日誌檔案的日誌格式,請在伺服器啟動時設定 audit_log_format 系統變數。這些格式可用:
新式 XML 格式 (
audit_log_format=NEW):與舊式 XML 格式相比,具有更好的 Oracle Audit Vault 相容性的 XML 格式。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_命令值。例如,xxxCreate DB和Change user分別對應於COM_CREATE_DB和COM_CHANGE_USER。具有
Table的XXX<NAME>值的事件會伴隨Query事件。例如,以下陳述式會產生一個Query事件、兩個TableRead事件和一個TableInsert事件INSERT INTO t3 SELECT t1.* FROM t1 JOIN t2;每個
Table事件都包含XXX<TABLE>和<DB>元素,以識別事件參照的資料表以及包含該資料表的資料庫。<RECORD_ID>稽核記錄的唯一識別碼。該值由序號和時間戳記組成,格式為
。當稽核記錄外掛程式開啟稽核記錄檔時,會將序號初始化為稽核記錄檔的大小,然後為每個記錄的記錄將序號遞增 1。時間戳記是SEQ_TIMESTAMP格式的 UTC 值,表示稽核記錄外掛程式開啟檔案的日期和時間。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>具有
connect的<COMMAND_CLASS>值的事件可能會包含<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 socket 檔案連線)、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>稽核日誌檔案以 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的事件會伴隨XXXQuery事件。例如,以下語句會產生一個Query事件、兩個TableRead事件和一個TableInsert事件INSERT INTO t3 SELECT t1.* FROM t1 JOIN t2;每個
Table事件都有XXXTABLE和DB屬性,以識別事件所指的表格以及包含該表格的資料庫。舊式 XML 稽核日誌格式的
Connect事件不包含連線屬性。RECORD_ID稽核記錄的唯一識別碼。該值由序號和時間戳記組成,格式為
。當稽核記錄外掛程式開啟稽核記錄檔時,會將序號初始化為稽核記錄檔的大小,然後為每個記錄的記錄將序號遞增 1。時間戳記是SEQ_TIMESTAMP格式的 UTC 值,表示稽核記錄外掛程式開啟檔案的日期和時間。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 socket 檔案連線)、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 節,「Proxy Users」)。範例:
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的不同之處,請參閱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。
以下範例顯示了不同事件類型(如 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.33 稽核日誌類別和事件組合
類別值 允許的事件值 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" }時間此欄位與
timestamp欄位中的相似,但值為整數,表示產生稽核事件的日期和時間的 UNIX 時間戳記值。範例
"time" : 1618498687僅當啟用
audit_log_format_unix_timestamp系統變數時,time欄位才會出現在 JSON 格式的日誌檔案中。時間戳記一個字串,以
YYYY-MM-DD hh:mm:ss格式表示 UTC 值,指出產生稽核事件的日期和時間。例如,對應於執行從用戶端接收的 SQL 語句的事件,其timestamp值發生在語句完成之後,而不是在接收時。範例
"timestamp": "2019-10-03 13:50:01"對於具有相同
timestamp值的稽核記錄,它們的id值會區分它們並形成序列。在稽核日誌中,timestamp/id對是唯一的。這些對是書籤,用於識別日誌中的事件位置。
這些項目出現在與 JSON 格式稽核記錄的頂層項目相關聯的雜湊值中。
argsMySQL 伺服器啟動時在命令列或選項檔案中提供的選項陣列。第一個選項是伺服器可執行檔的路徑。
範例
"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": 18384command一個字串,表示產生稽核事件的指令類型,例如伺服器從用戶端收到的命令。
範例
"command": "Query"connection_type與伺服器連線的安全性狀態。允許的值為
tcp/ip(建立未加密的 TCP/IP 連線)、ssl(建立已加密的 TCP/IP 連線)、socket(Unix socket 檔案連線)、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.116250rows_examined查詢期間存取的資料列數。此項目是可選查詢統計資訊的一部分。
範例
"rows_examined": 20878rows_sent傳送給用戶端的資料列數。此項目是可選查詢統計資訊的一部分。
範例
"rows_sent": 3server_id一個無符號整數,表示伺服器 ID。這與
server_id系統變數的值相同。範例
"server_id": 1sql_command一個表示 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": 1051table一個字串,表示資料表名稱。
範例
"table": "t1"user一個表示使用者名稱的字串。其含義因
user出現的項目而異在
account項目中,user是一個表示伺服器驗證用戶端身分的使用者的字串。這是伺服器用於權限檢查的使用者名稱。在
login項目中,user是一個表示用戶端傳送的使用者名稱的字串。
範例
"user": "root"