首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL-数据库监控初探

MySQL-数据库监控初探

作者头像
小小工匠
发布2021-08-17 11:16:50
发布2021-08-17 11:16:50
1.3K00
代码可运行
举报
文章被收录于专栏:小工匠聊架构小工匠聊架构
运行总次数:0
代码可运行

官方文档

https://dev.mysql.com/doc/

如果英文不好的话,可以参考 searchdoc 翻译的中文版本

http://www.searchdoc.cn/rdbms/mysql/dev.mysql.com/doc/refman/5.7/en/index.com.coder114.cn.html


监控指标

先大体说下几个点哈

  • 对数据库服务可用性进行监控 有一点需要注意的是,不能仅仅监控端口或者进程是否正常,要连接进去,执行一些SQL操作。
  • 对数据库性能进行监控 这一块就比较多了, 比如QPS 和TPS的监控, 并发线程的监控 (不是数据库的连接数)、 阻塞和死锁监控 等等
  • 对主从复制的监控 主从链路状态 、 主从延迟 、 主从数据一致
  • 对服务器资源的监控 磁盘空间、内存 、SWAP分区、网络I/O 、CPU等等

接下来,展开探讨一下


数据库可用性监控

如何确认数据库是否可以通过网络连接?

代码语言:javascript
代码运行次数:0
运行
复制
MySQL本地的SQL文件能连接,并不意味着可以通过网络连接,中间有好多东西隔着呢 

通常有几种方式,选一种


如何确认数据库是否可读写


如何监控数据库的连接数 max_connections | Threads_connected

需要时刻关注DB连接数

  • show variables like ‘max_connections’ , 然后 show global status like ‘Threads_connected’ max_connections参数用来设置最大连接(用户)数 , Threads_connected查看当前打开的连接的数量, 可以用这个两个参数的比值超过阈值进行告警等。
代码语言:javascript
代码运行次数:0
运行
复制
mysql>  show variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 151   |
+-----------------+-------+
1 row in set (0.00 sec)

mysql> show global status like 'Threads_connected' ;
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_connected | 4     |
+-------------------+-------+
1 row in set (0.00 sec)

mysql> 
代码语言:javascript
代码运行次数:0
运行
复制
mysql>  show global status like 'Threads_running';   # 当前连接数 
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| Threads_running | 2     |
+-----------------+-------+
1 row in set (0.04 sec)

mysql> 

数据库性能

记录性能监控中所采集到的数据库的状态

下面我们列举下最常见的监控指标

如何计算QPS和TPS

QPS 并不是仅仅只select 的,而是数据库处理所有SQL请求的。

QPS

公式 (采集两次,通过差值获取)

代码语言:javascript
代码运行次数:0
运行
复制
QPS=(Queries2 - Queries1) / (Uptime_since_flush_status2-Uptime_since_flush_status1)

这些参数都可以通过show status 来获取 如下

代码语言:javascript
代码运行次数:0
运行
复制
mysql> show global status like 'queries'; # 这个值时累加的;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Queries       | 4820  |
+---------------+-------+
1 row in set (0.05 sec)

mysql> show global status like 'uptime_since_flush_status'; 
+---------------------------+--------+
| Variable_name             | Value  |
+---------------------------+--------+
| Uptime_since_flush_status | 536208 |
+---------------------------+--------+
1 row in set (0.03 sec)

mysql> 

TPS

公式

代码语言:javascript
代码运行次数:0
运行
复制
TPS = ((com_insert2+com_update2+com_delete2)-(com_insert1+com_update1+com_delete1)
                  /(uptime_since_flush_status2-uptime_since_flush_status1);

同样的 这些参数都可以通过show status 来获取 如下

代码语言:javascript
代码运行次数:0
运行
复制
mysql>  show global status like 'com_insert';   # 写入事务的数量,这个值是累加的
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_insert    | 1038  |
+---------------+-------+
1 row in set (0.04 sec)

mysql> show global status like 'com_update';   # 更新事务的数量,这个值是累加的
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_update    | 4     |
+---------------+-------+
1 row in set (0.00 sec)

mysql> show global status like 'com_delete';   # 删除事务的数量,这个值是累加的
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_delete    | 1     |
+---------------+-------+
1 row in set (0.00 sec)

mysql> show global status like 'uptime_since_flush_status'; 
+---------------------------+--------+
| Variable_name             | Value  |
+---------------------------+--------+
| Uptime_since_flush_status | 536404 |
+---------------------------+--------+
1 row in set (0.04 sec)

mysql> 

并发数量监控 Threads_running

数据库系统的性能会随着并发处理请求数量的增加而下降;

并发的数量通常会远小于同一时间连接到数据库的线程数量。

获取并发量

代码语言:javascript
代码运行次数:0
运行
复制
mysql>  show global status like 'Threads_running'; 
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| Threads_running | 2     |
+-----------------+-------+
1 row in set (0.04 sec)

mysql> 

Innodb的阻塞监控

阻塞时间> 60秒的 SQL

代码语言:javascript
代码运行次数:0
运行
复制
SELECT
	b.trx_mysql_thread_id AS '被阻塞线程',
	b.trx_query AS '被阻塞Sql',
	c.trx_mysql_thread_id AS '阻塞线程',
	c.trx_query AS '阻塞Sql',
	(
		UNIX_TIMESTAMP() - UNIX_TIMESTAMP(c.trx_started)
	) AS '阻塞时间'
FROM
	information_schema.INNODB_LOCK_WAITS AS a
JOIN information_schema.INNODB_TRX AS b ON a.requesting_trx_id = b.trx_id
JOIN information_schema.INNODB_TRX AS c ON a.blocking_trx_id = c.trx_id
WHERE
	(
		UNIX_TIMESTAMP() - UNIX_TIMESTAMP(c.trx_started)
	) > 60;  

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/02/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 官方文档
  • 监控指标
  • 数据库可用性监控
    • 如何确认数据库是否可以通过网络连接?
    • 如何确认数据库是否可读写
    • 如何监控数据库的连接数 max_connections | Threads_connected
  • 数据库性能
    • 如何计算QPS和TPS
      • QPS
      • TPS
    • 并发数量监控 Threads_running
    • Innodb的阻塞监控
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档