当前位置: 首页 > news >正文

MySQL实战篇-MySQL 降配导致的实例宕机

问题描述

由于近期对服务器进行了降配,该mysql数据库会进行批量写入操作,直接导致实例宕机

查看错误日志:

2021-02-02T09:09:23.557505Z 0 [Note] InnoDB: page_cleaner: 1000ms intended loop took 16791ms. The settings might not be optimal. (flushed=3 and evicted=0, during the time.)
2021-02-02T09:10:30.951283Z 0 [Note] InnoDB: page_cleaner: 1000ms intended loop took 16096ms. The settings might not be optimal. (flushed=1 and evicted=0, during the time.)

宕机前会有如上的提示

解决方案

问题分析:
问题出在page_cleaner,那么这个page_cleaner是什么呢?

Innodb中page clean线程将脏数据写入到磁盘,脏数据写盘后相应的redo就可以覆盖,然后达到redo循环使用的目的,在5.7中参数可以开启多个page clean线程服务于多个innodb buffer实例。

实际上在内部实现中如果page clean线程为4个那么包含一个协调工作线程和三个工作线程,这个协调工作线程也要完成一部分工作。

步骤一的警告一般是IO能力不足,或者参数不够优化的结果。
其实也可以想象,CPU和内存同时进行了降配,应用不变,IO能力肯定会降低。

有了上面的基础我们知道这里应该做如下操作:

innodb_io_capacity 应该降低
innodb_max_dirty_pages_pct 应该降低
innodb_max_dirty_pages_pct_lwm 如果设置了应该考虑降低

降低的目的在于减少每次刷新的量,让每次刷新块数更加平均。从而避免page clean 线程爆发性的刷新脏数据库,从而堵塞IO通道。如果慢慢调整后还是不行则考虑IO确实扛不住了。

代码:

show variables  like '%innodb_io_capacity%';
show variables like '%innodb_max_dirty_pages_pct%';
show variables like '%innodb_max_dirty_pages_pct_lwm%';set global innodb_io_capacity = 100;
set global innodb_max_dirty_pages_pct = 50;
set global innodb_io_capacity_max = 1000;

测试记录

mysql> show variables  like '%innodb_io_capacity%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| innodb_io_capacity     | 200   |
| innodb_io_capacity_max | 2000  |
+------------------------+-------+
2 rows in set (0.00 sec)mysql> 
mysql> show variables like '%innodb_max_dirty_pages_pct%';
+--------------------------------+-----------+
| Variable_name                  | Value     |
+--------------------------------+-----------+
| innodb_max_dirty_pages_pct     | 75.000000 |
| innodb_max_dirty_pages_pct_lwm | 0.000000  |
+--------------------------------+-----------+
2 rows in set (0.00 sec)mysql> show variables like '%innodb_max_dirty_pages_pct_lwm%';
+--------------------------------+----------+
| Variable_name                  | Value    |
+--------------------------------+----------+
| innodb_max_dirty_pages_pct_lwm | 0.000000 |
+--------------------------------+----------+
1 row in set (0.02 sec)mysql> show variables like '%innodb_io_capacity_max%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| innodb_io_capacity_max | 2000  |
+------------------------+-------+
1 row in set (0.00 sec)mysql> set global innodb_io_capacity = 100; 
Query OK, 0 rows affected (0.00 sec)mysql> set global innodb_max_dirty_pages_pct = 50;
Query OK, 0 rows affected (0.00 sec)mysql> set global innodb_io_capacity_max = 1000;
Query OK, 0 rows affected (0.00 sec)

另外,这个库还存在一些其它的问题:
因为数据库是开发人员自己装的,很多值都是默认的,这个需要调整一下。
例如 最开始内存是8G,但是innodb_buffer_pool_size 居然是默认值128M,现在降配到4G,依旧是128M,可以调大此值。

另外此库开启慢查询,也一并开启。

# 默认只有128M,增加到1G
innodb_buffer_pool_size=1G# 开启慢日志
slow_query_log=1
slow_query_log_file=/var/lib/mysql/slowlog.log
long_query_time=2

反馈

调整参数后,mysql实例没有宕机了。
但是有几个报表的sql因为没有使用索引,导致mysql比较慢,优化了之后,这个问题得到了解决。

参考

MySQL 降配导致的实例crash_只是甲的博客-CSDN博客_mysql降配置

http://www.lryc.cn/news/8175.html

相关文章:

  • 时隔多年,这次我终于把动态代理的源码翻了个地儿朝天
  • 数据分析-深度学习 Tensorflow Day6
  • leaflet 设置多个marker,导出为一个geojson文件(066)
  • 企业与第三方供应商合作时,会存在哪些安全风险?
  • 技术源自洛克希德·马丁,光场XR眼镜FYR解析
  • 剑指 Offer 10- II. 青蛙跳台阶问题(LeetCode 70. 爬楼梯)(动态规划打表)
  • webpack(高级)--文件的压缩Terser(js/css/html) Tree Shaking
  • 做软文发布需要注意哪些细节?
  • 【Python】一篇文章读懂yield基本用法
  • Docker getting started
  • 【Uniapp使用遇到问题合集】
  • 宝塔面板破解最新教程
  • 基于zookeeper的Hadoop集群搭建详细步骤
  • 职称有哪些意义?如何提升职称?
  • mulesoft MCIA 破釜沉舟备考 2023.02.15.09
  • 【项目实战】@ConditionalOnProperty注解让我少写了一些if判断
  • SQL中的游标、异常处理、存储函数及总结
  • Splashtop:支持M1/M2芯片 Mac 电脑的远程控制软件
  • 实验十三、阻容耦合共射放大电路的频率响应
  • 【每天进步一点点】函数表达式和函数声明
  • JavaScript void
  • 笔记本电脑怎么连接无线网wifi?不同电脑系统的使用教程(2023最新)
  • 从lettcue插件看skywalking
  • explain 每个列的含义
  • 网络通信编程基础
  • Linux网络编程
  • ***httpGet,httpPost,postman_http,httpClientSocket,httpSocketServer***
  • Downie4.6.7
  • 重构是什么
  • (考研湖科大教书匠计算机网络)第四章网络层-第六节1:路由选择协议概述