文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式 Letter) - 39.9Mb
PDF (A4) - 40.0Mb
Man 頁面 (TGZ) - 258.5Kb
Man 頁面 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  稽核日誌檔案格式

8.4.5.4 稽核日誌檔案格式

每當發生可稽核的事件時,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 稽核日誌檔案格式

這是一個新式 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> 元素內元素的順序不保證。

  • 元素值不是固定長度。長值可能會被截斷,如後面的元素描述所示。

  • <>"& 字元會分別編碼為 &lt;&gt;&quot;&amp;。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

    可能的值為 AuditBinlog DumpChange userClose stmtConnect OutConnectCreate DBDaemonDebugDelayed insertDrop DBExecuteFetchField ListInit DBKillLong DataNoAuditPingPrepareProcesslistQueryQuitRefreshRegister SlaveReset stmtSet optionShutdownSleepStatisticsTable DumpTableDeleteTableInsertTableReadTableUpdateTime

    這些值中有許多對應於 my_command.h 標頭檔案中列出的 COM_xxx 命令值。例如,Create DBChange user 分別對應於 COM_CREATE_DBCOM_CHANGE_USER

    <NAME> 值為 TableXXX 的事件會伴隨 Query 事件。例如,以下陳述式會產生一個 Query 事件、兩個 TableRead 事件和一個 TableInsert 事件:

    INSERT INTO t3 SELECT t1.* FROM t1 JOIN t2;

    每個 TableXXX 事件都包含 <TABLE><DB> 元素,以識別事件所指的資料表以及包含該資料表的資料庫。

  • <RECORD_ID>

    稽核記錄的唯一識別碼。該值由序號和時間戳記組成,格式為 SEQ_TIMESTAMP。當稽核日誌外掛程式開啟稽核日誌檔案時,它會將序號初始化為稽核日誌檔案的大小,然後為每個記錄的記錄將序號遞增 1。時間戳記是 YYYY-MM-DDThh:mm:ss 格式的 UTC 值,表示稽核日誌外掛程式開啟檔案的日期和時間。

    範例:

    <RECORD_ID>12_2019-10-03T14:06:33</RECORD_ID>
  • <TIMESTAMP>

    一個字串,表示 YYYY-MM-DDThh:mm:ss UTC 格式的 UTC 值,表示產生稽核事件的日期和時間。例如,對應於執行從用戶端接收的 SQL 陳述式的事件,其 <TIMESTAMP> 值會在陳述式完成後發生,而不是在接收時發生。

    範例:

    <TIMESTAMP>2019-10-03T14:09:45 UTC</TIMESTAMP>

以下元素在 <AUDIT_RECORD> 元素中是選用的。其中許多元素僅在具有特定 <NAME> 元素值時才會出現。

  • <COMMAND_CLASS>

    一個字串,表示執行的動作類型。

    範例:

    <COMMAND_CLASS>drop_table</COMMAND_CLASS>

    這些值對應於 statement/sql/xxx 命令計數器。例如,對於 DROP TABLESELECT 陳述式,xxx 分別是 drop_tableselect。以下陳述式會顯示可能名稱:

    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 取用者相容。STATUSmysql_errno() C API 函數的值。此值在成功時為 0,發生錯誤時為非零值,因此發生錯誤時不一定為 1。

    範例:

    <STATUS_CODE>0</STATUS_CODE>
  • <TABLE>

    一個字串,表示資料表名稱。

    範例:

    <TABLE>t3</TABLE>
  • <USER>

    一個字串,表示用戶端傳送的使用者名稱。這可能與 <PRIV_USER> 值不同。

    範例:

    <USER>root[root] @ localhost [127.0.0.1]</USER>
  • <VERSION>

    一個不帶正負號的整數,表示稽核日誌檔案格式的版本。

    範例:

    <VERSION>1</VERSION>
舊式 XML 稽核日誌檔案格式

這是一個舊式 XML 格式的範例日誌檔案 (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> 元素內屬性的順序不保證。

  • 屬性值不是固定長度。長值可能會被截斷,如後面的屬性描述所示。

  • <>"& 字元會分別編碼為 &lt;&gt;&quot;&amp;。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

    可能的值為 AuditBinlog DumpChange userClose stmtConnect OutConnectCreate DBDaemonDebugDelayed insertDrop DBExecuteFetchField ListInit DBKillLong DataNoAuditPingPrepareProcesslistQueryQuitRefreshRegister SlaveReset stmtSet optionShutdownSleepStatisticsTable DumpTableDeleteTableInsertTableReadTableUpdateTime

    這些值中有許多對應於 my_command.h 標頭檔案中列出的 COM_xxx 命令值。例如,"Create DB""Change user" 分別對應於 COM_CREATE_DBCOM_CHANGE_USER

    具有 NAME 值為 TableXXX 的事件會伴隨 Query 事件。例如,以下語句會產生一個 Query 事件、兩個 TableRead 事件和一個 TableInsert 事件

    INSERT INTO t3 SELECT t1.* FROM t1 JOIN t2;

    每個 TableXXX 事件都具有 TABLEDB 屬性,以識別事件所指的表以及包含該表的資料庫。

    舊式 XML 稽核日誌格式的 Connect 事件不包含連線屬性。

  • RECORD_ID

    稽核記錄的唯一識別碼。該值由序號和時間戳記組成,格式為 SEQ_TIMESTAMP。當稽核日誌外掛程式開啟稽核日誌檔案時,它會將序號初始化為稽核日誌檔案的大小,然後為每個記錄的記錄將序號遞增 1。時間戳記是 YYYY-MM-DDThh:mm:ss 格式的 UTC 值,表示稽核日誌外掛程式開啟檔案的日期和時間。

    範例: RECORD_ID="12_2019-10-03T14:25:00"

  • TIMESTAMP

    一個字串,代表 UTC 值,格式為 YYYY-MM-DDThh:mm:ss UTC,指示稽核事件產生的日期和時間。例如,對應於從客戶端接收的 SQL 語句執行的事件,其 TIMESTAMP 值會在語句完成後發生,而不是在接收到語句時發生。

    範例: TIMESTAMP="2019-10-03T14:25:32 UTC"

以下屬性在 <AUDIT_RECORD> 元素中為選用項目。其中許多屬性僅在具有特定 NAME 屬性值的元素中出現。

  • COMMAND_CLASS

    一個字串,表示執行的動作類型。

    範例: COMMAND_CLASS="drop_table"

    這些值對應於 statement/sql/xxx 命令計數器。例如,對於 DROP TABLESELECT 陳述式,xxx 分別是 drop_tableselect。以下陳述式會顯示可能名稱:

    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 取用者相容。STATUSmysql_errno() C API 函數的值。此值在成功時為 0,發生錯誤時為非零值,因此發生錯誤時不一定為 1。

    範例: STATUS_CODE="0"

  • TABLE

    一個字串,表示資料表名稱。

    範例: TABLE="t3"

  • USER

    一個字串,代表客戶端傳送的使用者名稱。這可能與 PRIV_USER 值不同。

  • VERSION

    一個不帶正負號的整數,表示稽核日誌檔案格式的版本。

    範例: VERSION="1"

JSON 稽核日誌檔案格式

對於 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_sentbytes_received 欄位,則必須將系統變數 log_slow_extra 設定為 ON。

以下範例顯示不同事件類型的 JSON 物件格式 (由 classevent 項目指示),為了易讀性而略微重新格式化

稽核啟動事件

{ "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,並且 accountlogin 不會出現。

稽核關閉事件

{ "timestamp": "2019-10-03 14:28:20",
  "id": 3,
  "class": "audit",
  "event": "shutdown",
  "connection_id": 0,
  "shutdown_data": { "server_id": 1 } }

當稽核日誌外掛程式因伺服器關閉而被解除安裝時 (而不是在執行階段停用),connection_id 設定為 0,並且 accountlogin 不會出現。

連線或變更使用者事件

{ "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() 函數值相等的項目:userhost

    範例:

    "account": { "user": "root", "host": "localhost" }
  • class

    一個字串,代表事件類別。類別定義了事件的類型,同時與指定事件子類的 event 項目一起使用。

    範例:

    "class": "connection"

    下表顯示 classevent 值的允許組合。

    表 8.34 稽核日誌類別和事件組合

    類別值 允許的事件值
    audit startupshutdown
    connection connectchange_userdisconnect
    general status
    table_access_data readdeleteinsertupdate

  • connection_data

    有關用戶端連線的資訊。該值是一個雜湊,其中包含以下項目:connection_typestatusdb,以及可能的 connection_attributes。此項目僅出現在 class 值為 connection 的稽核記錄中。

    範例:

    "connection_data": { "connection_type": "ssl",
                         "status": 0,
                         "db": "test" }

    class 值為 connectionevent 值為 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

    有關已執行語句或命令的資訊。該值是一個雜湊,其中包含以下項目:commandsql_commandquerystatus。此項目僅出現在 class 值為 general 的稽核記錄中。

    範例:

    "general_data": { "command": "Query",
                      "sql_command": "show_variables",
                      "query": "SHOW VARIABLES",
                      "status": 0 }
  • id

    一個無符號整數,代表事件 ID。

    範例:

    "id": 2

    對於具有相同 timestamp 值的稽核記錄,其 id 值會區分它們並形成一個序列。在稽核日誌中,timestamp/id 對是唯一的。這些對是書籤,用於識別日誌中的事件位置。

  • login

    指示用戶端如何連線至伺服器的資訊。該值是一個雜湊,其中包含以下項目:userosipproxy

    範例:

    "login": { "user": "root", "os": "", "ip": "::1", "proxy": "" }
  • query_statistics

    用於離群值偵測的選用查詢統計資料。該值是一個雜湊,其中包含以下項目:query_timerows_sentrows_examinedbytes_receivedbytes_sent。如需設定查詢統計資料的指示,請參閱為離群值偵測新增查詢統計資料

    範例:

    "query_statistics": { "query_time": 0.116250,
                          "bytes_sent": 18384,
                          "bytes_received": 78858,
                          "rows_sent": 3,
                          "rows_examined": 20878 }
  • shutdown_data

    與稽核日誌外掛程式終止相關的資訊。此值為包含以下項目的雜湊:server_id。此項目僅在 classevent 值分別為 auditshutdown 的稽核記錄中出現。

    範例:

    "shutdown_data": { "server_id": 1 }
  • startup_data

    與稽核日誌外掛程式初始化相關的資訊。此值為包含以下項目的雜湊:server_idos_versionmysql_versionargs。此項目僅在 classevent 值分別為 auditstartup 的稽核記錄中出現。

    範例:

    "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

    關於資料表存取的資訊。此值為包含以下項目的雜湊:dbtablequerysql_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 TABLESELECT 陳述式,xxx 分別是 drop_tableselect。以下陳述式會顯示可能名稱:

    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"