有一台预上线的服务器最近在做压力测试,也引发了一系列的相关问题,排查思路可以提供参考。

问题的起因就是收到同事提醒,根据监控报警提示,磁盘空间满了。上面有一个MySQL服务,现在已经写入不了数据了。

>>create table test(id int);

ERROR 14 (HY000): Can't change size of file (Errcode: 28 - No space left on device)

碰到这类问题,直观的思路就是查看分区下最大的文件,当然如果足够智能,也可以启用前几天提到的故障自愈的实现思路。

当我切换到日志目录的时候,我发现慢日志文件竟然有这么大,都是百G级别。

-rw-r----- 1 mysql mysql 302365433856 Nov 7 07:55 slowquery.log

当时也是为了尽快的释放慢日志文件的空间,所以先是选择了导出部分日志到本地,作为后续的分析所用,然后清理了这个日志文件。

系统层面是清理了文件,空间也可以通过du的方式看到是释放了,但是使用df -h的方式却不奏效,看起来是文件的句柄没有正确释放,在这种情况下,系统虽然释放了不少的空间,但是数据库层面还是写入不了数据的。

这种情况该怎么做,释放句柄最好的一种方式就是重启,但是显然这不是一个好的方法,有些简单暴力,有没有更好的方案呢,我们来看看满日志相关的参数。

>show variables like '%slow%';

+-----------------------------------+------------------------------------+

| Variable_name | Value |

+-----------------------------------+------------------------------------+

| log_slow_admin_statements | OFF |

| log_slow_filter | |

| log_slow_rate_limit | 1 |

| log_slow_rate_type | session |

| log_slow_slave_statements | OFF |

| log_slow_sp_statements | ON |

| log_slow_verbosity | |

| max_slowlog_files | 0 |

| max_slowlog_size | 0 |

| slow_launch_time | 2 |

| slow_query_log | OFF |

| slow_query_log_always_write_time | 10.000000 |

| slow_query_log_file | /data/mysql_4350/log/slowquery.log |

| slow_query_log_use_global_control | |

+-----------------------------------+------------------------------------+

这里我们可用的一个直接方式就是先关闭满日志,达到释放句柄的目的,然后再次重启开启。

想明白了,操作就很简单了。

>set global slow_query_log=off;

Query OK, 0 rows affected (6.54 sec)

>set global slow_query_log=on;

Query OK, 0 rows affected (0.00 sec)

很明显,磁盘空间释放了不少,对于慢日志的问题分析,其中里面有一个数据字典表存在大量的查询请求,添加了索引之后,该问题得到了有效控制。

# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda3 25G 5.5G 18G 24% /

tmpfs 31G 12K 31G 1% /dev/shm

/dev/sda1 190M 78M 103M 44% /boot

/dev/mapper/data-main

717G 400G 281G 59% /data

这个问题刚过一会,又收到报警说磁盘空间又满了,这次排除了慢日志的影响,发现是审计日志出了问题。

$ df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda3 25G 5.5G 18G 24% /

tmpfs 31G 12K 31G 1% /dev/shm

/dev/sda1 190M 78M 103M 44% /boot

/dev/mapper/data-main

717G 609G 72G 90% /data

这里需要说明的是,审计插件有几类比较流行的,这里用到的是Percona audit plugin,其实从性价比来说,这个插件的控制粒度还算比较粗,如果从控制的粒度来说,MariaDB Audit plugin要好很多,推荐使用。

审计日志有差不多600G,在这种高压测试之下,量级还是很大的,为了缓解问题,也是删除了600G的审计日志文件。

打开审计日志的参数选项:

>show variables like '%audit%';

+-----------------------------+---------------+

| Variable_name | Value |

+-----------------------------+---------------+

| audit_log_buffer_size | 1048576 |

| audit_log_exclude_accounts | |

| audit_log_exclude_commands | |

| audit_log_exclude_databases | |

| audit_log_file | audit.log |

| audit_log_flush | OFF |

| audit_log_format | OLD |

| audit_log_handler | FILE |

| audit_log_include_accounts | |

| audit_log_include_commands | |

| audit_log_include_databases | |

| audit_log_policy | ALL |

| audit_log_rotate_on_size | 0 |

| audit_log_rotations | 0 |

| audit_log_strategy | ASYNCHRONOUS |

| audit_log_syslog_facility | LOG_USER |

| audit_log_syslog_ident | percona-audit |

| audit_log_syslog_priority | LOG_INFO |

+-----------------------------+---------------+

18 rows in set (0.01 sec)

这里可以选的方式是修改审计日志的策略,比如我们从ALL修改为NONE,但是这种方式还是有些局限,因为没有生效。到了这个时候可供选择的方案就很少了,如果要释放句柄,我们可以简单先看看,比如通过lsof来查看未释放的句柄。

# lsof|grep delete

mysqld 3218 mysql 5u REG 253,0 26946 85458954 /data/mysql_4350/tmp/ib6i5l8w (deleted)

mysqld 3218 mysql 6u REG 253,0 0 85458955 /data/mysql_4350/tmp/ibzgbLJz (deleted)

mysqld 3218 mysql 7u REG 253,0 0 85458956 /data/mysql_4350/tmp/ibUZDalC (deleted)

mysqld 3218 mysql 8u REG 253,0 0 85458960 /data/mysql_4350/tmp/ibhdSF1K (deleted)

mysqld 3218 mysql 12u REG 253,0 0 85458961 /data/mysql_4350/tmp/ibo46oDR (deleted)

mysqld 3218 mysql 41w REG 253,0 635612876075 85460307 /data/mysql_4350/data/audit.log (deleted)

但是很明显这个进程就是MySQL服务的进程号,直接kill MySQL实在是太暴力了,而且这个测试还在进行中,为了避免不必要的解释和麻烦,我们也是不能重启数据库的。

# ps -ef|grep 3218

mysql 3218 2015 22 Oct31 ? 1-14:53:02 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql_4350/data --plugin-dir=/usr/local/mysql/lib/mysql/plugin --user=mysql --log-error=/data/mysql_4350/log/mysql.err --open-files-limit=16384 --pid-file=/data/mysql_4350/tmp/mysql.pid --socket=/data/mysql_4350/tmp/mysql.sock --port=4350

root 87186 86999 0 15:20 pts/0 00:00:00 grep 3218

这里有一个参数引起了我的注意,那就是audit_log_flush,有点类似于MySQL里面的flush logs的方式。通过触发这个参数就可以释放已有的句柄了。

>set global audit_log_flush=on;

Query OK, 0 rows affected (10.04 sec)

通过几轮问题分析和排查,日志类的问题总算得到了基本解决。

后续需要改进的就是对于审计日志的管理,目前做压力测试其实是可以关闭这一类的审计的。

而对于慢日志的分析也是重中之重,如果在极高的压力下,差不多1~2分钟会产生1G的慢日志,按照并发来看,这个值是很高的。所以在基本稳定了性能之后,慢日志的量级有了明显的变化。

mysql 故障处理_MySQL日志故障的处理和分析相关推荐

  1. mysql 分区表_MySQL 分区分表应用场景分析和分区中可能遇到的坑点

    MySQL的分区和分表应用场景分析 在日常工作中当我们的某张表的数据量过大的时候,首当其冲的可能就是进行分区和分表,但是是如何分区或者分表都要结合一点的业务场景下进行分析,才会显著的提升性能,来聊一聊 ...

  2. MySQL 慢查询日志导入 Elasticsearch 可视化查询分析

    当应用程序后台 SQL 查询慢的时候我们一般第一时间会查看数据库慢查询记录,但是慢查询记录是原始文本,直接查询搜索分析比较费时费力,虽然业界有针对 MySQL 慢查询分析的命令行工具(比如:pt-qu ...

  3. mysql案例_MySQL实例crash的案例详细分析

    [问题描述] 我们生产环境有一组集群的多台MySQL服务器(MySQL 5.6.21),不定期的会crash,但error log中只记录了重启信息,未记录crash时的堆栈: mysqld_safe ...

  4. mysql有多少种日志_MySQL到底有多少种日志类型必须我们记住的!

    MySQL中有六种日志文件,分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志(errorlog).慢查询日志(slow query log).一 ...

  5. mysql数据库binlog日志截断报错,导致mysql主从同步失败故障排查

    mysql数据库binlog日志截断报错,导致mysql主从同步失败故障排查 Got fatal error 1236 from master when reading data from binar ...

  6. mysql deadlock 记录_MySQL DeadLock故障排查全过程记录

    [作者] 刘博:携程技术保障中心数据库高级经理,主要关注Sql server和Mysql的运维和故障处理. [环境] 版本号:5.6.21 隔离级别:REPEATABLE READ [问题描述] 接到 ...

  7. 阿里云 mysql 日志_MySQL日志简介-阿里云开发者社区

    MySQL中的日志主要分为以下几种: 查询日志 慢查询日志 错误日志 二进制日志 中继日志 事务日志 说明: 支持本文实验使用的linux系统是CentOS7版本,使用的数据库是base源自带的Mar ...

  8. mysql查询日志分析_mysql日志分析

    日志文件(log)就是一个跟踪记录的列表,它可以协助我们时刻掌握系统及应用服务的动作状态,在故障排查的时候提供最详细准确地信息,帮助我们快速查找原因,减少我们凭主观的经验去猜测,这样的答案更具有说服力 ...

  9. mysql日志文件名称_MySQL 日志文件 说明

    MySQL 5.5 官方文档上有关日志的分类: By default, nologs are enabled. The following log-specific sections provide ...

最新文章

  1. 灰盒测试—数据库软件
  2. 【数字信号处理】基本序列 ( 正弦序列 | 数字角频率 ω | 模拟角频率 Ω | 数字频率 f | 模拟频率 f0 | 采样频率 Fs | 采样周期 T )
  3. 三层架构 || SpringMVC 和 Struts2 的优略分析
  4. 深度学习目标检测(YoloV5)项目——从0开始到项目落地部署
  5. VTK:vtkBorderWidget用法实战
  6. boost::fusion模块实现一个函数绑定器的测试程序
  7. C#语言基础——结构体和枚举类型
  8. android 控件方向旋转90度,android – 旋转视图层次90度
  9. Java基础学习总结(117)——Feign入门使用详解
  10. Android 自动轮播图+滑动效果
  11. 马什么梅?I什么N?浅谈 web 前端开发中的国际化
  12. VS 2010 与 VS 2008的区别
  13. 【Python机器学习及实践】实战篇:泰坦尼克号罹难乘客预测
  14. 2020年ubuntu安装QQ和微信和迅雷的正确姿势
  15. ABeam Insight | 女性科技系列(2):全球女性科技(FemTech)现状
  16. Exp4 恶意代码分析 20164323段钊阳
  17. 安装Matlab时用mathwork账户登陆时显示连接错误
  18. 人工神经网络连接权重的优化与调整
  19. 看电影学英语最时尚法则:“加减乘除”
  20. 【数据结构与算法】思维导图

热门文章

  1. php和python哪个工资高-python和php哪个更有前景
  2. python3入门教程-Python3 入门教程 简单但比较不错
  3. python requests下载文件很慢-python requests 下载大文件不完整
  4. python有相关的证书可以考吗-python后端开发工程师考证试题
  5. python免费课程讲解-Python零基础免费入门课程
  6. python怎么安装pandas模块-python如何导入安装pandas模块并使用别名
  7. Pycharm的项目文件名是红色的原因及解决办法
  8. Opengl-光照-基本光照-光照贴图(现在告别单调的方块弄个箱子)
  9. LeetCode Trips and Users(关联、分组,聚合)
  10. LeetCode Shortest Unsorted Continuous Subarray