MySQL 審計(jì)級(jí)別配置實(shí)現(xiàn)步驟
基于 145 環(huán)境 mysql-0d130fde 實(shí)例驗(yàn)證
實(shí)例信息:
- 集群:x.x.x.145
- 命名空間:qfusion-admin
- 插件:Percona Audit Plugin (audit_log.so)
- MySQL 版本:8.0.35
一、當(dāng)前環(huán)境審計(jì)配置
1.1 已安裝的審計(jì)插件
audit_log ACTIVE AUDIT audit_log.so GPL
1.2 當(dāng)前審計(jì)參數(shù)
| 參數(shù) | 值 | 說(shuō)明 |
|---|---|---|
| audit_log_policy | ALL | 當(dāng)前審計(jì)級(jí)別(全量) |
| audit_log_format | JSON | 日志格式 |
| audit_log_file | /var/log/mysql/audit.log | 日志文件路徑 |
| audit_log_rotate_on_size | 536870912 (512MB) | 日志輪轉(zhuǎn)大小 |
| audit_log_rotations | 10 | 保留日志文件數(shù)量 |
| audit_log_strategy | ASYNCHRONOUS | 異步寫入策略 |
| audit_log_buffer_size | 1048576 (1MB) | 緩沖區(qū)大小 |
| audit_log_max_sqltext | 2048 | SQL最大記錄長(zhǎng)度 |
| audit_log_exclude_accounts | root@%,root@localhost,repl@%,@ | 排除審計(jì)賬戶 |
| audit_log_display_query_time | ON | 顯示查詢耗時(shí) |
二、Percona Audit Plugin 審計(jì)級(jí)別詳解
Percona Audit Plugin 支持 4 種審計(jì)策略(policy):
Policy 對(duì)照表
| Policy | 等級(jí) | 審計(jì)內(nèi)容 |
|---|---|---|
| NONE | Level 0 | 關(guān)閉審計(jì) |
| LOGINS | Level 1 | 連接事件 + 默認(rèn)查詢記錄 |
| QUERIES | Level 2 | 所有 SQL 查詢(不含連接) |
| ALL | Level 3 | 連接 + 查詢(完整審計(jì)) |
注意:Percona 的 LOGINS 級(jí)別仍會(huì)記錄 Query,這是與 MariaDB Audit Plugin 的區(qū)別。
三、各級(jí)別詳細(xì)說(shuō)明
Level 0: NONE(關(guān)閉審計(jì))
設(shè)置方式
SET GLOBAL audit_log_policy=NONE;
特點(diǎn)
- 不記錄任何審計(jì)信息
- 性能影響:0%
- 適用場(chǎng)景:壓測(cè)、開(kāi)發(fā)環(huán)境
驗(yàn)證結(jié)果
# 執(zhí)行查詢 SELECT 1; # 審計(jì)日志:無(wú)新增記錄
Level 1: LOGINS(基礎(chǔ)審計(jì))
設(shè)置方式
SET GLOBAL audit_log_policy=LOGINS;
記錄內(nèi)容
- Connect 事件(用戶登錄)
- Quit 事件(用戶登出)
- Query 事件(Percona 特性:LOGINS 級(jí)別仍記錄 SQL)
適用場(chǎng)景
- 生產(chǎn)環(huán)境常態(tài)
- 等保合規(guī)(基礎(chǔ)級(jí))
審計(jì)日志示例
{"name":"Connect","record":"464","timestamp":"2025-12-24T09:48:53Z","user":"audit_test","host":"localhost"}
{"name":"Query","record":"466","timestamp":"2025-12-24T09:48:53Z","command_class":"select","sqltext":"SELECT 1"}
{"name":"Quit","record":"468","timestamp":"2025-12-24T09:48:53Z","user":"audit_test"}
性能影響
- 很低(< 3%)
Level 2: QUERIES(增強(qiáng)審計(jì))
設(shè)置方式
SET GLOBAL audit_log_policy=QUERIES;
記錄內(nèi)容
- 所有 SQL 查詢(SELECT / INSERT / UPDATE / DELETE / DDL)
- 不記錄 Connect/Quit 事件
適用場(chǎng)景
- 核心業(yè)務(wù)庫(kù)
- 需要 SQL 級(jí)別追溯
- 金融/電力/政企系統(tǒng)
審計(jì)日志示例
{"name":"Query","record":"471","timestamp":"2025-12-24T09:49:03Z","command_class":"select","sqltext":"SELECT 1"}
{"name":"Query","record":"472","timestamp":"2025-12-24T09:49:03Z","command_class":"delete","sqltext":"DELETE FROM test_audit.t WHERE id=1"}
性能影響
- 中等(5% ~ 10%)
- 與 SQL 頻率正相關(guān)
Level 3: ALL(全量審計(jì))
設(shè)置方式
SET GLOBAL audit_log_policy=ALL;
記錄內(nèi)容
- Connect 事件
- Quit 事件
- 所有 SQL 查詢
- 完整上下文(用戶、IP、時(shí)間、耗時(shí))
適用場(chǎng)景
- 安全事件追溯
- 應(yīng)急排查(短期開(kāi)啟)
- 高合規(guī)要求環(huán)境
審計(jì)日志示例
{"name":"Connect","record":"474","timestamp":"2025-12-24T09:49:16Z","user":"audit_test","host":"localhost"}
{"name":"Query","record":"475","timestamp":"2025-12-24T09:49:16Z","command_class":"select","sqltext":"select @@version_comment limit 1"}
{"name":"Query","record":"476","timestamp":"2025-12-24T09:49:16Z","command_class":"select","sqltext":"SELECT * FROM test_audit.t"}
{"name":"Quit","record":"477","timestamp":"2025-12-24T09:49:16Z","user":"audit_test"}
性能影響
- 較高(10% ~ 20%+)
- 日志量快速增長(zhǎng)
- 長(zhǎng)期開(kāi)啟需謹(jǐn)慎
四、審計(jì)日志字段說(shuō)明
JSON 格式字段
| 字段 | 說(shuō)明 |
|---|---|
| name | 事件類型(Connect/Query/Quit/Table/Audit) |
| timestamp | UTC 時(shí)間戳 |
| connection_id | 連接 ID |
| user | 執(zhí)行用戶 |
| host | 連接來(lái)源主機(jī) |
| ip | 客戶端 IP |
| db | 數(shù)據(jù)庫(kù)名 |
| command_class | SQL 類型(select/insert/update/delete/drop等) |
| sqltext | 完整 SQL 文本 |
| status | 執(zhí)行狀態(tài)碼(0=成功) |
| start_time | 查詢開(kāi)始時(shí)間(微秒) |
| end_time | 查詢結(jié)束時(shí)間(微秒) |
五、高級(jí)配置技巧
5.1 排除特定賬戶審計(jì)
當(dāng)前環(huán)境已配置排除 root 用戶:
-- 查看排除列表 SHOW VARIABLES LIKE 'audit_log_exclude_accounts'; -- 設(shè)置排除賬戶 SET GLOBAL audit_log_exclude_accounts='root@%,root@localhost,repl@%,@';
5.2 只審計(jì)特定數(shù)據(jù)庫(kù)
-- 只審計(jì)特定庫(kù) SET GLOBAL audit_log_include_databases='business_db,core_db';
5.3 只審計(jì)特定 SQL 類型
-- 只審計(jì) DML SET GLOBAL audit_log_include_commands='insert,update,delete';
5.4 日志輪轉(zhuǎn)配置
-- 單文件最大 512MB SET GLOBAL audit_log_rotate_on_size=536870912; -- 保留 10 個(gè)歷史文件 SET GLOBAL audit_log_rotations=10;
六、生產(chǎn)環(huán)境建議
6.1 通用生產(chǎn)庫(kù)(99% 場(chǎng)景)
推薦配置:LOGINS + 慢日志
SET GLOBAL audit_log_policy=LOGINS; SET GLOBAL long_query_time=1;
優(yōu)勢(shì)
- 審計(jì)連接 + DDL
- 性能穩(wěn)定
- 易長(zhǎng)期運(yùn)行
6.2 核心業(yè)務(wù) / 金融 / 電力
推薦配置:QUERIES + 定期清理
SET GLOBAL audit_log_policy=QUERIES;
配合措施
- 定期歸檔審計(jì)日志
- 集中化日志收集(ELK)
- 設(shè)置日志輪轉(zhuǎn)
6.3 不推薦配置
-- 長(zhǎng)期開(kāi)啟 ALL,配合 audit_log_strategy=ASYNCHRONOUS SET GLOBAL audit_log_policy=ALL; SET GLOBAL audit_log_strategy=ASYNCHRONOUS;
風(fēng)險(xiǎn)
- 高并發(fā)下可能引發(fā) I/O 抖動(dòng)
- 日志文件占用大量磁盤
- 影響主備同步延遲
七、審計(jì) vs 其他日志
| 日志類型 | 安全合規(guī) | 數(shù)據(jù)恢復(fù) | 性能分析 | SELECT記錄 |
|---|---|---|---|---|
| 審計(jì)日志 | ? | ? | ? | 可選 |
| binlog | ? | ? | ? | ? |
| 慢日志 | ? | ? | ? | 僅慢SQL |
八、常見(jiàn)問(wèn)題
Q1: 為什么 LOGINS 級(jí)別還記錄 Query?
A: Percona Audit Plugin 的 LOGINS 級(jí)別行為與 MariaDB 不同,會(huì)同時(shí)記錄連接和查詢。如需只記錄連接,需使用 audit_log_exclude_commands 過(guò)濾。
Q2: 如何臨時(shí)關(guān)閉審計(jì)?
SET GLOBAL audit_log_policy=NONE;
Q3: 審計(jì)文件滿了怎么辦?
審計(jì)插件會(huì)自動(dòng)輪轉(zhuǎn),但建議配置監(jiān)控:
# 檢查審計(jì)日志大小 ls -lh /var/log/mysql/audit.log* # 設(shè)置定期清理任務(wù) find /var/log/mysql/audit.log* -mtime +30 -delete
Q4: 審計(jì)影響有多大?
實(shí)測(cè)數(shù)據(jù)(參考):
- NONE: 0% 影響
- LOGINS: ??% 影響
- QUERIES: 5-10% 影響
- ALL: 10-20%+ 影響(與 QPS 正相關(guān))
九、配置模板
等保合規(guī)配置(my.cnf)
[mysqld] # 加載審計(jì)插件(通常已預(yù)裝) plugin-load=audit_log.so # 審計(jì)策略 audit_log_policy=LOGINS audit_log_format=JSON audit_log_file=/var/log/mysql/audit.log # 輪轉(zhuǎn)配置 audit_log_rotate_on_size=536870912 audit_log_rotations=9 # 排除管理賬戶(避免日志膨脹) audit_log_exclude_accounts=root@%,root@localhost,repl@%,@ # 性能優(yōu)化 audit_log_strategy=ASYNCHRONOUS audit_log_buffer_size=1048576 # SQL 記錄配置 audit_log_max_sqltext=2048 audit_log_display_query_time=ON
到此這篇關(guān)于MySQL 審計(jì)級(jí)別配置實(shí)現(xiàn)步驟的文章就介紹到這了,更多相關(guān)MySQL 審計(jì)級(jí)別配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL如何查看數(shù)據(jù)庫(kù)連接數(shù)
本文介紹了在MySQL中查看數(shù)據(jù)庫(kù)連接數(shù)的多種方法,包括使用SHOWSTATUS命令、查詢information_schema數(shù)據(jù)庫(kù)、使用SHOWPROCESSLIST命令、查看最大連接數(shù)以及使用性能模式,每個(gè)方法都有詳細(xì)的示例和注意事項(xiàng),幫助你有效地監(jiān)控和管理數(shù)據(jù)庫(kù)連接2024-11-11
mysql 字符串長(zhǎng)度計(jì)算實(shí)現(xiàn)代碼(gb2312+utf8)
PHP對(duì)中文字符串的處理一直困擾于剛剛接觸PHP開(kāi)發(fā)的新手程序員。下面簡(jiǎn)要的剖析一下PHP對(duì)中文字符串長(zhǎng)度的處2011-12-12
MySQL中查詢當(dāng)天數(shù)據(jù)中離時(shí)間點(diǎn)最近的數(shù)據(jù)(兩種方法)
在 MySQL 中,你可以使用 ORDER BY 和 LIMIT 語(yǔ)句來(lái)查詢當(dāng)天數(shù)據(jù)中離指定時(shí)間最近的數(shù)據(jù),本文給大家介紹MySQL中查詢當(dāng)天數(shù)據(jù)中離時(shí)間點(diǎn)最近的數(shù)據(jù),感興趣的朋友一起看看吧2023-12-12
MySQL5.7.18主從復(fù)制搭建(一主一從)教程詳解
MySQL使用3個(gè)線程來(lái)執(zhí)行復(fù)制功能(其中1個(gè)在主服務(wù)器上,另兩個(gè)在從服務(wù)器上。這篇文章主要介紹了MySQL5.7.18主從復(fù)制搭建(一主一從)教程詳解,需要的朋友可以參考下2017-08-08
簡(jiǎn)單談?wù)凪ySQL優(yōu)化利器-慢查詢
分析MySQL語(yǔ)句查詢性能的方法除了使用 EXPLAIN 輸出執(zhí)行計(jì)劃,還可以讓MySQL記錄下查詢超過(guò)指定時(shí)間的語(yǔ)句,我們將超過(guò)指定時(shí)間的SQL語(yǔ)句查詢稱為“慢查詢”2017-01-01
MySQL無(wú)法啟動(dòng)1067錯(cuò)誤的又一種解決方法(機(jī)房斷電)
今早在對(duì)一張table 創(chuàng)建primay key過(guò)程中發(fā)生了斷電,當(dāng)電腦再次啟動(dòng)時(shí)候,發(fā)現(xiàn)mysql 服務(wù)無(wú)法啟動(dòng),使用 net start 提示 1067錯(cuò)誤,折騰了2個(gè)小時(shí)無(wú)法解決,后來(lái)只能通過(guò)手工刪除數(shù)據(jù)文件,日志文件,再啟動(dòng)服務(wù),然后導(dǎo)入數(shù)據(jù)來(lái)完成2013-01-01
MySql 8.0及對(duì)應(yīng)驅(qū)動(dòng)包匹配的注意點(diǎn)說(shuō)明
這篇文章主要介紹了MySql 8.0及對(duì)應(yīng)驅(qū)動(dòng)包匹配的注意點(diǎn)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
MySQL中出現(xiàn)亂碼和表格不對(duì)齊的解決辦法
這篇文章給大家介紹了MySQL中出現(xiàn)亂碼和表格不對(duì)齊的解決辦法,文中通過(guò)代碼和圖文講解的非常詳細(xì),對(duì)大家的解決MySQL中出現(xiàn)亂碼和表格不對(duì)齊有一定的幫助,需要的朋友可以參考下2024-02-02

