洞见 MySQL

简介

数据库作为业务的顶梁柱,左右着应用架构及应用性能,应用服务性能可以通过对服务本身横向伸缩来解决,但是数据库的性能决定了应用的最终命脉,MySQL 作为数据库之王,几乎运用在各行各业。随着业务增量,不规范的使用 SQL、大量慢查询会将应用拖垮,所以观测它显得尤为重要。

MySQL 集成

【 MySQL 集成文档】https://docs.guance.com/datakit/mysql/

MySQL 监控

主要从4个方面来全局查看 MySQL 相关指标信息

1.概览

2.活动用户信息

3.InnoDB

4.锁信息

概览

概览部分主要是对 连接数、QPS、TPS、异常连接数、每秒无索引 join 查下次数、Schema 大小分布、慢查询、锁等待时长等维度对 MySQL 进行概览分析。

活动用户信息

你关注过 MySQL connection 吗?先来看个 error

    MySQL: ERROR 1040: Too many connections

我们知道 MySQL 连接允许长连接和短连接,其自身建立连接的过程存在较大开销,所以一般会采用长连接。但使用长连接后可能会占用内存增多,因为 MySQL 在执行查询过程中临时使用内存管理连接对象,这些连接对象资源只有在连接断开时才会释放。如果长连接累计很多将导致内存占用加大而被系统强制 KILL 而发生 MySQL 服务异常重启的现象。

针对长连接的这种情况需要定期断开,可以通过判断连接所占用内存大小来推测是否为持久性的长连接。另外可以在每次执行较大的操作后执行 mysql_reset_connection 来重新初始化后连接资源。

MySQL 连接通常是一个用户请求一个连接,如果请求操作长时间没有执行完毕,会造成连接堆积,并迅速消耗数据库的连接数。也就是说如果数据库中有长时间没有执行完毕的 SQL,它会一直占用着连接并不释放。而在此时应用的请求会一直不断的涌入数据库,造成数据库连接数被快速用完。

在云原生、微服务背景下,对数据库的 Connection 要求越来越高,所以 MySQL Connection 也容易成为应用的瓶颈,Too many connections会导致 MySQL 所在机器 CPU 爆满,同时也会导致应用因无法获取更多的 Connection 而使业务中断。实时监控它,可以让我们快速的找到数据库瓶颈。甚至可以找到每一个用户 Connection 相关细节,比如当前用户 Connection 数以及累计 Connection 数。

同时我们也能够根据当前 Connection 对 MySQL 做出优化操作:

增加最大连接数

主从备份读写分离

业务拆分引入多个数据库实例

增减缓存减少查询

等等

InnoDB

通过配置 mysql.conf 中innodb=true 参数来开启 InnoDB 指标采集

锁信息

MySQL 慢查询

对于生产业务系统来说,慢查询也是一种故障和风险,一旦出现故障将会造成系统不可用影响到生产业务。当有大量慢查询并且 SQL 执行得越慢,消耗的 CPU 资源或 IO 资源也会越大,因此,要解决和避免这类故障,关注慢查询本身是关键。

目前有两种方式可以进行优化慢查询操作

1、通过开启slow log 慢查询日志,收集慢查询日志,人为对慢查询 SQL 执行 explain。

2、利用观测云 通过 MySQL 开启 dbm 采集数据库性能指标,同时会自动选取部分执行耗时较高的 SQL 语句,获取其执行计划,并采集实际执行过程中的各种性能指标。

MySQL slow log

广义慢查询

我们更多常见的都是狭义慢查询,即查询时间超过了既定的时间,比如默认超过 10s 没有返回结果的查询语句标记为慢查询。除了这个之外,有一些情况也是可能导致慢查询发生,所以也是可以标记为慢查询:

返回记录集比较大的。

频繁使用没有使用索引的查询

开启慢查询日志

以下配置是 MySQL 5.7 开启慢查询的方式

1 #### slow log  慢查询日志 ####

2 slow_query_log = 1 ## 开启慢查询日志

3 slow_query_log_file = /var/log/mysql/slow.log ## 慢查询日志文件名称

4 long_query_time = 2 ##sql 语句超过2s就记录

5 # min_examined_row_limit = 100 ## sql执行中examined_row 取出数据必须大于100行才会记录

6 #log-queries-not-using-indexes ## 没有使用索引SQL的sql记录到慢查询

7 log_throttle_queries_not_using_indexes = 5 ## 限制每分钟记录没有使用索引Sql的次数 意思就是:一条sql语句一直在记录 记录太多了 占存储 一分钟只记录5次

8 log-slow-admin-statements = table ##记录管理的操作,例如alter | analyze talbe 命令

9 log_output = file ## 记录慢查询日志的格式 FILE|TABLE|NONE 默认是文件格式 TABLE 是以表的格式 不建议用table

10 log_timestamps = 'system' ## 慢日志记录的时间格式 采用系统的时间

这里记录了TOP 100的慢查询语句,需要查看更多慢查询,可以在日志查看器查看更多日志信息

MySQL dbm

数据库性能指标主要来源于 MySQL 的内置数据库 performance_schema, 该数据库提供了一个能够在运行时获取服务器内部执行情况的方法。通过该数据库,DataKit 能够采集历史查询语句的各种指标统计和查询语句的执行计划,以及其他相关性能指标。采集的性能指标数据保存为日志,source 分别为 mysql_dbm_metric, mysql_dbm_sample和 mysql_dbm_activity。

通过开启 dbm 可以直接采集到数据库性能指标数据,采集器配置参考:【 MySQL】https://docs.guance.com/datakit/mysql/#performance-schema

1 [[inputs.mysql]]

2

3 # 开启数据库性能指标采集

4 dbm = true

5

6 ...

8 # 监控指标配置

9 [inputs.mysql.dbm_metric]  

10 enabled = true

11

 12 # 监控采样配置

13 [inputs.mysql.dbm_sample] 

14 enabled = true

15

16 # 等待事件采集

17 [inputs.mysql.dbm_activity] 

18 enabled = true 

19 ...

mysql_dbm_metric 视图

通过开启 dbm 采集上来的数据库性能指标,可以在视图上直观分析当前数据的性能:慢查询最大耗时、慢插入最大耗时、慢查询 SQL 执行次数、单条 SQL 最大执行次数(执行频率)、最长锁时间等。

在视图 【SQL 耗时 TOP 20 】,根据查询时间倒排序,取出前20条 慢查询的 SQL ,也可以通过调整里面的参数来展示自己需要的 TOP N。

mysql_dbm_activity 视图

通过构建mysql_dbm_activity 视图,可以观测到当前 正在执行的 SQL 数、事件类型分布(当前事件属于CPU事件还是 User sleep 事件等)、事件状态分布(比如:Sending data、Creating sort index等)、事件Command Type 分布(如当前是 Query 还是 sleep )以及事件列表。

事件类型分布

指的是 Processing SQL 的事件类型

CPU

User sleep

事件状态分布

即当前 Processing SQL 的状态类型分布情况,状态类型主要有如下几种:

init :初始执行

Sending data:正在发送数据

Creating sort index :正在创建排序索引

freeing items:释放当前项目

converting HEAP to MyISAM:将堆转换为MyISAM

query end:查询完成

Opening tables:正在打开表

statistics:统计

事件Command Type 分布

即当前 Processing SQL 的 Command Type 分布情况,主要有以下几种类型:

query : 查询,query 需要结合 事件状态一起分析

sleep:休眠,还没有被调度

daemon:以 daemon 方式运行

事件列表

事件 Top 100 ,即查询当前100条事件记录,包括事件id(processlist_id)、processlist_user(当前事件所属用户)、DB Host(事件主机)、SQL(执行事件语句)、process Host(事件发起主机)、事件类型、事件状态以及事件执行时间等。

根据 schema 来查看 process 事件走势

通过查看对应 schema 的事件走势,来分析当前 schema 的压力情况。

视图模板

[MySQL 监控视图]

[MySQL Activity]

[MySQL dbm Metric]

[MySQL 慢查询]

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容