成都都江堰網(wǎng)站建設(shè)廣告媒體資源平臺
環(huán)境:mysql 8.0.14 社區(qū)版
閱讀文本需要的背景知識:對數(shù)據(jù)庫的基本概念(觸發(fā)器、存儲過程、事件),mysql下general log的配置指令
背景:因?qū)徲嬓枰?#xff0c;對于數(shù)據(jù)庫操作需要留痕。實際訪問數(shù)據(jù)庫的有程序及客戶端人工,程序化訪問會產(chǎn)生大量的垃圾日志。過濾并記錄我們指定要的日志,是本文要解決的問題。
調(diào)研了解到mysql有多種日志,其中最豐富的是查詢?nèi)罩?#xff08;general log),其他都不滿足要求,但其只有輸出到TABLE才有執(zhí)行sql對應(yīng)用戶的信息。
以下指令都是在mysql庫下,用root用戶執(zhí)行。
SET global log_output='TABLE';
設(shè)置時間格式與本機一致
set global log_timestamps='SYSTEM';
?開始記錄日志
SET global general_log=1;
這時,日志已經(jīng)寫到mysql.general_log表中已經(jīng)有了日志。
但sql執(zhí)行量大,該表被認定為系統(tǒng)表,不可附加觸發(fā)器在他上面(被數(shù)據(jù)庫報錯),不能用delete去刪除我們不要的數(shù)據(jù)(被數(shù)據(jù)庫報錯,帶鎖),但是這張表可以truncate。
如果我們不寫table,而寫入到file又沒有我們要的字段。
于是,可以這么做:
1、創(chuàng)建一個自定義表,其結(jié)構(gòu)與系統(tǒng)表相似。
?CREATE TABLE 目標表名 LIKE general_log;
2、將系統(tǒng)表中你要的數(shù)據(jù)復制到自定義表中。
INSERT INTO 目標表名 (列1,列2,列3,...) SELECT 列1,列2,列3,...
FROM general_log WHERE 條件;
3、清理系統(tǒng)表,留出空間
truncate table general_log;
4、智能一點,每分鐘跑一次
創(chuàng)建一個MySQL事件,用于定時執(zhí)行(可以將上述幾部放到存儲過程里)
CREATE EVENT event_nameON SCHEDULE AT EVERY 1 MINITEDOCALL procedure_name();
如果默認沒有啟動事件,要啟用
SET GLOBAL event_scheduler = ON;
對了,完事兒之后,
有/var/lib/mysql/目標表名.csv可以直接拷給審計,哈哈哈哈哈。
最后,
點贊、收藏、關(guān)注