MySQL巡检怎么做

Wesley13
• 阅读 814

导读

作者:田帅萌

知数堂MySQL DBA班第9期优秀学员,现任职知数堂助教

邮箱:tplinux@163.com,欢迎交流、拍转

马上要迎来长假,想想是不是有点小激动,但激动的同时也要了解一下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;

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;

可参考《老司机带你体验SYS库多种新玩法》这篇文章。

临时表/临时文件
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")

可参考《老司机带你体验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 

这些中间件的巡检,首先参考系统巡检,再看一下中间件本身的日志类和状态类信息,网络延迟或丢包的检查,也是必须要做工作。

四、总结

关于巡检来说,每个环境都是不一样的,所以巡检的侧重点也是不一样的,但基本的巡检步骤是避免不了的,如果有其他的巡检姿势也欢迎一起讨论。

扫码加入知数堂技术交流QQ群

(群号:****579036588)

群内可@各位助教了解更多课程信息

MySQL巡检怎么做


MySQL巡检怎么做 MySQL巡检怎么做 MySQL巡检怎么做 MySQL巡检怎么做

知数堂

叶金荣与吴炳锡联合打造

领跑IT精英培训

行业资深专家强强联合,倾心定制

MySQL实战/MySQL优化 / Python/ SQL优化

数门精品课程

紧随技术发展趋势,定期优化培训教案

融入大量生产案例,贴合企业一线需求

社群陪伴学习,一次报名,可学3期

DBA、开发工程师必修课

上千位学员已华丽转身,薪资翻番,职位提升

改变已悄然发生,你还在等什么?

本文分享自微信公众号 - 老叶茶馆(iMySQL_WX)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这