MySQL-数据库监控初探
文章目錄
- 生猛干貨
- 官方文檔
- 監控指標
- 數據庫可用性監控
- 如何確認數據庫是否可以通過網絡連接?
- 如何確認數據庫是否可讀寫
- 如何監控數據庫的連接數 max_connections | Threads_connected
- 數據庫性能
- 如何計算QPS和TPS
- QPS
- TPS
- 并發數量監控 Threads_running
- Innodb的阻塞監控
- 搞定MySQL
生猛干貨
帶你搞定MySQL實戰,輕松對應海量業務處理及高并發需求,從容應對大場面試
官方文檔
https://dev.mysql.com/doc/
如果英文不好的話,可以參考 searchdoc 翻譯的中文版本
http://www.searchdoc.cn/rdbms/mysql/dev.mysql.com/doc/refman/5.7/en/index.com.coder114.cn.html
監控指標
先大體說下幾個點哈
-
對數據庫服務可用性進行監控
有一點需要注意的是,不能僅僅監控端口或者進程是否正常,要連接進去,執行一些SQL操作。
-
對數據庫性能進行監控
這一塊就比較多了, 比如QPS 和TPS的監控, 并發線程的監控 (不是數據庫的連接數)、 阻塞和死鎖監控 等等
-
對主從復制的監控
主從鏈路狀態 、 主從延遲 、 主從數據一致
-
對服務器資源的監控
磁盤空間、內存 、SWAP分區、網絡I/O 、CPU等等
接下來,展開探討一下
數據庫可用性監控
如何確認數據庫是否可以通過網絡連接?
MySQL本地的SQL文件能連接,并不意味著可以通過網絡連接,中間有好多東西隔著呢通常有幾種方式,選一種
-
mysqladmin -umonitor_user -p -h ping
-u 監控的用戶 -
telnet ip db_port
-
模擬應用程序使用網絡建立數據庫連接 (推薦)
如何確認數據庫是否可讀寫
-
檢查數據庫的read_only參數是否為off
比如從庫這個參數 建議關閉 ,主從切換后,這個參數就要打開,防止新的主不可寫。 -
建立監控表,并對表中數據進行更新
-
如果檢測是否可讀的話 ,執行 select @@version
如何監控數據庫的連接數 max_connections | Threads_connected
需要時刻關注DB連接數
-
show variables like ‘max_connections’ , 然后 show global status like ‘Threads_connected’
max_connections參數用來設置最大連接(用戶)數 , Threads_connected查看當前打開的連接的數量, 可以用這個兩個參數的比值超過閾值進行告警等。
數據庫性能
記錄性能監控中所采集到的數據庫的狀態
下面我們列舉下最常見的監控指標
如何計算QPS和TPS
QPS 并不是僅僅只select 的,而是數據庫處理所有SQL請求的。
QPS
公式 (采集兩次,通過差值獲取)
QPS=(Queries2 - Queries1) / (Uptime_since_flush_status2-Uptime_since_flush_status1)這些參數都可以通過show status 來獲取 如下
mysql> show global status like 'queries'; # 這個值時累加的; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Queries | 4820 | +---------------+-------+ 1 row in set (0.05 sec)mysql> show global status like 'uptime_since_flush_status'; +---------------------------+--------+ | Variable_name | Value | +---------------------------+--------+ | Uptime_since_flush_status | 536208 | +---------------------------+--------+ 1 row in set (0.03 sec)mysql>TPS
公式
TPS = ((com_insert2+com_update2+com_delete2)-(com_insert1+com_update1+com_delete1)/(uptime_since_flush_status2-uptime_since_flush_status1);同樣的 這些參數都可以通過show status 來獲取 如下
mysql> show global status like 'com_insert'; # 寫入事務的數量,這個值是累加的 +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Com_insert | 1038 | +---------------+-------+ 1 row in set (0.04 sec)mysql> show global status like 'com_update'; # 更新事務的數量,這個值是累加的 +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Com_update | 4 | +---------------+-------+ 1 row in set (0.00 sec)mysql> show global status like 'com_delete'; # 刪除事務的數量,這個值是累加的 +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Com_delete | 1 | +---------------+-------+ 1 row in set (0.00 sec)mysql> show global status like 'uptime_since_flush_status'; +---------------------------+--------+ | Variable_name | Value | +---------------------------+--------+ | Uptime_since_flush_status | 536404 | +---------------------------+--------+ 1 row in set (0.04 sec)mysql>并發數量監控 Threads_running
數據庫系統的性能會隨著并發處理請求數量的增加而下降;
并發的數量通常會遠小于同一時間連接到數據庫的線程數量。
獲取并發量
mysql> show global status like 'Threads_running'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | Threads_running | 2 | +-----------------+-------+ 1 row in set (0.04 sec)mysql>Innodb的阻塞監控
阻塞時間> 60秒的 SQL
SELECTb.trx_mysql_thread_id AS '被阻塞線程',b.trx_query AS '被阻塞Sql',c.trx_mysql_thread_id AS '阻塞線程',c.trx_query AS '阻塞Sql',(UNIX_TIMESTAMP() - UNIX_TIMESTAMP(c.trx_started)) AS '阻塞時間' FROMinformation_schema.INNODB_LOCK_WAITS AS a JOIN information_schema.INNODB_TRX AS b ON a.requesting_trx_id = b.trx_id JOIN information_schema.INNODB_TRX AS c ON a.blocking_trx_id = c.trx_id WHERE(UNIX_TIMESTAMP() - UNIX_TIMESTAMP(c.trx_started)) > 60;搞定MySQL
總結
以上是生活随笔為你收集整理的MySQL-数据库监控初探的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL-分库分表初探
- 下一篇: MySQL-主从复制监控