如何知道 MYSQL 數據庫中哪個使用者更新/插入或刪除?
使用觸發器,我可以在 MYSQL 表中建立歷史記錄,我可以在其中檢測數據庫中的所有更改。我的問題是我想知道哪個使用者在我的數據庫中進行了更改?
取決於你是什麼版本。
您可以安裝 audit_plugin:
INSTALL PLUGIN server_audit SONAME 'server_audit';
您可以選擇兩個輸出,
file
或syslog
. 輸出格式為:20140901 15:19:44,localhost.localdomain,root,localhost,4,133,WRITE,employees,salaries, 20140901 15:19:44,localhost.localdomain,root,localhost,4,133,QUERY,employees,'DELETE FROM salaries LIMIT 100',0
警告通知
如果您啟用 audit_plugin(它適用於所有日誌記錄程序,如 SLOW LOW、GENERAL LOG…),請注意不要在 I/O 方面使磁碟飽和。根據您的工作負載,最好將這些類型的日誌寫入專用磁碟,以盡量減少對 MySQL 實例的影響。您也可以將它們扔到系統日誌中,但您應該擁有處理它們的架構(例如 ELK)。
最大限度。
有幾個選項,但這裡有兩個基於最終使用者連接方式的兩個選項。
首先,如果您的使用者以自己的身份連接。例如,如果您有一個使用者“annamaria”,那麼在您的觸發器中,您可以使用 CURRENT_USER() 函式來辨識使用者。每次修改都將 CURRENT_USER() 記錄到您的審計表中,您可以跟踪哪個使用者做了什麼。
其次,如果所有使用者都使用相同的數據庫連接(很常見)。在這種情況下,您希望獲取有關最終使用者的會話資訊。在這種情況下,您需要從 mysql 查詢各種連接資訊。
如果您使用 MySQL 5.1.7 或更高版本,並且您的使用者直接從他們的 PC 連接到數據庫,並且他們的 PC 具有有意義的名稱,例如 AWOLFE_LAPTOP,那麼您可以將該值放入您的審計表中:
SELECT host FROM information_schema.processlist WHERE id = connection_id()
除了登錄使用者名(您的評論明確表示不可用)和客戶端電腦(“主機”)名稱之外,我不知道在不更改您的應用程序的情況下辨識使用者的任何可靠方法。
您需要修改將使用者連接到數據庫的程式碼,並在登錄後立即相應地設置會話變數。您必須提示使用者輸入使用者名,或者可能是使用者名和密碼。然後,您將使用它來填充稍後可以在觸發器中使用的會話變數。
SELECT @identified_user := usertab.userid from usertab where username = @username_from_input and password = @password_from_input
有安全意識的人請接受以下保護更好的解決方案:
SELECT @identified_user = hashedcredentials(@username_from_input, @password_from_input);
您的主要問題來自讓所有使用者以相同的數據庫使用者身份連接。(“一個大數據庫使用者”模型。)請改變這個!
祝你好運!
安德魯·沃爾夫