每當發生可稽核的事件時,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_命令值。例如,xxxCreate 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事件都包含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><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的事件會伴隨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 通訊端檔案連線)、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 稽核日誌類別和事件組合
類別值 允許的事件值 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項目,以顯示客戶端在連線時傳遞的連線屬性。(有關這些屬性的資訊,這些屬性也會在效能架構表中公開,請參閱第 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": 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" }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": 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 節,「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.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"