Mysql 监控

1. Mysql常见的监控项目

1.1 服务器状态

SHOW STATUS: 显示每个服务器变量的名字和值,默认会显示会话变量 SHOW GLOBAL STATUS: 显示全局变量 Connections,Max_used_Connections,Threads_connected: 跟踪尝试的连接 Aborted_clients,Aborted_connects: 退出的连接 Bytes_received,Bytes_sent: 网络流量 Slow_launch_threads,Threads_cached,Threads_created,Threads_running: 线程统计 Binlog_cache_use,Binlog_cache_disk_use: 显示了在二进制日志缓存中有多少事务被存储过,以及多少事务因超过二进制日志缓存而必须存储到一个临时文件中 Com_*: 统计了每种类型的SQL或C API命令发起过的次数 SHOW GLOBAL STATUS LIKE 'Created_tmp%': 查看创建临时表和文件的计数 SHOW GLOBAL STATUS LIKE 'Handler_%': 统计句柄操作 SHOW GLOBAL STATUS LIKE 'Qcache_%': 检查查询缓存 SHOW GLOBAL STATUS LIKE 'Select_%': 特定类型的SELECT查询的计数器. Select_range:在第一个表上扫描一个索引区间的链接数目. Select_scan:扫描整个第一张表的连接数目. Select_full_range_join/Select_range_check/Select_full_join SHOW GLOBAL STATUS LIKE 'Sort_%': 查看所有Sort变量 Table_locks_immediateTable_locks_waited: 有多少锁被立即授权,有多少锁需要等待

1.2 服务器监控

计数器 描述
查询缓存 SQL: show variables like '%Query_cache%'
Qchache_free_blocks 如果Qchache_free_blocks大致等于 Qchache_total_blocks/2, 说明碎片非常严重;如果Qchache_lowmen_prunes的值正在增加,并且有大量的自由块,意味着碎片导致查询正在被从缓存中永久删除
缓存碎片率 缓存碎片率 = Qchache_free_blocks/Qchache_total_blocks * 100%
缓存利用率 缓存利用率 = (query_cache_size - Qcache_free_memory) / query_cache_size * 100%
thread_cache_size 缓存在Cache中的线程数量, SQL: show variables like 'thread%'
DB已连接线程数 SQL: show status like '%Connections%'
当前连接线程状态 SQL: show status like '%thread%'
索引缓存大小 SQL: show variables like 'key_buffer_size'
连接缓存命中率 Threads_Cache_Hit 建议90%左右甚至更高, Threads_Cache_Hit = (Connections - Threads_created) / Connections * 100%
索引缓存未命中率 key_cache_miss_rate key_cache_miss_rate= Key_reads/Key_read_requests * 100%, SQL: show global status like 'key_red%',建议<0.1%
索引缓存命中率 key_buffer_read_hits=(1-Key_reads/Key_read_request) 100%,key_buffer_write_hits=(1-Key_writes/Key_write_request) 100% ,越大越好, SQL: show global status like 'key_%'
索引读取统计 Key_blocks_unused表示未使用的缓存簇(blocks)数, key_blocks_used表示曾经用到的最大的blocks数, 如果缓存都用到了, 要么增加key_buffer_size,要么就是过渡索引了, 把缓存沾满了. 比较理想的设置: Key_blocks_used/(Key_blocks_unused+key_blocks_used) * 100% ≈ 80%, SQL: show global status like 'key_blocks_u%'
允许的最大连接数 max_connections,SQL: show variables like 'max_connections', 一般来说500-800左右是一个比较合适的参考值
服务器响应的最大连接数 SQL: show global status like 'max_used_connections', 'max_used_connections'/'max_connections'<=85%
当前连接数 SQL: show global status like 'connections'
每个用户允许的最大连接数 max_user_connections, 是针对于单个用户的连接限制, 不常用
线程队列 SQL: show variables like 'back_log', 当无法请求响应时, 就让线程排队, 这个值就是队列长度,越小越好
max_connect_errors 默认值10, 如果受信账号错误连接次数达到10则自动阻塞, 需要flush hosts来解除
临时表 TmpTable SQL: show global status like 'created_tmp%', Created_tmp_disk_tables/Created_tmp_tables<25%
Mysql服务器对临时表的配置 SQL: show variables where Variable_name in ('tmp_table_size', 'max_heap_table_size'), 当临时表空间小于'max_heap_table_size'时,才能全放入内存
表扫描情况 SQL: show global status like 'handler_read%', show global status like 'com_select', 表扫描率=handler_read_rnd_nex/Com_select,如果表扫描率超过4000, 很有可能索引没有建好,增加read_buffer_size值会有一些好处

2. Mysql-Connector bug

问题触发条件

  • linux kernel 版本 3.6 及以前 包括(2.6.32 我们公司统一版本)
  • mysql-connector 5.1.31及以下版本
  • mysql-client没有设置socketTimeout
  • 杀死mysql-server与mysql-client连接处于mysql-server端的线程(dba会经常杀死慢查询) 问题影响
  • mysql-connector死循环, 表象机器load升高, 对外提供服务能力下降 相关bug描述
  • https://bugs.mysql.com/bug.php?id=73053
  • https://dev.mysql.com/doc/relnotes/connector-j/5.1/en/news-5-1-32.html 问题解决 强制要求
  • 检查所有项目, 所有项目升级到 mysql-connector 5.1.32及以上版本

results matching ""

    No results matching ""