閱讀467 返回首頁    go 阿裏雲 go 技術社區[雲棲]


MySQL巡檢怎麼做

馬上要迎來長假,想想是不是有點小激動,但激動的同時也要了解一下MySQL服務器的狀態,以免在外旅遊時,沒準正和妹子...,突然來個報警,那內心的草泥馬恐怕要無限奔騰......

一、操作係統巡檢

如果有zabbix或者其他監控類型的工具,就方便很多。

首先看 CPU內存、硬盤io的消耗程度,其中重點是硬盤使用率,要為長假做好準備,避免廠家期間業務寫入增長,磁盤占滿。

每家業務不一樣,所以參考標準不一樣。 如果沒有zabbix,建議使用sar這個小工具,能夠收集曆史的信息,它的曆史數據在/var/log/sa下麵,通過 -f 來指定文件。

舉例:

1.1 cpu監控

[root@zst data]# sar -u 10 3
Linux 2.6.32-642.el6.x86_64 (zst) 09/22/2017 _x86_64_ (8 CPU)

10:26:44 AM  CPU %user %nice %system %iowait %steal %idle
10:26:54 AM  all 0.55  0.00  0.41    5.61    0.03   93.40

1.2 內存監控


[root@zst data]# sar -r 10 3
Linux 2.6.32-642.el6.x86_64 (zst) 09/22/2017 _x86_64_ (8 CPU)

10:28:36 AM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit
10:28:46 AM 223084    32658252  99.32    143468    16549080 18774068 37.81

1.3 I/O監控


[root@zst data]# sar -b 10 3
Linux 2.6.32-642.el6.x86_64 (zst) 09/22/2017 _x86_64_ (8 CPU)

10:30:25 AM       tps      rtps      wtps   bread/s   bwrtn/s
10:30:35 AM     67.17     61.63      5.54  16169.99     86.20

1.4 係統SWAP監控


[root@zst data]# sar -w 10 3
Linux 2.6.32-642.el6.x86_64 (zst)  09/22/2017   _x86_64_

10:31:56 AM    proc/s   cswch/s
10:32:06 AM      0.00   2234.44

當然,查看當前的磁盤和內存使用情況df -h,free -m,是否使用numa和swap,或是否頻繁交互信息等。當然,還有其他的監控項目,這裏就不一一贅述了。

除此之外,還需要關注日誌類信息,例如:


/var/log/messages
/var/log/dmesg

二、MySQL本身巡檢

MySQL本身的監控應該包含重點參數的檢查,MySQL狀態的檢查,除此以外還應該包含自增id的使用情況(小心因為自增id使用滿了 不能insert寫入從而引發報警哦),及主從健康狀態的巡檢。

2.1 重點參數


"innodb_buffer_pool_size"
"sync_binlog"
'binlog_format'
'innodb_flush_log_at_trx_commit'
'read_only': 
'log_slave_updates'
'innodb_io_capacity'
'query_cache_type'
'query_cache_size'
'max_connections'
'max_connect_errors'
'server_id'

2.2 MySQL的狀態

例如:每秒的tps、qps,提交了多少事務、回滾了多少事務、打開文件數、打開表數、連接數、innodb buffer使用率,及鎖等待等等。

首先,查看mysql狀態


mysql> show full processlis;
mysql> show global status;
mysql> show engine innodb status\G

show status中的一些狀態信息

1、wait事件


Innodb_buffer_pool_wait_free
Innodb_log_waits

2、MySQL鎖監控

表鎖
Table_locks_waited
Table_locks_immediate

行鎖
Innodb_row_lock_current_waits,當前等待鎖的行鎖數量
Innodb_row_lock_time,請求行鎖總耗時
Innodb_row_lock_time_avg,請求行鎖平均耗時
Innodb_row_lock_time_max,請求行鎖最久耗時
Innodb_row_lock_waits,行鎖發生次數

還可以定時收集INFORMATION_SCHEMA裏麵的信息:


INFORMATION_SCHEMA.INNODB_LOCKS; 
INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
臨時表/臨時文件
Created_tmp_disk_tables/Created_tmp_files

打開表/文件數
Open_files/Open_table_definitions/Open_tables

並發連接數
Threads_running /Threads_created/Threads_cached
Aborted_clients 
客戶端沒有正確關閉連接導致客戶端終止而中斷的連接數

Aborted_connects
試圖連接到mysql服務器而失敗的連接數

Binlog


Binlog_cache_disk_use 
使用臨時二進製日誌緩衝但超過 binlog_cache_size 值並使用臨時文件

Binlog_cache_use
使用臨時二進製日誌緩衝的事務數量

Binlog_stmt_cache_disk_use
當非事務語句使用二進製日誌緩存

Binlog_stmt_cache_use
使用二進製日誌緩衝非事務語句數量

鏈接數:


Connections 
試圖連接到(不管成不成功)mysql服務器的鏈接數

臨時表:


Created_tmp_disk_tables
服務器執行語句時,在硬盤上自動創建的臨時表的數量,是指在排序時,內存不夠用(tmp_table_size小於需要排序的結果集),所以需要創建基於磁盤的臨時表進行排序

Created_tmp_files
服務器執行語句時自動創建的內存中的臨時表的數量

索引:


Handler_commit 內部交語句

Handler_rollback 內部 rollback語句數量

Handler_read_first  索引第一條記錄被讀的次數,如果高,則它表明服務器正執行大量全索引掃描

Handler_read_key  根據索引讀一行的請求數,如果較高,說明查詢和表的索引正確

Handler_read_last 查詢讀索引最後一個索引鍵請求數

Handler_read_next 按照索引順序讀下一行的請求數

Handler_read_prev 按照索引順序讀前一行的請求數

Handler_read_rnd 根據固定位置讀一行的請求數,如果值較高,說明可能使用了大量需要mysql掃整個表的查詢或沒有正確使用索引

Handler_read_rnd_next 在數據文件中讀下一行的請求數,如果你正進行大量的表掃,該值會較高
Open_table_definitions 
被緩存的.frm文件數量

Opened_tables
已經打開的表的數量,如果較大,table_open_cache值可能太小

Open_tables
當前打開的表的數量
Queries
已經發送給服務器的查詢個數
Select_full_join 
沒有使用索引的聯接的數量,如果該值不為0,你應該仔細檢查表的所有

Select_scan
對第一個表進行完全掃的聯接的數量

Slow_queries 
查詢時間超過long_query_time秒的查詢個數

Sort_merge_passes
排序算法已經執行的合並的數量,如果值較大,增加sort_buffer_size大小

線程:


Threads_cached 線程緩存內的線程數量

Threads_connected 當前打開的連接數量

Threads_created 創建用來處理連接的線程數

Threads_running 激活的(非睡眠狀態)線程數

我寫了一個不成熟的小巡檢程序,僅巡檢MySQL的狀態和參數配置(因為客戶的環境不能直連linux但可以直連MySQL),有興趣的小夥伴可以看看。詳見:

https://github.com/enmotplinux/On-Site-Inspection

2.4 MySQL自增id的使用情況

mysql> SELECT table_schema,table_name,engine, Auto_increment
 FROM information_schema.tables where 
  INFORMATION_SCHEMA.TABLE_SCHEMA 
 not in ("INFORMATION_SCHEMA" ,"PERFORMANCE_SCHEMA", "MYSQL", "SYS")

2.5 存儲引擎是否為innodb


mysql> SELECT TABLE_SCHEMA,TABLE_NAME,ENGINE FROM 
 INFORMATION_SCHEMA.TABLES WHERE 
 ENGINE != 'innodb' AND 
 TABLE_SCHEMA NOT IN
  ("INFORMATION_SCHEMA" ,"PERFORMANCE_SCHEMA", "MYSQL", "SYS");

2.6 MySQL主從檢測


mysql> show slave status\G

2.6.1 主從狀態

主從狀態是否雙yes?

2.6.2 主從是否延遲


Master_Log_File == Relay_Master_Log_File 
&& Read_Master_Log_Pos == Exec_Master_Log_Pos

最後,同樣要檢查MySQL的日誌,提前發現潛在風險:

  • MySQL error log
  • MySQL 慢查詢日誌

三、高可用巡檢

3.1 MHA && keepalived

觀察日誌看是否有頻繁主從切換,如果有的話就分析一下是什麼原因導致頻繁切換?

3.2 中間件的巡檢 mycat && pproxysql

這些中間件的巡檢,首先參考係統巡檢,再看一下中間件本身的日誌類和狀態類信息,網絡延遲或丟包的檢查,也是必須要做工作。

四、總結

關於巡檢來說,每個環境都是不一樣的,所以巡檢的側重點也是不一樣的,但基本的巡檢步驟是避免不了的,如果有其他的巡檢姿勢也歡迎一起討論。

原文發布時間為:2017-09-27
本文作者:田帥萌
本文來自雲棲社區合作夥伴“老葉茶館”,了解相關信息可以關注“老葉茶館”微信公眾號

最後更新:2017-09-30 08:03:43

  上一篇:go  電子商務中的網上支付解決方案
  下一篇:go  讓聊天機器人同你聊得更帶勁 - 對話策略學習