每當發生可稽核事件時,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_
命令值。例如,xxx
Create 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-DD
Thh:mm:ss
範例
<RECORD_ID>12_2019-10-03T14:06:33</RECORD_ID>
<TIMESTAMP>
一個字串,表示
格式的 UTC 值,表示產生稽核事件的日期和時間。例如,對應於執行從用戶端接收的 SQL 陳述式的事件的YYYY-MM-DD
Thh:mm:ss
UTC<TIMESTAMP>
值會在陳述式完成後發生,而不是在收到時發生。範例
<TIMESTAMP>2019-10-03T14:09:45 UTC</TIMESTAMP>
以下元素在 <AUDIT_RECORD>
元素中是選用的。它們中的許多只會出現在特定的 <NAME>
元素值中。
<COMMAND_CLASS>
一個字串,表示執行的動作類型。
範例
<COMMAND_CLASS>drop_table</COMMAND_CLASS>
這些值對應於
statement/sql/
命令計數器。例如,對於xxx
DROP 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
的事件會伴隨XXX
Query
事件。例如,以下語句會產生一個Query
事件、兩個TableRead
事件和一個TableInsert
事件INSERT INTO t3 SELECT t1.* FROM t1 JOIN t2;
每個
Table
事件都有XXX
TABLE
和DB
屬性,以識別事件所指的表格以及包含該表格的資料庫。舊式 XML 稽核日誌格式的
Connect
事件不包含連線屬性。RECORD_ID
稽核記錄的唯一識別碼。該值由序號和時間戳記組成,格式為
。當稽核記錄外掛程式開啟稽核記錄檔時,會將序號初始化為稽核記錄檔的大小,然後為每個記錄的記錄將序號遞增 1。時間戳記是SEQ_TIMESTAMP
格式的 UTC 值,表示稽核記錄外掛程式開啟檔案的日期和時間。YYYY-MM-DD
Thh:mm:ss
範例:
RECORD_ID="12_2019-10-03T14:25:00"
TIMESTAMP
一個字串,表示 UTC 值,格式為
,指出稽核事件產生的日期和時間。例如,對應於從客戶端接收的 SQL 語句執行的事件,其YYYY-MM-DD
Thh:mm:ss
UTCTIMESTAMP
值發生在語句完成之後,而不是在接收時。範例:
TIMESTAMP="2019-10-03T14:25:32 UTC"
以下屬性在 <AUDIT_RECORD>
元素中是可選的。它們中的許多僅在 NAME
屬性具有特定值的元素中出現。
COMMAND_CLASS
一個字串,表示執行的動作類型。
範例:
COMMAND_CLASS="drop_table"
這些值對應於
statement/sql/
命令計數器。例如,對於xxx
DROP 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 稽核日誌類別和事件組合
類別值 允許的事件值 audit
startup
、shutdown
connection
connect
、change_user
、disconnect
general
status
table_access_data
read
、delete
、insert
、update
connection_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": 5
event
一個字串,表示事件類別的子類別。子類別定義事件的類型,與指定事件類別的
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 格式稽核記錄的頂層項目相關聯的雜湊值中。
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 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.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/
命令計數器。例如,對於xxx
DROP 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
一個字串,表示資料表名稱。
範例
"table": "t1"
user
一個表示使用者名稱的字串。其含義因
user
出現的項目而異在
account
項目中,user
是一個表示伺服器驗證用戶端身分的使用者的字串。這是伺服器用於權限檢查的使用者名稱。在
login
項目中,user
是一個表示用戶端傳送的使用者名稱的字串。
範例
"user": "root"