mysql監(jiān)控屬于db監(jiān)控的模塊之一,包括采集、展示、監(jiān)控告警。本文主要介紹mysql監(jiān)控的主要指標(biāo)和采集方法。
Mysql監(jiān)控和Redis監(jiān)控的邏輯類似,可參考文章《Redis監(jiān)控》。
DBA前臺(tái)添加Mysql監(jiān)控時(shí)系統(tǒng)會(huì)調(diào)用自動(dòng)調(diào)度平臺(tái)接口將Mysql監(jiān)控的加密賬戶密碼和ip端口等信息發(fā)送至目標(biāo),同時(shí)發(fā)送采集Agent。
一、采集指標(biāo)和命令
1、Mysql服務(wù)運(yùn)行狀態(tài)
約定所有Mysql服務(wù)都必須以ip1(內(nèi)網(wǎng)ip)來(lái)綁定,每個(gè)機(jī)器只有一個(gè)ip1,可以有多個(gè)端口,即多個(gè)Mysql Server。采集程序讀取ip端口信息文件來(lái)判斷server是否存在。
sockParam=`ps?aux?|?grep?-P?"mysqld.*--port=${port}"?|?grep?-oP?"?--socket.*.sock"`? ?#?空則獲取不到該服務(wù)器端口mysql?socket配置,請(qǐng)檢查mysql配置是否正確 MYSQL="/usr/local/mysql/bin/mysql?-hlocalhost?--port=${port}?${sockParam}?-u${user}?-p${password}?" MYSQL_ADMIN="/usr/local/mysql/bin/mysqladmin?-hlocalhost?--port=${port}?${sockParam}?-u${user}?-p${password}?" curStatus=`${MYSQL}?-e"show?global?status"`?? ?#?空則是獲取不到該服務(wù)器mysql狀態(tài),請(qǐng)檢查mysql是否正常運(yùn)行 ?if?[?-z?"${curStatus}"?] ?then ????portExists=0else ????echo?"${curStatus}"?>>?${curFile} ????portExists=1
2、連接數(shù)
${MYSQL_ADMIN}?processlist?-v?|?wc?-l
3、線程數(shù)
grep?'Threads_connected'?${curFile}?|?awk?'{print?$2}'
4、慢查詢數(shù)
grep?'Slow_queries'?${curFile}?|?awk?-F?'?'?'{print?$2}'
需要計(jì)算兩次的慢查詢次數(shù)得到差值,等于最近1分鐘的慢查詢次數(shù)。上次數(shù)據(jù)保存在last.cache。
5、打開(kāi)表數(shù)
grep?'Open_tables'?${curFile}?|?awk?-F?'?'?'{print?$2}'
6、每秒執(zhí)行select數(shù)
grep?'Com_select'?${curFile}?|?awk?-F?'?'?'{print?$2}'
需要計(jì)算兩次的慢查詢次數(shù)得到差值除以時(shí)間差,等于最近1分鐘的執(zhí)行數(shù)量。上次數(shù)據(jù)保存在last.cache。
7、每秒執(zhí)行delete數(shù)
grep?'Com_delete'?${curFile}?|?grep?-v?'multi'?|?awk?-F?'?'?'{print?$2}'
需要計(jì)算兩次的慢查詢次數(shù)得到差值除以時(shí)間差,等于最近1分鐘的執(zhí)行數(shù)量。上次數(shù)據(jù)保存在last.cache。
8、每秒執(zhí)行insert數(shù)
grep?'Com_insert'?${curFile}?|?grep?-v?'select'?|?awk?-F?'?'?'{print?$2}'
需要計(jì)算兩次的慢查詢次數(shù)得到差值除以時(shí)間差,等于最近1分鐘的執(zhí)行數(shù)量。上次數(shù)據(jù)保存在last.cache。
9、每秒執(zhí)行update數(shù)
grep?'Com_update'?${curFile}?|?grep?-v?'multi'?|?awk?-F?'?'?'{print?$2}'
需要計(jì)算兩次的慢查詢次數(shù)得到差值除以時(shí)間差,等于最近1分鐘的執(zhí)行數(shù)量。上次數(shù)據(jù)保存在last.cache。
10、每秒鐘執(zhí)行replace數(shù)
grep?'Com_replace'?${curFile}?|?grep?-v?'select'?|?awk?-F?'?'?'{print?$2}'
需要計(jì)算兩次的慢查詢次數(shù)得到差值除以時(shí)間差,等于最近1分鐘的執(zhí)行數(shù)量。上次數(shù)據(jù)保存在last.cache。
11、每秒鐘執(zhí)行的 Innodb_rows_deleted
grep?'Innodb_rows_deleted'?${curFile}?|?awk?-F?'?'?'{print?$2}'
需要計(jì)算兩次的慢查詢次數(shù)得到差值除以時(shí)間差,等于最近1分鐘的執(zhí)行數(shù)量。上次數(shù)據(jù)保存在last.cache。
12、每秒鐘執(zhí)行的 Innodb_rows_inserted
grep?'Innodb_rows_inserted'?${curFile}?|?awk?-F?'?'?'{print?$2}'
需要計(jì)算兩次的慢查詢次數(shù)得到差值除以時(shí)間差,等于最近1分鐘的執(zhí)行數(shù)量。上次數(shù)據(jù)保存在last.cache。
13、每秒鐘執(zhí)行的 Innodb_rows_read
grep?'Innodb_rows_read'?${curFile}?|?awk?-F?'?'?'{print?$2}'
需要計(jì)算兩次的慢查詢次數(shù)得到差值除以時(shí)間差,等于最近1分鐘的執(zhí)行數(shù)量。上次數(shù)據(jù)保存在last.cache。
14、每秒鐘執(zhí)行的 Innodb_rows_updated
grep?'Innodb_rows_updated'?${curFile}?|?awk?-F?'?'?'{print?$2}'
需要計(jì)算兩次的慢查詢次數(shù)得到差值除以時(shí)間差,等于最近1分鐘的執(zhí)行數(shù)量。上次數(shù)據(jù)保存在last.cache。
15、每秒鐘執(zhí)行的?innodb rows total
expr?${innodbRowsDeletedPS}?+?${innodbRowsInsertedPS}?+?${innodbRowsReadPS}?+?${innodbRowsUpdatedPS}
等于前面四個(gè)Innodb_rows_*執(zhí)行次數(shù)的總和
16、每秒處理命令數(shù) qps
expr?${mysqlSelectNumPS}?+?${mysqlInsertNumPS}?+?${mysqlUpdateNumPS}?+?${mysqlDeleteNumPS}?+?${mysqlReplaceNumPS}
等于前面五個(gè)mysql命令Com_*的數(shù)量總和
17、每秒接收字節(jié)數(shù)?KByte/s
grep?'Bytes_received'?${curFile}?|?awk?-F?'?'?'{print?$2}'
需要計(jì)算兩次的慢查詢次數(shù)得到差值除以時(shí)間差,等于最近1分鐘的執(zhí)行數(shù)量,除以1024得到單位KByte/s。上次數(shù)據(jù)保存在last.cache。
18、每秒發(fā)送字節(jié)數(shù)
grep?'Bytes_sent'?${curFile}?|?awk?-F?'?'?'{print?$2}'
需要計(jì)算兩次的慢查詢次數(shù)得到差值除以時(shí)間差,等于最近1分鐘的執(zhí)行數(shù)量,除以1024得到單位KByte/s。上次數(shù)據(jù)保存在last.cache。
19、可立即獲得鎖的次數(shù)
grep?'Table_locks_immediate'?${curFile}?|?awk?-F?'?'?'{print?$2}'
需要計(jì)算兩次的慢查詢次數(shù)得到差值,等于最近1分鐘的可立即獲得鎖數(shù)量。上次數(shù)據(jù)保存在last.cache。
20、不可立即獲得鎖的次數(shù)
grep?'Table_locks_waited'?${curFile}?|?awk?-F?'?'?'{print?$2}'
需要計(jì)算兩次的慢查詢次數(shù)得到差值,等于最近1分鐘的不可立即獲得鎖數(shù)量。上次數(shù)據(jù)保存在last.cache。
21、一行鎖定需等待時(shí)間
grep?'Innodb_row_lock_waits'?${curFile}?|?awk?-F?'?'?'{print?$2}'
需要計(jì)算兩次的慢查詢次數(shù)得到差值,等于最近1分鐘的一行鎖定需等待時(shí)間。上次數(shù)據(jù)保存在last.cache。
22、?當(dāng)前臟頁(yè)數(shù)
grep?'Innodb_buffer_pool_pages_dirty'?${curFile}?|?awk?-F?'?'?'{print?$2}'
23、要求清空的緩沖池頁(yè)數(shù)
grep?'Innodb_buffer_pool_pages_flushed'?${curFile}?|?awk?-F?'?'?'{print?$2}'
需要計(jì)算兩次的慢查詢次數(shù)得到差值,等于最近1分鐘的要求清空的緩沖池頁(yè)數(shù)。上次數(shù)據(jù)保存在last.cache。
24、Innodb 寫入日志字節(jié)數(shù) KByte
grep?'Innodb_os_log_written'?${curFile}?|?awk?-F?'?'?'{print?$2}'
需要計(jì)算兩次的慢查詢次數(shù)得到差值,等于最近1分鐘的寫入日志字節(jié)數(shù),除以1024得到KByte。上次數(shù)據(jù)保存在last.cache。
25、占用內(nèi)存大小 MByte
pid=`ps?aux?|?grep?'mysqld'?|?grep?-Ev?'safe|grep'?|?awk?'{print?$2}'?` mem=`cat?/proc/${pid}/status?|?grep?'VmRSS'?|?awk?'{print?$2}'` mysqlMem=`echo?"scale=2;${mem}?/?1024"?|?bc`
除以1024得到MByte
26、handler socket每秒處理數(shù)
curHsTableLock=`grep?'Hs_table_lock'?${curFile}?|?awk?'{print?$2}'` preHsTableLock=`grep?'Hs_table_lock'?${preFile}?|?awk?'{print?$2}'`if?[?-n?"${curHsTableLock}"?]then ????hsQPS=`echo?"scale=0;(${curHsTableLock}?-?${preHsTableLock})?/?${intervalTime}"?|?bc`else ????hsQPS=0fi
27、主從同步和狀態(tài)
#主從信息 #是否為從服務(wù)器 slave_running=`grep?'Slave_running'?${curFile}?|?awk?'{print?$2}'`if?[?"${slave_running}A"?=?"ONA"?]then ????slaveRunning=1 ????slaveStatus=`${MYSQL}?-e'show?slave?statusG'`????echo?"${slaveStatus}"?>?${slaveFile} ???? ????slaveIoRunning=`grep?'Slave_IO_Running'?${slaveFile}?|?awk?-F?':'?'{print?$2}'` ????slaveSqlRunning=`grep?'Slave_SQL_Running'?${slaveFile}?|?awk?-F?':'?'{print?$2}'`???? ????if?[?"${slaveIoRunning}A"?==?"NoA"?-o?"${slaveSqlRunning}A"?==?"NoA"?]????then ????????slaveRunning=3 ????fi ???? ????secondsBehindMaster=`grep?'Seconds_Behind_Master'?${slaveFile}?|?awk?-F?':'?'{print?$2}'`???? ????if?[?"${secondsBehindMaster}A"?=?"NULLA"?]????then ????????secondsBehindMaster=8888???#?表示主從不同步 ????fi ????#是從庫(kù)時(shí)?獲取主庫(kù)ip ????master=`grep?'Master_Host'?${slaveFile}?|?awk?-F?':'?'{print?$2}'` ????masterPort=`grep?'Master_Port'?${slaveFile}?|?awk?-F?':'?'{print?$2}'`else ????master="" ????masterPort="" ????slaveRunning=0 ????secondsBehindMaster=10000???#?不用檢測(cè)fi
注:Seconds_Behind_Master,該值作為判斷主從延時(shí)的指標(biāo),那么它又是怎么得到這個(gè)值的呢,同時(shí),它為什么又受到很多人 的質(zhì)疑? (本段引用自?http://blog.chinaunix.NET/uid-27038861-id-3686311.html)
Seconds_Behind_Master是通過(guò)比較sql_thread執(zhí)行的event的timestamp和io_thread復(fù)制好的 event的timestamp(簡(jiǎn)寫為ts)進(jìn)行比較,而得到的這么一個(gè)差值。我們都知道的relay-log和主庫(kù)的bin-log里面的內(nèi)容完全一樣,在記錄sql語(yǔ)句的同時(shí)會(huì)被記錄上當(dāng)時(shí)的ts,所以比較參考的值來(lái)自于binlog,其實(shí)主從沒(méi)有必要與NTP進(jìn)行同步,也就是說(shuō)無(wú)需保證主從時(shí)鐘的 一致。你也會(huì)發(fā)現(xiàn),其實(shí)比較真正是發(fā)生在io_thread與sql_thread之間,而io_thread才真正與主庫(kù)有關(guān)聯(lián),于是,問(wèn)題就出來(lái)了, 當(dāng)主庫(kù)I/O負(fù)載很大或是網(wǎng)絡(luò)阻塞,io_thread不能及時(shí)復(fù)制binlog(沒(méi)有中斷,也在復(fù)制),而sql_thread一直都能跟上 io_thread的腳本,這時(shí)Seconds_Behind_Master的值是0,也就是我們認(rèn)為的無(wú)延時(shí),但是,實(shí)際上不是,你懂得。這也就是為什 么大家要批判用這個(gè)參數(shù)來(lái)監(jiān)控?cái)?shù)據(jù)庫(kù)是否發(fā)生延時(shí)不準(zhǔn)的原因,但是這個(gè)值并不是總是不準(zhǔn),如果當(dāng)io_thread與master網(wǎng)絡(luò)很好的情況下,那么 該值也是很有價(jià)值的。
之前,提到 Seconds_Behind_Master這個(gè)參數(shù)會(huì)有負(fù)值出現(xiàn),我們已經(jīng)知道該值是io_thread的最近跟新的ts與sql_thread執(zhí)行到 的ts差值,前者始終是大于后者的,唯一的肯能就是某個(gè)event的ts發(fā)生了錯(cuò)誤,比之前的小了,那么當(dāng)這種情況發(fā)生時(shí),負(fù)值出現(xiàn)就成為可能。
28、檢測(cè)采集Agent心跳情況
以上就是Mysql系列(十二)Mysql監(jiān)控操作的內(nèi)容,更多相關(guān)內(nèi)容請(qǐng)關(guān)注PHP中文網(wǎng)(www.php.cn)!