稽核日誌外掛程式支援函數,這些函數提供一個 SQL 介面,用於讀取 JSON 格式的稽核日誌檔案。(此功能不適用於以其他格式寫入的日誌檔案。)
當稽核日誌外掛程式初始化並設定為 JSON 記錄時,它會使用包含目前稽核日誌檔案的目錄作為搜尋可讀取稽核日誌檔案的位置。外掛程式會從 audit_log_file
系統變數的值判斷檔案位置、基本名稱和後綴,然後搜尋名稱符合下列模式的檔案,其中 [...]
表示選用的檔案名稱部分
basename[.timestamp].suffix[.gz][[.pwd_id].enc]
如果檔案名稱以 .enc
結尾,則該檔案會被加密,並且讀取其未加密的內容需要從金鑰環取得解密密碼。稽核日誌外掛程式會如下決定解密密碼的金鑰環 ID
如果
.enc
前面有pwd_id
,則金鑰環 ID 為audit_log-
。pwd_id
如果
.enc
前面沒有pwd_id
,則該檔案具有實作稽核日誌加密密碼歷史記錄之前的舊名稱。金鑰環 ID 為audit_log
。
如需有關加密稽核日誌檔案的詳細資訊,請參閱加密稽核日誌檔案。
外掛程式會忽略已手動重新命名且不符合模式的檔案,以及使用金鑰環中不再可用的密碼加密的檔案。外掛程式會開啟每個剩餘的候選檔案,驗證檔案實際上包含 JSON
稽核事件,並使用每個檔案的第一個事件的時間戳記對檔案進行排序。結果是可以使用記錄讀取函數存取的一系列檔案
audit_log_read()
會從稽核日誌讀取事件或關閉讀取程序。audit_log_read_bookmark()
會傳回最近寫入的稽核日誌事件的書籤。此書籤適用於傳遞給audit_log_read()
,以指示從何處開始讀取。
audit_log_read()
接受一個可選的 JSON
字串引數,而且成功呼叫任一函式所傳回的結果都是 JSON
字串。
若要使用這些函式讀取稽核日誌,請遵循以下原則
呼叫
audit_log_read()
以從給定位置或目前位置開始讀取事件,或關閉讀取若要初始化稽核日誌讀取序列,請傳遞一個引數,指示開始讀取的位置。其中一種方法是傳遞由
audit_log_read_bookmark()
傳回的書籤SELECT audit_log_read(audit_log_read_bookmark());
若要從序列中的目前位置繼續讀取,請在未指定位置的情況下呼叫
audit_log_read()
SELECT audit_log_read();
若要明確關閉讀取序列,請傳遞一個
JSON
null
引數SELECT audit_log_read('null');
無需明確關閉讀取。當工作階段結束或透過呼叫
audit_log_read()
並帶有指示開始位置的引數來初始化新的讀取序列時,讀取會隱式關閉。
成功呼叫
audit_log_read()
以讀取事件會傳回一個JSON
字串,其中包含稽核事件的陣列如果傳回陣列的最終值不是
JSON
null
值,則在剛讀取的事件之後還有更多事件,並且可以再次呼叫audit_log_read()
以讀取更多事件。如果傳回陣列的最終值是
JSON
null
值,則目前讀取序列中沒有更多事件可讀取。
每個非
null
的陣列元素都是一個以JSON
雜湊表示的事件。例如[ { "timestamp": "2020-05-18 13:39:33", "id": 0, "class": "connection", "event": "connect", ... }, { "timestamp": "2020-05-18 13:39:33", "id": 1, "class": "general", "event": "status", ... }, { "timestamp": "2020-05-18 13:39:33", "id": 2, "class": "connection", "event": "disconnect", ... }, null ]
如需有關 JSON 格式稽核事件內容的更多資訊,請參閱JSON 稽核日誌檔案格式。
在下列任何情況下,呼叫
audit_log_read()
讀取事件且未指定位置會產生錯誤尚未透過傳遞位置給
audit_log_read()
來初始化讀取序列。目前讀取序列中沒有更多事件可讀取;也就是說,
audit_log_read()
先前傳回的陣列結尾為JSON
null
值。最近的讀取序列已透過傳遞
JSON
null
值給audit_log_read()
而關閉。
若要在這些情況下讀取事件,必須先透過呼叫
audit_log_read()
並帶有指定位置的引數來初始化讀取序列。
若要指定位置給 audit_log_read()
,請包含一個引數,指示從何處開始讀取。例如,傳遞一個書籤,該書籤是一個 JSON
雜湊,其中包含可唯一識別特定事件的 timestamp
和 id
元素。以下是一個透過呼叫 audit_log_read_bookmark()
函式取得的書籤範例
mysql> SELECT audit_log_read_bookmark();
+-------------------------------------------------+
| audit_log_read_bookmark() |
+-------------------------------------------------+
| { "timestamp": "2020-05-18 21:03:44", "id": 0 } |
+-------------------------------------------------+
將目前的書籤傳遞給 audit_log_read()
會初始化從書籤位置開始的事件讀取
mysql> SELECT audit_log_read(audit_log_read_bookmark());
+-----------------------------------------------------------------------+
| audit_log_read(audit_log_read_bookmark()) |
+-----------------------------------------------------------------------+
| [ {"timestamp":"2020-05-18 22:41:24","id":0,"class":"connection", ... |
+-----------------------------------------------------------------------+
audit_log_read()
的引數是可選的。如果存在,它可以是 JSON
null
值以關閉讀取序列,或是一個 JSON
雜湊。
在 audit_log_read()
的雜湊引數中,項目是可選的,並控制讀取作業的各個方面,例如開始讀取的位置或要讀取的事件數量。以下項目很重要(其他項目會被忽略)
start
:要讀取的第一個事件在稽核日誌中的位置。位置以時間戳記給定,讀取從時間戳記值當天或之後發生的第一個事件開始。start
項目的格式如下,其中value
是時間戳記常值"start": { "timestamp": "value" }
timestamp
,id
:要讀取的第一個事件在稽核日誌中的位置。timestamp
和id
項目一起構成一個唯一識別特定事件的書籤。如果audit_log_read()
引數包含任一項目,則必須同時包含這兩者以完整指定位置,否則會發生錯誤。max_array_length
:要從日誌讀取的最大事件數。如果省略此項目,預設會讀取到日誌結尾或直到讀取緩衝區已滿為止,以先到者為準。
若要指定開始位置給 audit_log_read()
,請傳遞一個雜湊引數,其中包含 start
項目或由 timestamp
和 id
項目組成的書籤。如果雜湊引數同時包含 start
項目和書籤,則會發生錯誤。
如果雜湊引數未指定開始位置,則會從目前位置繼續讀取。
如果時間戳記值不包含時間部分,則會假設時間部分為 00:00:00
。
audit_log_read()
接受的引數範例
讀取從給定時間戳記當天或之後發生的第一個事件開始的事件
audit_log_read('{ "start": { "timestamp": "2020-05-24 12:30:00" } }')
與上一個範例類似,但最多讀取 3 個事件
audit_log_read('{ "start": { "timestamp": "2020-05-24 12:30:00" }, "max_array_length": 3 }')
讀取從
2020-05-24 00:00:00
當天或之後發生的第一個事件開始的事件(時間戳記不包含時間部分,因此假設為00:00:00
)audit_log_read('{ "start": { "timestamp": "2020-05-24" } }')
讀取從具有精確時間戳記和事件 ID 的事件開始的事件
audit_log_read('{ "timestamp": "2020-05-24 12:30:00", "id": 0 }')
與上一個範例類似,但最多讀取 3 個事件
audit_log_read('{ "timestamp": "2020-05-24 12:30:00", "id": 0, "max_array_length": 3 }')
從讀取序列中的目前位置讀取事件
audit_log_read()
從讀取序列中的目前位置開始,最多讀取 5 個事件
audit_log_read('{ "max_array_length": 5 }')
關閉目前的讀取序列
audit_log_read('null')
可以根據需要操作任一記錄讀取函式傳回的 JSON
字串。假設呼叫以取得書籤會產生此值
mysql> SET @mark := audit_log_read_bookmark();
mysql> SELECT @mark;
+-------------------------------------------------+
| @mark |
+-------------------------------------------------+
| { "timestamp": "2020-05-18 16:10:28", "id": 2 } |
+-------------------------------------------------+
使用該引數呼叫 audit_log_read()
可以傳回多個事件。若要限制 audit_log_read()
最多讀取 N
個事件,請在字串中新增一個具有該值的 max_array_length
項目。例如,若要讀取單個事件,請如下修改字串
mysql> SET @mark := JSON_SET(@mark, '$.max_array_length', 1);
mysql> SELECT @mark;
+----------------------------------------------------------------------+
| @mark |
+----------------------------------------------------------------------+
| {"id": 2, "timestamp": "2020-05-18 16:10:28", "max_array_length": 1} |
+----------------------------------------------------------------------+
修改後的字串在傳遞給 audit_log_read()
時,會產生一個最多包含一個事件的結果,無論有多少事件可用。
如果從 mysql 用戶端內叫用稽核日誌函式,二進位字串結果會使用十六進位表示法顯示,具體取決於 --binary-as-hex
的值。有關該選項的更多資訊,請參閱第 6.5.1 節「mysql — MySQL 命令列用戶端」。
若要設定 audit_log_read()
讀取的位元組數限制,請設定 audit_log_read_buffer_size
系統變數。此變數的預設值為 32KB,可以在執行階段設定。每個用戶端都應針對其 audit_log_read()
的使用情況適當地設定其工作階段值 audit_log_read_buffer_size
。
每次呼叫 audit_log_read()
都會傳回緩衝區大小內可容納的盡可能多的事件。不符合緩衝區大小的事件將會被跳過並產生警告。考慮到這種行為,請在評估應用程式的適當緩衝區大小時考慮以下因素
呼叫
audit_log_read()
的次數與每次呼叫傳回的事件數之間存在權衡關係緩衝區大小較小,呼叫傳回的事件較少,因此需要更多次呼叫。
緩衝區大小較大,呼叫傳回的事件較多,因此需要的呼叫次數較少。
緩衝區大小較小(例如預設大小 32KB)時,事件超出緩衝區大小的可能性較大,因此可能會被跳過。
如需有關稽核日誌讀取函式的更多資訊,請參閱稽核日誌函式。