文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

8.4.5.4 稽核日誌檔案格式

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

以下是新式 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

    具有 TableXXX<NAME> 值的事件會伴隨 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>

    具有 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 消費者相容。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 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 消費者相容。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。

以下範例顯示了不同事件類型(如 classevent 項目所示)的 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,並且不存在 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.33 稽核日誌類別和事件組合

    類別值 允許的事件值
    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 項目,以顯示客戶端在連線時傳遞的連線屬性。(有關這些屬性的資訊,這些屬性也會在 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

    有關已執行語句或命令的資訊。該值是一個雜湊,其中包含以下項目: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" }
  • 時間

    此欄位與 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 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"