DB監控-mysql監控

来源:http://www.cnblogs.com/lxmhhy/archive/2016/11/06/6034609.html
-Advertisement-
Play Games

Mysql監控屬於DB監控的模塊之一,包括採集、展示、監控告警。本文主要介紹Mysql監控的主要指標和採集方法。 Mysql監控和Redis監控的邏輯類似,可參考文章《Redis監控》。 DBA前臺添加Mysql監控時系統會調用自動調度平臺介面將Mysql監控的加密賬戶密碼和ip埠等信息發送至目標 ...


  Mysql監控屬於DB監控的模塊之一,包括採集、展示、監控告警。本文主要介紹Mysql監控的主要指標和採集方法。

  Mysql監控和Redis監控的邏輯類似,可參考文章《Redis監控》。

  DBA前臺添加Mysql監控時系統會調用自動調度平臺介面將Mysql監控的加密賬戶密碼和ip埠等信息發送至目標,同時發送採集Agent。

  一、採集指標和命令

  1、Mysql服務運行狀態

約定所有Mysql服務都必須以ip1(內網ip)來綁定,每個機器只有一個ip1,可以有多個埠,即多個Mysql Server。採集程式讀取ip埠信息文件來判斷server是否存在。

sockParam=`ps aux | grep -P "mysqld.*--port=${port}" | grep -oP " --socket.*\.sock"`  # 空則獲取不到該伺服器埠mysql socket配置,請檢查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"`   # 空則是獲取不到該伺服器mysql狀態,請檢查mysql是否正常運行
if [ -z "${curStatus}" ]
then
    portExists=0
else
    echo "${curStatus}" >> ${curFile}
    portExists=1

  2、連接數

${MYSQL_ADMIN} processlist -v | wc -l

 

  3、線程數

grep 'Threads_connected' ${curFile} | awk '{print $2}'

  4、慢查詢數

grep 'Slow_queries' ${curFile} | awk -F ' ' '{print $2}'

需要計算兩次的慢查詢次數得到差值,等於最近1分鐘的慢查詢次數。上次數據保存在last.cache。

  5、打開表數

grep 'Open_tables' ${curFile} | awk -F ' ' '{print $2}'

  6、每秒執行select數

grep 'Com_select' ${curFile} | awk -F ' ' '{print $2}'

需要計算兩次的慢查詢次數得到差值除以時間差,等於最近1分鐘的執行數量。上次數據保存在last.cache。  

  7、每秒執行delete數

grep 'Com_delete' ${curFile} | grep -v 'multi' | awk -F ' ' '{print $2}'

需要計算兩次的慢查詢次數得到差值除以時間差,等於最近1分鐘的執行數量。上次數據保存在last.cache。

  8、每秒執行insert數

grep 'Com_insert' ${curFile} | grep -v 'select' | awk -F ' ' '{print $2}'

需要計算兩次的慢查詢次數得到差值除以時間差,等於最近1分鐘的執行數量。上次數據保存在last.cache。

  9、每秒執行update數

grep 'Com_update' ${curFile} | grep -v 'multi' | awk -F ' ' '{print $2}'

需要計算兩次的慢查詢次數得到差值除以時間差,等於最近1分鐘的執行數量。上次數據保存在last.cache。

  10、每秒鐘執行replace數

grep 'Com_replace' ${curFile} | grep -v 'select' | awk -F ' ' '{print $2}'

需要計算兩次的慢查詢次數得到差值除以時間差,等於最近1分鐘的執行數量。上次數據保存在last.cache。 

  11、每秒鐘執行的 Innodb_rows_deleted

grep 'Innodb_rows_deleted' ${curFile} | awk -F ' ' '{print $2}'

需要計算兩次的慢查詢次數得到差值除以時間差,等於最近1分鐘的執行數量。上次數據保存在last.cache。  

  12、每秒鐘執行的 Innodb_rows_inserted

grep 'Innodb_rows_inserted' ${curFile} | awk -F ' ' '{print $2}'

需要計算兩次的慢查詢次數得到差值除以時間差,等於最近1分鐘的執行數量。上次數據保存在last.cache。  

  13、每秒鐘執行的 Innodb_rows_read

grep 'Innodb_rows_read' ${curFile} | awk -F ' ' '{print $2}'

需要計算兩次的慢查詢次數得到差值除以時間差,等於最近1分鐘的執行數量。上次數據保存在last.cache。

  14、每秒鐘執行的 Innodb_rows_updated

grep 'Innodb_rows_updated' ${curFile} | awk -F ' ' '{print $2}'

需要計算兩次的慢查詢次數得到差值除以時間差,等於最近1分鐘的執行數量。上次數據保存在last.cache。

  15、每秒鐘執行的 innodb rows total

expr ${innodbRowsDeletedPS} + ${innodbRowsInsertedPS} + ${innodbRowsReadPS} + ${innodbRowsUpdatedPS}

等於前面四個Innodb_rows_*執行次數的總和

  16、每秒處理命令數 qps

expr ${mysqlSelectNumPS} + ${mysqlInsertNumPS} + ${mysqlUpdateNumPS} + ${mysqlDeleteNumPS} + ${mysqlReplaceNumPS}

等於前面五個mysql命令Com_*的數量總和

  17、每秒接收位元組數 KByte/s

grep 'Bytes_received' ${curFile} | awk -F ' ' '{print $2}'

需要計算兩次的慢查詢次數得到差值除以時間差,等於最近1分鐘的執行數量,除以1024得到單位KByte/s。上次數據保存在last.cache。

  18、每秒發送位元組數

grep 'Bytes_sent' ${curFile} | awk -F ' ' '{print $2}'

需要計算兩次的慢查詢次數得到差值除以時間差,等於最近1分鐘的執行數量,除以1024得到單位KByte/s。上次數據保存在last.cache。

  19、可立即獲得鎖的次數

grep 'Table_locks_immediate' ${curFile} | awk -F ' ' '{print $2}'

需要計算兩次的慢查詢次數得到差值,等於最近1分鐘的可立即獲得鎖數量。上次數據保存在last.cache。

  20、不可立即獲得鎖的次數

grep 'Table_locks_waited' ${curFile} | awk -F ' ' '{print $2}'

需要計算兩次的慢查詢次數得到差值,等於最近1分鐘的不可立即獲得鎖數量。上次數據保存在last.cache。

  21、一行鎖定需等待時間

grep 'Innodb_row_lock_waits' ${curFile} | awk -F ' ' '{print $2}'

需要計算兩次的慢查詢次數得到差值,等於最近1分鐘的一行鎖定需等待時間。上次數據保存在last.cache。

  22、 當前臟頁數

grep 'Innodb_buffer_pool_pages_dirty' ${curFile} | awk -F ' ' '{print $2}'

  23、要求清空的緩衝池頁數

grep 'Innodb_buffer_pool_pages_flushed' ${curFile} | awk -F ' ' '{print $2}'

需要計算兩次的慢查詢次數得到差值,等於最近1分鐘的要求清空的緩衝池頁數。上次數據保存在last.cache。

  24、Innodb 寫入日誌位元組數 KByte

grep 'Innodb_os_log_written' ${curFile} | awk -F ' ' '{print $2}'

需要計算兩次的慢查詢次數得到差值,等於最近1分鐘的寫入日誌位元組數,除以1024得到KByte。上次數據保存在last.cache。

  25、占用記憶體大小 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每秒處理數

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=0
fi

  27、主從同步和狀態

#主從信息
#是否為從伺服器
slave_running=`grep 'Slave_running' ${curFile} | awk '{print $2}'`
if [ "${slave_running}A" = "ONA" ]
then
    slaveRunning=1
    slaveStatus=`${MYSQL} -e'show slave status\G'`
    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

    #是從庫時 獲取主庫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   # 不用檢測
fi

註:Seconds_Behind_Master,該值作為判斷主從延時的指標,那麼它又是怎麼得到這個值的呢,同時,它為什麼又受到很多人 的質疑? (本段引用自 http://blog.chinaunix.net/uid-27038861-id-3686311.html)

Seconds_Behind_Master是通過比較sql_thread執行的event的timestamp和io_thread複製好的 event的timestamp(簡寫為ts)進行比較,而得到的這麼一個差值。我們都知道的relay-log和主庫的bin-log裡面的內容完全一樣,在記錄sql語句的同時會被記錄上當時的ts,所以比較參考的值來自於binlog,其實主從沒有必要與NTP進行同步,也就是說無需保證主從時鐘的 一致。你也會發現,其實比較真正是發生在io_thread與sql_thread之間,而io_thread才真正與主庫有關聯,於是,問題就出來了, 當主庫I/O負載很大或是網路阻塞,io_thread不能及時複製binlog(沒有中斷,也在複製),而sql_thread一直都能跟上 io_thread的腳本,這時Seconds_Behind_Master的值是0,也就是我們認為的無延時,但是,實際上不是,你懂得。這也就是為什 麽大家要批判用這個參數來監控資料庫是否發生延時不准的原因,但是這個值並不是總是不准,如果當io_thread與master網路很好的情況下,那麼 該值也是很有價值的。

之前,提到 Seconds_Behind_Master這個參數會有負值出現,我們已經知道該值是io_thread的最近跟新的ts與sql_thread執行到 的ts差值,前者始終是大於後者的,唯一的肯能就是某個event的ts發生了錯誤,比之前的小了,那麼當這種情況發生時,負值出現就成為可能。

  28、檢測採集Agent心跳情況

 

原創文章,轉載請備註原文地址  http://www.cnblogs.com/lxmhhy/p/6034609.html

知識交流討論請加qq:1130010617。謝謝合作。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 介紹 子分區其實是對每個分區表的每個分區進行再次分隔,目前只有RANGE和LIST分區的表可以再進行子分區,子分區只能是HASH或者KEY分區。子分區可以將原本的數據進行再次的分區劃分。 一、創建子分區 子分區由兩種創建方法,一種是不定義每個子分區子分區的名字和路徑由分區決定,二是定義每個子分區的分 ...
  • http://www.jxedt.com/wen/xuefei/3174969463387127833.html http://www.jxedt.com/wen/xuefei/3174969467804123151.html http://www.jxedt.com/wen/xuefei/3174 ...
  • 1.1 SVM 概念 支持向量機SVM是一種原創性(非組合)的具有明顯直觀幾何意義的分類演算法,具有較高的準確率。源於Vapnik和Chervonenkis關於統計學習的早期工作(1971年),第一篇有關論文由Boser、Guyon、Vapnik發表在1992年。思想直觀,但細節異常複雜,內容涉及凸分 ...
  • 將數據從MySQL遷移到Oracle的註意事項1.自動增長的數據類型處理MYSQL有自動增長的數據類型,插入記錄時不用操作此欄位,會自動獲得數據值。ORACLE沒有自動增長的數據類型,需要建立一個自動增長的序列號,插入記錄時要把序列號的下一個值賦於此欄位。CREATE SEQUENCE 序列號的名稱 ...
  • 公司的Riak版本是2.0.4,目前已根據CMDB三級業務部署了十幾套集群,大部分是跨機房部署。監控採集分為兩個大的維度,第一個維度是單機,也就是 「IP:埠」;第二個維度是集群,也就是所有節點指標的統計結果。本文主要介紹採集的指標和採集程式。 一、採集的指標 1、吞吐量指標 1.1 單機 採集方 ...
  • 1、通過SQL(結構化查詢語言)操作資料庫: DDL:數據定義語言,創建庫,創建表,選擇; DML:數據操作語言,完成數據增刪改; DQL:數據查詢語言,完成數據查詢; DCL:數據控制語言,授權、回收許可權;2、資料庫連接: mysql -uroot或者mysql -uroot -p密碼; SQL不 ...
  • 今天整理模型,用的 "Navicat Data Modeler”生成.sql,然後在mysql中執行,發現錯誤: [Err] 1215 - Cannot add foreign key constraint 開始以為是外鍵類型和長度等不一致,後來才發現主表用的是“MyISAM”換成 “innoDB”... ...
  • 介紹 KEY分區和HASH分區相似,但是KEY分區支持除text和BLOB之外的所有數據類型的分區,而HASH分區只支持數字分區,KEY分區不允許使用用戶自定義的表達式進行分區,KEY分區使用系統提供的HASH函數進行分區。當表中存在主鍵或者唯一鍵時,如果創建key分區時沒有指定欄位系統預設會首選主 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...