mysql服務(wù)器自身沒有提供審計功能,但是我們可以使用init-connect + binlog的方法進行mysql的操作審計。由于mysql binlog記錄了所有對數(shù)據(jù)庫長生實際修改的sql語句,及其執(zhí)行時間,和connection_id但是卻沒有記錄connection_id對應的詳細用戶信息。在后期審計進行行為追蹤時,根據(jù)binlog記錄的行為及對應的connection-id 結(jié)合 之前連接日志記錄 進行分析,得出最后的結(jié)論。
專注于為中小企業(yè)提供網(wǎng)站設(shè)計制作、成都網(wǎng)站設(shè)計服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)撫順縣免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了成百上千企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。
1. 設(shè)置init-connect
1.1 創(chuàng)建用于存放連接日志的數(shù)據(jù)庫和表
create database accesslog;
CREATE TABLE accesslog.accesslog (`id` int(11) primary key auto_increment, `time` timestamp, `localname` varchar(30), `matchname` varchar(30))
1.2 創(chuàng)建用戶權(quán)限
可用現(xiàn)成的root用戶用于信息的讀取
grant select on accesslog.* to root;
如果存在具有to *.* 權(quán)限的用戶需要進行限制。
這里還需要注意用戶必須對accesslog表具有insert權(quán)限
grant select on accesslog.* to user@’%’;
1.3 設(shè)置init-connect
在[mysqld]下添加以下設(shè)置:
init-connect=’insertinto accesslog.accesslog(id, time, localname, matchname)
values(connection_id(),now(),user(),current_user());’
------注意user()和current_user()的區(qū)別
log-bin=xxx
這里必須開啟binlog
1.4 重啟數(shù)據(jù)庫生效
shell /etc/init.d/mysql restart
2. 記錄追蹤
2.1 thread_id確認
可以用以下語句定位語句執(zhí)行人
Tencent:~ # mysqlbinlog --start-datetime='2011-01-26 16:00:00'
--stop-datetime='2011-01-26 17:00:00' /var/lib/mysql/mysql-bin.000010
| grep -B 5 'wsj'
COMMIT/*!*/;
# at 767
#110126 16:16:43 server id 1 end_log_pos 872 Query thread_id=19 exec_time=0 error_code=0
use test/*!*/;
SET TIMESTAMP=1296029803/*!*/;
create table wsj(id int unsigned not null)
--
BEGIN
/*!*/;
# at 940
#110126 16:16:57 server id 1 end_log_pos 1033 Query thread_id=19 exec_time=0 error_code=0
SET TIMESTAMP=1296029817/*!*/;
insert into wsj(id) values (1)
--
BEGIN
/*!*/;
# at 1128
#110126 16:16:58 server id 1 end_log_pos 1221 Query thread_id=19 exec_time=0 error_code=0
SET TIMESTAMP=1296029818/*!*/;
insert into wsj(id) values (2)
2.2 用戶確認
thread_id 確認以后,找到元兇就只是一條sql語句的問題了。
mysql select * from accesslog where id=19;
+----+---------------------+---------------------+-----------+
| id | time | localname | matchname |
+----+---------------------+---------------------+-----------+
| 19 | 2011-01-26 16:15:54 | test@10.163.164.216 | test@% |
+----+---------------------+---------------------+-----------+
1 row in set (0.00 sec)
這個可以借助工具了,如mysql抓包工具 MySQL Sniffer
效果就是,訪問數(shù)據(jù)庫的來源ip,訪問的庫,表,sql這樣的,如下:
首先介紹下 pt-stalk,它是 Percona-Toolkit 工具包中的一個工具,說起 PT 工具包大家都不陌生,平時常用的 pt-query-digest、 pt-online-schema-change 等工具都是出自于這個工具包,這里就不多介紹了。
pt-stalk 的主要功能是在出現(xiàn)問題時收集 OS 及 MySQL 的診斷信息,這其中包括:
1. OS 層面的 CPU、IO、內(nèi)存、磁盤、網(wǎng)絡(luò)等信息;
2. MySQL 層面的行鎖等待、會話連接、主從復制,狀態(tài)參數(shù)等信息。
而且 pt-stalk 是一個 Shell腳本,對于我這種看不懂 perl 的人來說比較友好,腳本里面的監(jiān)控邏輯與監(jiān)控命令也可以拿來參考,用于構(gòu)建自己的監(jiān)控體系。
三、使用
接著我們來看下如何使用這個工具。
pt-stalk 通常以后臺服務(wù)形式監(jiān)控 MySQL 并等待觸發(fā)條件,當觸發(fā)條件時收集相關(guān)診斷數(shù)據(jù)。
觸發(fā)條件相關(guān)的參數(shù)有以下幾個:
function:
°?默認為 status,代表監(jiān)控 SHOW GLOBAL STATUS 的輸出;
°?也可以設(shè)置為 processlist,代表監(jiān)控 show processlist 的輸出;
variable:
°?默認為 Threads_running,代表 監(jiān)控參數(shù),根據(jù)上述監(jiān)控輸出指定具體的監(jiān)控項;
threshold:
°?默認為 25,代表 監(jiān)控閾值,監(jiān)控參數(shù)超過閾值,則滿足觸發(fā)條件;
°?監(jiān)控參數(shù)的值非數(shù)字時,需要配合 match 參數(shù)一起使用,如 processlist 的 state 列;
cycles:
°?默認為 5,表示連續(xù)觀察到五次滿足觸發(fā)條件時,才觸發(fā)收集;
連接參數(shù):host、password、port、socket。
其他一些重要參數(shù):
iterations:該參數(shù)指定 pt-stalk 在觸發(fā)收集幾次后退出,默認會一直運行。
run-time:觸發(fā)收集后,該參數(shù)指定收集多長時間的數(shù)據(jù),默認 30 秒。
sleep:該參數(shù)指定在觸發(fā)收集后,sleep 多久后繼續(xù)監(jiān)控,默認 300 秒。
interval:指定狀態(tài)參數(shù)的檢查頻率,判斷是否需要觸發(fā)收集,默認 1 秒。
dest:監(jiān)控數(shù)據(jù)存放路徑,默認為 /var/lib/pt-stalk。
retention-time :監(jiān)控數(shù)據(jù)保留時長,默認 30 天。
daemonize:以后臺服務(wù)運行,默認不開啟。
log:后臺運行日志,默認為 /var/log/pt-stalk.log。
collect:觸發(fā)發(fā)生時收集診斷數(shù)據(jù),默認開啟。
°?collect-gdb:收集 GDB 堆棧跟蹤,需要 gdb 工具。
°?collect-strace:收集跟蹤數(shù)據(jù),需要 strace 工具。
°?collect-tcpdump:收集 tcpdump 數(shù)據(jù),需要 tcpdump 工具。
不知你是不是指這個:
用慣了微軟的ms sql的事件探查器,一直也想在mysql中找到相應的這么一種工具:
修改my.cnf,在mysqld下添加log一行,
[mysqld]
log = /tmp/mysqld.sql
然后,重新啟動mysql,tail -f /tmp/mysqld.sql,就可以實時看到myql服務(wù)器當前正在執(zhí)行的語句了。
文章出處: