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