MySQL的監(jiān)控原理
MySQL的監(jiān)控通過日志文件來實(shí)現(xiàn)。
那么MySQL的日志文件有哪些類型呢? MySQL使用以下這幾種類型的日志來記錄服務(wù)器活動(dòng)信息。
- Error log錯(cuò)誤日志:關(guān)于啟動(dòng)、關(guān)閉和異常情況的診斷消息(排查錯(cuò)誤)
- General query log通用查詢?nèi)罩?服務(wù)器從客戶端接收到的所有語句(全局監(jiān)控)
- Slow query log慢速查詢?nèi)罩?執(zhí)行時(shí)間較長的查詢(性能優(yōu)化)
- Audit log審計(jì)日志:針對企業(yè)版的策略審計(jì)(主從搭配)
- Binary log二進(jìn)制日志:用于修改數(shù)據(jù)(備份用的到)
這5個(gè)類型的日志文件涵蓋了所有MySQL的運(yùn)行記錄,是將來排查問題,優(yōu)化性能的重要依據(jù)。很多經(jīng)驗(yàn)豐富的DBA遇到問題就是先從這些日志文件下手分析的。重點(diǎn)之重,要考的。
日志文件的特點(diǎn):占用大量的磁盤空間,存儲在文件中,也可以存儲在表中,但只有Slow query log慢速查詢?nèi)罩竞虶eneral query log通用查詢?nèi)罩臼强梢源鎯υ诒碇???梢杂梦谋靖袷綍鴮?,但Binary log二進(jìn)制日志除外。(因?yàn)锽inary log中都是二進(jìn)制格式啊!)
Error log錯(cuò)誤日志:設(shè)置文件名set- -log- Error =filename來記錄錯(cuò)誤到給定的文件?;蛘咴? UNIX或基于UNIX的系統(tǒng)中使用- -log-syslog服務(wù)器選項(xiàng)將錯(cuò)誤消息發(fā)送到syslog系統(tǒng)日志上。
General query log通用查詢?nèi)罩?設(shè)置文件名set- -general_log_file=filename為日志查詢。全局general_log和general_log_file服務(wù)器變量提供了對通用查詢?nèi)罩镜倪\(yùn)行時(shí)控制。將general_log設(shè)置為0(或OFF)以禁用日志,或設(shè)置為1(或ON)以啟用日志。
Slow query log慢速查詢?nèi)罩?設(shè)置文件名set- -slow_query_log_file=filename以提供對慢速查詢?nèi)罩镜倪\(yùn)行時(shí)控制。設(shè)置slow_query_log為0禁用日志,設(shè)置為1啟用日志,如果日志文件已經(jīng)打開,則關(guān)閉該日志文件并打開新文件。
Binary log二進(jìn)制日志:設(shè)置Set --log-bin以啟用二進(jìn)制日志記錄。
服務(wù)器使用該選項(xiàng)值作為基本名稱,在創(chuàng)建新日志文件時(shí)向基本名稱添加一個(gè)遞增的連續(xù)數(shù)字后綴。這些日志文件以二進(jìn)制格式而不是文本格式存儲。
Audit log審計(jì)日志:審計(jì)日志作為Enterprise Edition插件提供,當(dāng)加載時(shí),您可以使用該插件將事件記錄到audit_log_file選項(xiàng)指定的文件中。審計(jì)不斷寫入審計(jì)日志,直到您刪除插件,或者使用audit_log_policy=NONE選項(xiàng)設(shè)置關(guān)閉審計(jì)。通過在服務(wù)器啟動(dòng)時(shí)使用audit_log=FORCE_PLUS_PERMANENT作為選項(xiàng)來防止刪除插件。
接下來我們逐個(gè)講解
General query log通用查詢?nèi)罩究梢允褂胓eneral_log服務(wù)器選項(xiàng)啟用,它是用來記錄所執(zhí)行語句的連接信息和詳細(xì)信息。包括記錄每個(gè)連接的時(shí)間和類型以及所有操作的進(jìn)程ID,記錄對所有表執(zhí)行的所有語句,但不包括存儲在二進(jìn)制日志的更新操作行變化,因?yàn)檫@些不是更新操作以語句形式被存儲的。而且General query log通用查詢?nèi)罩緮U(kuò)張的很快,但是如果以一個(gè)短時(shí)間內(nèi)啟用它,可以收集這些時(shí)間內(nèi)所有活動(dòng)的完整記錄。
具體記錄了些什么,我們在此舉例說明,請看下面:
- 1424 Query /* mem dbpool.default */ update
- `mem__events`.events set lastUpdateTime=1397633565708 where id=7 1429 Query /* mem dbpool.default */ update `mem__events`.events set lastUpdateTime=1397633565708 where id=4970 1424 Query /* mem dbpool.default */ commit 1429 Query /* mem dbpool.default */ commit 150526 7:32:46 1434 Connect root@localhost on mysql 1434 Query SET NAMES latin1 1434 Query SET character_set_results = NULL
里面包含事件類型和查詢內(nèi)容,示例類型:查詢、連接。
上面代碼顯示每個(gè)連接和查詢的詳細(xì)信息,記錄每次連接的時(shí)間和所有操作的進(jìn)程號。
Slow query log慢速查詢?nèi)罩究梢酝ㄟ^使用slow_query_log服務(wù)器選項(xiàng)啟用。用于記錄執(zhí)行時(shí)間超過指定閾值的語句。一般設(shè)定10秒(默認(rèn)),可以使用long_query_time server選項(xiàng)更改此持續(xù)時(shí)間??梢灾付ㄎ⒚刖鹊拿霐?shù)??梢杂涗洸皇褂盟饕恼Z句,甚至是long_query_time下面的語句。比如用log_queries_not_using_indexes來實(shí)現(xiàn)??梢允褂胢ysqldumpslow命令行程序查看Slow query log慢速查詢?nèi)罩尽?/p>
Slow query log慢速查詢?nèi)罩臼怯涗浌芾砗蛷?fù)制語句。但默認(rèn)情況下,慢速查詢?nèi)罩静挥涗浌芾碚Z句??梢酝ㄟ^啟用log_slow_admin_statements服務(wù)器選項(xiàng)來記錄這些語句。默認(rèn)情況下,從復(fù)制主機(jī)復(fù)制的語句不會出現(xiàn)在慢速查詢?nèi)罩局?,即使它們超過了long_query_time服務(wù)器選項(xiàng)指定的時(shí)間。此時(shí)可以要記錄這些語句,請啟用log_slow_slave_statements服務(wù)器選項(xiàng)來實(shí)現(xiàn)。
如何過濾慢速查詢?nèi)罩臼录?這有兩個(gè)額外的服務(wù)器選項(xiàng),您可以使用來過濾緩慢的查詢?nèi)罩据敵?
第一個(gè)min_examined_row_limit:指定語句必須檢查的最低行數(shù),以便慢速查詢?nèi)罩居涗浽撜Z句。
第二個(gè)log_throttle_queries_not_using_indexes:它指定慢速查詢在60秒內(nèi)記錄的查詢數(shù)量,因?yàn)樗鼈儾皇褂盟饕?。慢速查詢?nèi)罩居涗浟诉@些查詢的數(shù)量后,它匯總了在該時(shí)間段內(nèi)花費(fèi)在其余語句上的數(shù)量和總時(shí)間。默認(rèn)情況下,該服務(wù)器選項(xiàng)的值為0,表示它記錄所有此類查詢。
舉例說明:
- # Time: date-and-time # User@Host: root[root] @ localhost [127.0.0.1] Id: 7694 # Query_time: 1.010099 Lock_time: 0.000023 Rows_sent: 0 Rows_examined: 1 SET timestamp=timestamp; /* mem dbpool.default */ update `mem__inventory`.`MysqlServer` set `timestamp`=timestamp where hid=x'08310BA6528CBF5783BBD95CE5B4561F';
例子包括服務(wù)器日期和時(shí)間,連接和查詢信息,運(yùn)行查詢和持有鎖的時(shí)間。
我們使用mysqldumpslow查看慢速查詢?nèi)罩?,mysqldumpslow命令行程序總結(jié)了慢速查詢?nèi)罩镜膬?nèi)容。它將類似的查詢分組在一起,例如將數(shù)值參數(shù)更改為N,將字符串參數(shù)更改為'S',顯示此類查詢的數(shù)量以及運(yùn)行查詢所需的平均時(shí)間和總時(shí)間。使用-g選項(xiàng)提供一個(gè)搜索詞,僅顯示匹配搜索項(xiàng)的語句的摘要信息。也可以通過設(shè)定log_output服務(wù)器選項(xiàng)來指定表或文件日志輸出。。
log_output服務(wù)器選項(xiàng)是用來配置慢速查詢?nèi)罩竞屯ㄓ貌樵內(nèi)罩?。它包含一個(gè)或多個(gè)FILE、TABLE或NONE值(以逗號分隔)。默認(rèn)情況下,它的值為FILE。NONE代表日志既不寫文件,也不寫表。NONE的存在會導(dǎo)致忽略FILE或TABLE。FILE表示日志分別寫入由slow_query_log_file和general_log_file MySQL服務(wù)器選項(xiàng)指定的文件。在MySQL數(shù)據(jù)目錄文件中的缺省值為hostname-slow.log和hostname.log。TABLE表示在mysql數(shù)據(jù)庫中,慢速查詢?nèi)罩緦懙絪low_log表,常規(guī)日志寫到general_log表。
隨著時(shí)間的推移,日志文件會占用更大的空間。定期備份和刪除舊的日志文件,并重新記錄到新的日志文件是DBA的日常工作之一。注意,如果使用二進(jìn)制日志進(jìn)行復(fù)制,請謹(jǐn)慎使用。備份后,刷新日志。刷新日志需要注意
1. 創(chuàng)建新的二進(jìn)制日志文件
2. 關(guān)閉并重新打開常規(guī)和慢速查詢?nèi)罩疚募?。在?chuàng)建新日志時(shí),必須在刷新之前重命名當(dāng)前日志文件。
可以創(chuàng)建自己的腳本或使用提供的mysql-log-rotate腳本來實(shí)現(xiàn)定期安排日志文件的循環(huán)。備份日志文件后,刷新日志以強(qiáng)制MySQL服務(wù)器開始寫入新的日志文件??梢酝ㄟ^執(zhí)行FLUSH LOGS SQL語句或執(zhí)行mysqladmin flush-logs來實(shí)現(xiàn)。在刷新二進(jìn)制日志會導(dǎo)致二進(jìn)制日志記錄順序中的下一個(gè)文件重新開始。刷新普通和慢速查詢?nèi)罩緯r(shí),這將關(guān)閉日志文件,重新打開它們,然后在相同的文件名下重新進(jìn)行日志記錄,要啟動(dòng)新的日志,請?jiān)谒⑿轮爸孛F(xiàn)有的日志文件。