你真的了解 MySQL 数据库的运行状况吗?
2015年第三方市场调查机构 Evans 数据公司最近公布的一系列客户调查数据显示,在过去两年里,MySQL 在所有开发者使用的数据库中获得了25%的市场份额,Evans 公司的本次调查显示,数据库的使用者中有40%是开发人员,而两年前这一数据是32%。
此外 MySQL 越来越被企业级所接受,如今数据日益膨胀,应用越来越广泛,随之而来的 MySQL 性能分析,监控告警,集成可视化的讨论也越来越多了,还有利用各种工具对 MySQL 各指标数据进行分析的文章也曾出不穷,今天本文就几个需要注意的重点指标总结一下。
InnoDB 缓冲池
InnoDB 引擎在内存中有一个缓冲池用于缓存数据和索引,这有助于你更快地执行 MySQL 查询语句。选择合适的内存大小需要一些重要的决策并对系统的内存消耗有较多的认识,你需要考虑:
- 其它的进程需要消耗多少内存。这包括你的系统进程,页表,套接字缓冲。
- 你的服务器是否专门用于 MySQL 还是你运行着其它非常消耗内存的服务。
在一个专用的机器上,你可能会把 60-70% 的内存分配给 innodb_buffer_pool_size
,如果你打算在一个机器上运行更多的服务,你应该重新考虑专门用于 innodb_buffer_pool_size
的内存大小,此时需要关注一下几个指标,InnoDB 缓冲池可用页面的数量,使用了多少,总计多少,以及缓冲池的使用率。通过这些指标数据判断数据库的健康状况以及调节内存。
- mysql.innodb.buffer_pool_free
- mysql.innodb.buffer_pool_total
- mysql.innodb.buffer_pool_used
- mysql.innodb.buffer_pool_utilization
MySQL 进程数,最大连接数
threads_connected 当前客户端已连接的数量。这个值会少于预设的值,但你也会监控到这个值较大,它可保证客户端是处在活跃状态。如果 threads_connected == max_connections 时,数据库系统就不能提供更多的连接数了,这时,如果程序还想新建连接线程,数据库系统就会拒绝,如果程序没做过多的错误处理,就会出现报错信息。
threads_running 处于激活状态的线程的个数,如果数据库超负荷了,你将会得到一个正在(查询的语句持续)增长的数值。这个值也可以少于预先设定的值。这个值在很短的时间内超过限定值是没问题的。当 threads_running 值超过预设值时并且该值在5秒内没有回落时,要同时监视其他的一些值。
max_connections 当前服务器允许多少并发连接。MySQL 服务器允许有 SUPER 权限的用户在最大连接之外再建立一个连接。只有当执行 MySQL 请求的时候才会建立连接,执行完成后会关闭连接并被新的连接取代。
但要记住,过多的连接会导致内存的使用量过高并且会锁住你的 MySQL 服务器。一般小网站需要 100-200 的连接数,而较大可能需要 500-800 甚至更多。此值很大程度上取决于你 MySQL 的使用情况。一下指标表明服务器当前连接数以及最大连接数,
- mysql.threads_connected
- mysql.threads_running
- mysql.net.max_connections
MySQL 临时表和内存表
临时表可以使用任何存储引擎,临时表只在单个连接中可见,当连接断开时,临时表也会消失。MySQL 最初会将临时表创建在内存中,当数据变的太大后,就会转储到磁盘上。内存表是指用 MEMORY 引擎创建的表。表结构存在于磁盘,数据放在内存中。
如果起初在内存中创建的临时表变的太大,MySQL会自动将其转成磁盘上的临时表。内存中的临时表由 tmp_table_size
和 max_heap_table_size
两个参数决定,这与创建 MEMORY 引擎的表不同。MEMORY 引擎的表由 max_heap_table_size
参数决定表的大小,并且它不会转成到在磁盘上的格式。
每次创建临时表(包括内存上和磁盘上),created_tmp_tables
都会增加,如果是在磁盘上创建临时表(包括从内存上转成磁盘的),created_tmp_disk_tables
也会增加,created_tmp_files
表示 MySQL 服务创建的临时文件文件数,比较理想的配置是:
created_tmp_disk_tables / created_tmp_tables * 100% <= 25%
- mysql.performance.created_tmp_disk_tables
- mysql.performance.created_tmp_files
- mysql.performance.created_tmp_tables
MySQL 查询
数据库是很容易产生瓶颈的地方,其中最影响速度的就是那些查询非常慢的语句,这些慢查询语句,可能是写的不够合理或者是大数据下多表的联合查询等等,所以要重点监控找出这些语句并进行优化。
- mysql.performance.queries
- mysql.performance.questions
- mysql.performance.slow_queries
queries 由服务器执行的语句的数目,该变量包括存储程序中执行的语句,不像 questions 变量。它不包含 COM_PING 和 COM_STATISTICS 命令。这个变量添加近 MySQL 5.0.76版本中。
questions 由服务器执行的语句的数目,如在 MySQL 5.0.72版本,它包括由客户机发送到服务器的执行状态,不再包含存储程序中执行语句,不同于 queries 变量。这个变量不包含 COM_PING,COM_STATISTICS,COM_STMT_PREPARE,COM_STMT_CLOSE,和 COM_STMT_RESET 等命令。
queries 是一个全局性状态变量,而 questions 是一个会话,可以用来看看有多少会话通过当前连接发到服务器。queries 速度上升和下降都是正常的,它不是一个固定阈值的指标。但需要注意的是如果其数值发生急剧下降等突然变化,那就可能出现了严重问题。
slow_queries:查询时间超过 long_query_time 时间的数量,如何定义一个慢查询取决于数据库的使用情况和性能要求。但总之如果慢查询的数量很高,那你需要记录慢查询来定位数据库中的问题并进行调试。可以通过在你的 MySQL 配置文件中添加以下值来启用:
slow-query-log = 1
slow-query-log-file = /var/lib/mysql/mysql-slow.log
long_query_time = 1
第一个变量启用慢查询日志,第二个指定 MySQL 实际的日志文件存储位置。使用 long_query_time 来定义完成 MySQL 查询多少用时算长。
MySQL 的查询缓存
如果你有很多重复的查询并且数据不经常改变那建议使用缓存查询。人们经常不理解 query_cache_size
的实际含义而将它设置为 GB 级,但这样设置实际上会降低服务器的性能。
原因是在更新过程中线程需要锁定缓存。通常设置为 200-300 MB应该足够了。如果你的网站比较小的,你可以尝试给 64M 并在以后需要时及时增加。以下指标是查询缓存命中率,键缓存利用率:
- mysql.performance.qcache_hits
- mysql.performance.key_cache_utilization
MySQL 主从复制
说了那么多,还有一个很重要的 MySQL 主从复制,主从复制的好处不用多说:采用主从服务器这种架构,稳定性得以提升。如果主服务器发生故障,可以使用从服务器来提供服务。在主从服务器上分开处理用户的请求,可以提升数据处理效率。将主服务器上的数据复制到从服务器上,保护数据免受意外的损失等等。其连接状态可以通过下面命令查看:
mysql>SHOW SLAVE STATUS\G;
在 Master 与 Slave 之间完成一个异步的复制过程需要由三个线程来完成,其中两个线程( Sql 线程和 IO 线程)在 Slave 端,另外一个线程( IO 线程)在 Master 端。Slave_IO_Running
和 Slave_SQL_Running
两列的值都为 "Yes",这表明 Slave 的 I/O 和 SQL 线程都在正常运行,主从同步功能也就是正常的。
- mysql.replication.slave_io_running
- mysql.replication.slave_sql_running
- mysql.replication.last_io_errno
- mysql.replication.last_sql_errno
Cloud Insight 可视化监控
说了那么多 MySQL 查询,缓冲,连接数,内存表临时表,主从复制,现在回到主题上,你了解自己 MySQL 数据库的运行状况吗,现在有使用什么监控工具,是否可以实时可视化监控,是否需要专人来进行配置,是否可以内网部署监控,是否可以对每个指标设置报警策略?如果想体验拥有以上功能的监控工具,那必然要试试 Cloud Insight ,一定不会让您失望,它支持 MySQL 以上所有指标,更多指标参考 Cloud Insight MySQL 监控,其实也没什么大不了的功能,无非是:
- 安装上即可实时监控数据库指标数据
- 探针一键安装(大概14s),简单部署(有的只需复制一份配置文件)
- 支持内网部署
- 可针对每个指标设置报警策略
最后再贴个图,随意放几个指标数据:
好啦,说完了撤啦 Y(_)Y
参考文章:
Cloud Insight 集监控、管理、计算、协作、可视化于一身,帮助所有 IT 公司,减少在系统监控上的人力和时间成本投入,让运维工作更加高效、简单。想阅读更多技术文章,请访问 OneAPM 官方技术博客。
本文转自 OneAPM 官方博客
你真的了解 MySQL 数据库的运行状况吗?的更多相关文章
- mysql数据库之运行时其他报错
This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de 错误解决办法 这是我们开启了bin-log, ...
- liunx环境下安装mysql数据库
一:如果你的机器上之前安装有mysql数据库,先进行卸载 (1)需要先将它的文件删除 (2)同时注意删除老板本的etc/my.cnf文件和/etc/mysql目录,这两个文件控制的是mysql的一些配 ...
- ubuntu12.04:Mysql数据库:手动安装
首先到mysql的下载中心上下载最新的tar.gz包: 1.在浏览器中输入http://www.mysql.com/downloads/ 进入mysql的下载中心,在这里有使用mysql开发的一些工具 ...
- Windows环境安装MySQL数据库
Windows环境安装MySQL数据库 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 最近在学习Java语言,开发环境在Windows操作系统上,因此需要在Windows上安装My ...
- 使用Amanda ZRM备份远程MySQL数据库
本文写道最后的时候,我才发现ZRM for MySQL的一个致命问题,就我目前的理解和测试来看,它恢复数据的时候是采取覆盖的方式,举个例子,假定某台数据库服务器上有两个数据库test1,test2,你 ...
- MySQL数据库运维课程
MySQL数据库运维课程 http://www.dataguru.cn/article-4834-1.html?union_site=comm100 课程大纲 第一课:机器选型.系统规划 第二课:安装 ...
- idea启动项目连接mysql数据库后台报duplicate name异常
自己写的sql语句在MySQL数据库中运行是没有问题的 但是在使用idea启动项目的时候,后台在运行这行sql语句的时候居然报错了,duplicate name:重复的名字,最后自己经过思考,修改了一 ...
- ASP.NET Core中的运行状况检查
由卢克·莱瑟姆和格伦Condron ASP.NET Core提供了运行状况检查中间件和库,用于报告应用程序基础结构组件的运行状况. 运行状况检查由应用程序公开为HTTP终结点.可以为各种实时监视方案配 ...
- windows中配置安装mysql数据库
MySql 是一种免费的关系型数据库,相较于 MsSqlServer 和 Oracle 比较轻量化,安装也很简单,而且免费不需要的版权费用,个人认为一般的小项目采用还是比较合适的,当然也有部分数据量很 ...
随机推荐
- oracle13 触发器 变量
触发器 触发器是指隐含的执行的存储过程.当定义触发器时,必须要指定触发的事件和触发的操作,常用的触发事件包括insert,update,delete语句,而触发操作实际就是一个pl/sql块.可以 ...
- CentOS7添加第三方源
CentOS由于很追求稳定性,所以官方源中自带的软件不多,因而需要一些第三方源,比如EPEL.ATrpms.ELRepo.Nux Dextop.RepoForge等. EPEL EPEL即Extra ...
- Linux服务器常用性能监控命令汇总
1.ifconfig 网卡数目.ip地址.Mac地址.MTU大小 eth0 Link encap:Ethernet HWaddr 00:0d:3a:50:12:e9 inet addr:10.0.0. ...
- 让IE支持Css3属性(圆角、阴影、渐变)
>>>>>>>>>>>>>>>>>>>>>>>>> ...
- springmvc获得项目根目录(绝对路径)
原文:http://www.bubuko.com/infodetail-790547.html 在项目中有时候我们需要记录日志或者上传图片,需要知道项目的具体路径,如果项目中使用了spring,那么获 ...
- Java静态变量,常量,成员变量,局部变量
类变量(也叫静态变量)是类中独立于方法之外的变量,用static 修饰.(static表示“全局的”.“静态的”,用来修饰成员变量和成员方法,或静态代码块(静态代码块独立于类成员,jvm加载类时会执行 ...
- 使用DataContractJsonSerializer类将类型实例序列化为JSON字符串和反序列化为实例对象 分类: JSON 前端 2014-11-10 10:20 97人阅读 评论(1) 收藏
一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是"名值对"的集合.结构由大 ...
- .Net程序员学习Linux(一)
本次知识点:Linux系统的多终端切换,linux下的用户,linux远程访问工具使用,linux下重要的目录,命令的组成,通配符,linux的路径问题,文件操作的综合运用 为什么学习linux? 1 ...
- IIS7报错:如果要使用托管的处理程序,请安装 ASP.NET
转载至码农SeraphWU IIS7报错:如果要使用托管的处理程序,请安装 ASP.NET 进入CMD 输入如下命令即可 "%WINDIR%\Microsoft.NET\Framework\ ...
- [XML] C#ResourceManagerWrapper帮助类 (转载)
点击下载 ResourceManagerWrapper.rar /// <summary> /// 类说明:ResourceManagerWrapper /// 编 码 人:苏飞 /// ...