MySQL数据库运行状态数据的采集方法

日期: 2011-10-23 作者:mysqlops 来源:TechTarget中国 英文

  MySQL数据库服务实例的运行状态特征如何?各类运行指标在每个时间点如何?相信这是我们每一位DBA或数据库管理人员都想知道和关心的。另外,在不少公司因条件有限,而可能存在没有实施此工程,其实我们大家可以借助一些工具,比如Cacti、Mrtg等,大型互联网公司一般都有吸收开源软件的基础之上,再开发适合自己公司服务器管理的监控系统,一般都会采用Master-Agent,使用Agent调用shell脚本或其他语言编写脚本方式,我们今天就介绍一个简单经济且实用的方式,借助SHELL脚本实现MySQL数据库服务实例性能状态运行数据的采集。本文的重点先介绍我们一般需要采集那些状态数据,如何采集,如何分析,后续一篇MySQL数据库运行状态数据采集的脚本会介绍脚本如何使用,以及脚本代码内容等信息。

  状态数据项

  MySQL数据库系统提供了数据采集的命令:SHOW STATUS; 或者直接读取虚拟数据库informat_schema对象GLOBAL_STATUS(注:5.1及以上版本)的数据,我们队需要重点采集的数据进行一些类别划分。

  1) SQL语句执行量

  (1). Queries

  MySQL服务器执行的所有SQL语句次数,包过存储过程执行的SQL语句,但是不包含命令COM_PING 和COM_STATISTICS的执行次数;

  (2). Questions

  由客户端发送给服务器端执行的所有SQL语句次数,但是不包含存储过程执行的SQL语句,也不包含命令COM_PING 和COM_STATISTICS的执行次数;

  (3). Com_****统计

  Com_insert — 记录INSERT INTO TABLE tablename VALUES(…)…语句执行的次数;

  Com_insert_select — 记录INSERT INTO TABLE tablename SELECT …语句执行的次数;

  Com_delete — 记录DELETE [FROM] tablename…语句执行的次数;

  Com_delete_multi — 记录DELETE [FROM] tablename1,tablename2…语句执行的次数;

  Com_select — 记录SELECT …FROM tablename1…语句执行的次数;

  Com_update — 记录UPDATE tablename1 SET …语句执行的次数;

  Com_update_multi — 记录UPDATE tablename1,tabkename2 … SET …语句执行的次数;

  2) 查询缓存

  Qcache_hits — 查询语句命中查询缓存的次数;

  Qcache_inserts — 查询语句及记录集加入到查询缓存的数量;

  Qcache_lowmem_prunes — 因查询缓内存容量不足,而不得不从查询缓存中删除的缓存记录数;

  Qcache_not_cached — 从查询缓存中没有找到对应缓存SQL语句的SELECT查询语句数量;

  Qcache_queries_in_cache — 有多少查询语句正缓存在查询缓存中;

  3) MyISAM引擎

  Key_blocks_used — 索引缓存区内块使用量,通过记录历史数据可以找出内存块使用情况;

  Key_blocks_unused — 索引缓存区内存未使用的量,可以推断出有索引缓存区的使用率;

  Key_read_requests — 直接通过索引缓存区获得相应的数据,也即数据库逻辑读IO的量;

  Key_reads — 无法通过索引缓存区获得相应的数据,必须读文件系统或磁盘上的数据,也

  即数据库物理读的量;

  Key_write_requests —直接通过修改索引缓存区中的索引值的逻辑写IO量;

  Key_writes — 无法通过直接修改索引缓存区中的索引值完成,必须直接修改文件系统或磁

  盘上数据的物理写IO量;

  4) InnoDB引擎

  Innodb_buffer_pool_read_ahead_rnd — InnoDB引擎后台读线程随机性读而产生的IO数量,一般发生在扫描一个表数据,以随机性的方式;

  Innodb_buffer_pool_read_ahead_seq — InnoDB引擎后台读线程顺序读而产生的IO数量,一般发生在顺序全表扫描;

  Innodb_buffer_pool_read_requests — InnoDB引擎数据的逻辑读IO量;

  Innodb_buffer_pool_reads — InnoDB引擎数据的物理读IO量;

  Innodb_buffer_pool_wait_free — 当Innodb_buffer_pool中无可用的空闲内存块,且需要读或创建一个内存块,则需要刷新一页,再分配给需要的线程

  进行写操作,这个时候就会发生等待而计数。因为InnoDB引擎表的数据都都是在InnoDB内存缓存区中进行读写操作,

  然后由后台线程负责把数据写到磁盘上。

  Innodb_buffer_pool_write_requests — InnoDB引擎数据写向InnoDB_buffer_pool_size的逻辑写IO量;

  Innodb_rows_deleted — InnoDB引擎表数据被删除的行数;

  Innodb_rows_inserted — 向InnoDB引擎表增加的记录行数;

  Innodb_rows_updated — InnoDB引擎表数据被修改的行数;

  Innodb_rows_read — 读取InnoDB引擎表中数据的行数,UPDATE、DELETE、OPTIMIZE等会对数据表对象有数据读取的操作,都被计算在其内;

  5) 事务相关

  Com_commit — 支持事务的引擎,进行的事务提交次数;

  Com_rollback — 支持事务的引擎,进行的事务回滚次数;

  6) 临时表或文件

  Created_tmp_files — MySQL系统创建的临时文件数量总和,不包含显示创建的临时表,另外临时文件转换成临时表的话,则不一定一一对应,

  也不一定是三分之一的关系。若是系统隐患创建的临时表,则都是MyISAM格式的,所以会有三个临时文件;若是指定

  临时表存储引擎为heap,则是一个临时文件;

  Created_tmp_disk_tables — MySQL系统创建基于磁盘上的临时表数量,临时默认创建都是基于内存中,若是超过tmp_table_size或

  max_heap_table_size的大小,则会转化成基于磁盘的临时表;

  Created_tmp_tables — MySQL系统创建的不管基于磁盘的,还是基于内存的,该值都增加;

  7) 其他

  Bytes_sent — MySQL服务器端发送给客户端的字节数;

  Bytes_received — 所有客户端发送给MySQL服务器端的字节数;

  Slow_queries — SQL语句执行时间大于long_query_time值的数量;

  Sort_range — SQL语句使用范围排序的数量;

  Sort_rows — SQL语句引起数据排序的总行数;

  Sort_scan — 要进行数据排序而对表扫描的SQL执行次数;

  Aborted_connects — 客户端异常崩溃而没有正常关闭数据库连接线程的数量;

  Connections — 客户端尝试与MySQL服务器端建立连接的次数,失败的次数也算在其内;

  Uptime — mysqld服务进程运行的时长,单位秒;

  数据采集方式

  状态性能数据的采集,不管用何办法都是执行SHOW GLOBAL STATUS;然后再对需要的数据项,通过shell脚本的方式获得;

  或者

SELECT VARIABLE_NAME, VARIABLE_VALUE FROM information_schema. GLOBAL_STATUS WHERE VARIABLE_NAME IN (…);

  采集到的数据,我们还需要进行分类对待,一类数据项只为某个时间点的状态值,另外一类数据项为累计的值

  数据展示分析

  针对脚本程序自动采集的数据,作部分数据截图展示,以及把部分参数数据导成CVS格式,然后在Windows环境下绘制曲线图的方式,以便直观地对比分析,另外也可以自己开发一套程序或者借助其他绘图工具的方式绘制趋势图。

  针对采集的数据,对部分参数(三个参数:Com_update、Innodb_buffer_pool_reads、Innodb_buffer_pool_read_requests)做一个图形化分析的效果展示,我们可以通过SQL语句生成cvs格式的数据,比如针对Com_update数据每秒平均执行次数的数据导出SQL语句:

  SELECT M.CreateDate,M.total_num/N.total_num
  INTO OUTFILE ‘com_update.cvs’
  FROM performance_innodb M INNER JOIN
  (SELECT total_num,CreateDate FROM performance_innodb WHERE statu_item=’Uptime’ AND CreateDate>=’2011-10-12′ AND CreateDate<‘2011-10-13’ AND host_port=3308) N
  ON M.CreateDate=N.CreateDate
  WHERE host_port=3308 and statu_item=’Com_update’ and M.CreateDate>=’2011-10-12′ AND M.CreateDate<‘2011-10-13’;

  1) Performance_innodb表数据

  

点击放大

  2) Com_update数据曲线图

  

点击放大

  3) Innodb_buffer_pool_reads/Innodb_buffer_pool_read_requests曲线图

  

点击放大

  备注:

  MySQL数据库在跑热之后,且需要操作的业务数据基本都存储在内存中,为此InnoDB引擎表的物理IO读/每秒 相比InnoDB引擎表的逻辑IO读/每秒非常小,为此曲线图中看到几乎接近水平轴。

  总结

  数据库系统运行数据的采集和分析,可以帮助我们对系统制定一个性能数据的基准值,通过当下的数据和基准值对比,能够帮助我们发现系统可能存在的隐患;也可以帮助我们分析数据库系统何时将达到性能瓶颈,也提供一个了一个数据预测依据;若是再配合报警功能,则可以及时告诉我们数据库系统,可能存在问题的地方,而立即投入资源进行查证和分析,最后及时化解隐患。对存在数据库中的状态数据,必须进行一些数据分析结果进行图形化,以便自己和他人更加直观地看到,对说服他人非常有帮助。另外,从事DBA行业的技术人,应该培养自己对数据的敏感度,以及学会用数据佐证自己观点。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

作者

mysqlops
mysqlops

相关推荐