每當發生可稽核的事件時,MySQL 伺服器會呼叫稽核日誌外掛程式,將稽核記錄寫入其日誌檔案。通常,外掛程式啟動後寫入的第一個稽核記錄包含伺服器描述和啟動選項。之後的元素代表事件,例如用戶端連線和中斷連線事件、執行的 SQL 陳述式等等。只會記錄最上層的陳述式,而不會記錄儲存的程式(例如觸發程序或儲存程序)內的陳述式。不會記錄 LOAD DATA
等陳述式所參考的檔案內容。
若要選取稽核日誌外掛程式用來寫入其日誌檔案的日誌格式,請在伺服器啟動時設定 audit_log_format
系統變數。這些格式可用:
新式 XML 格式 (
audit_log_format=NEW
):XML 格式,與舊式 XML 格式相比,與 Oracle Audit Vault 的相容性更好。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>
稽核日誌檔案以 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
。<NAME>
值為Table
的事件會伴隨XXX
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>
<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 節「Proxy 使用者」)。範例:
<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 使用者(請參閱 第 8.2.19 節「Proxy 使用者」)。如果未使用使用者 Proxy,則該值為空。
範例:
<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>
的不同之處,請參閱<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 通訊端檔案連線)、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 使用者」)。範例:
OS_LOGIN="jeffrey"
OS_VERSION
一個字串,表示建置或執行伺服器的作業系統。
範例:
OS_VERSION="x86_64-Linux"
PRIV_USER
一個字串,代表伺服器驗證客戶端的使用者。這是伺服器用於權限檢查的使用者名稱,並且可能與
USER
值不同。範例:
PRIV_USER="jeffrey"
PROXY_USER
一個字串,表示 Proxy 使用者(請參閱 第 8.2.19 節「Proxy 使用者」)。如果未使用使用者 Proxy,則該值為空。
範例:
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。
以下範例顯示不同事件類型的 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 稽核日誌類別和事件組合
類別值 允許的事件值 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
項目,以顯示客戶端在連線時傳遞的連線屬性。(有關這些屬性的資訊,這些屬性也會在效能架構表中公開,請參閱第 29.12.9 節「效能架構連線屬性表」。)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" }
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": 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 節,「Proxy 使用者」。範例:
"os": "jeffrey"
os_version
一個字串,表示建置或執行伺服器的作業系統。
範例:
"os_version": "i686-Linux"
proxy
一個字串,表示 Proxy 使用者(請參閱 第 8.2.19 節「Proxy 使用者」)。如果未使用使用者 Proxy,則該值為空。
範例:
"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"