在MySQL的日常维护中,我们总会遇到这样或那样的问题,对于那些经常发生且有处理经验的事故,不论是新手还是老司机都能在故障规定的容错时间内解决。而对于那些不常见、比较棘手的问题,新手上路可能就显得举足无措了,这个时候新手和老司机的差距就体现出来了。从知识储备还是工作经验,可能老司机比新手强一点,但如果一个新司机没有日志排错的意识,不具备日志排错的经验,那怎么能学会弯道超车、漂移的快感。我们知道数据库中有很多重要的日志,如错误日志error log、慢日志slow log、二进制日志binary log、查询日志general log等等其他日志,错误日志error log是我们分析问题参考的依据,它记录数据库的启动/运行/停止的过程,包含了info、warning、error三个级别,分析error log也有助于我们了解数据库的运行机制。

我们知道数据库中的binary log、relay log都是数据库本身自带的purge清理线程处理过时的没有用的日志,这种处理能有效释放磁盘空间。而对于慢日志slow log、错误日志error log这种记录数据库实例整个运行阶段的日志,不会被定期处理,那么就有可能会被记录得过多,占据过多的磁盘空间。对于错误日志error log,默认记录;对于slow log需要我们自己选择是否记录。建议开启slow log功能,这对于数据库优化之一的SQL优化有很大的帮助。

通常我们在业务主库是开启慢日志功能并通过参数long_query_time这个参数来控制执行时间多长的SQL被记录进慢日志中,且对于执行时间超过1s的SQL就认为是慢SQL,这样的设定值,很多场合下不会记录太多的慢SQL,因而不会占据太多的磁盘空间。然而当开发上线的程序有问题,SQL执行效率不高,且执行的频率非常高,这些慢SQL被记录就会存在磁盘空间被撑爆的安全隐患,从而导致数据库宕机并尝试重启且多次尝试失败,严重影响业务。不过值得庆幸的是,该部分业务我们有MMM高可用架构,VIP已经漂移到另一台master上了。

2018-05-29 09:09:18 28094 [ERROR] Error writing file '/opt/app/mysql/logs/slow.log' (errno: 1 - No space left on device)

2018-05-29 09:09:18 28094 [ERROR] Error writing file '/opt/app/mysql/logs/slow.log' (errno: 1 - No space left on device)

180529 09:09:19 mysqld_safe mysqld restarted

InnoDB: 3 transaction(s) which must be rolled back or cleaned up

InnoDB: Starting in background the rollback of uncommitted transactions

/opt/app/mysql/bin/mysqld: Error writing file '/opt/app/mysql/logs/slow.log' (Errcode: 28 - No space left on device)

2018-05-29 09:09:33 33114 [ERROR] Could not open /opt/app/mysql/logs/slow.log for logging (error 28). Turning logging off for the whole duration of the MySQL server process. To turn it on again: fix the cause, shutdown the MySQL server and restart it.

2018-05-29 09:09:34 33114 [ERROR] /opt/app/mysql/bin/mysqld: Error writing file '/opt/app/mysql/tmp/mysqld.pid' (Errcode: 28 - No space left on device)

2018-05-29 09:09:34 33114 [ERROR] Can't start server: can't create PID file: No space left on device

如上面的报错显示(只是选择截取部分错误日志),数据库发生错误的原因是磁盘没有足够的空间,慢日志无法写入,数据库尝试restart并rollback没有提交的事务(继续查看后面的日志能看到redo log的信息),而数据库也对我们提出了建议关闭错误日志的记录功能。继续看启动过程,发现关于pid文件的No space left on device,数据库还是无法启动。排查故障并处理故障,在尽可能短的时间内恢复业务是最重要的,因而这里就没有详细的操作代码保存来说明。通过df -Th查看发现/空间不足,并ls -lh查看慢日志的大小是1.2T,已经严重消耗了磁盘空间。这个时候我们并不能直接rm -rf删除慢日志文件,因为数据库的启动时需要慢日志功能切且日志文件占据了磁盘空间,我们只能重定向清空慢日志,这样数据库得以重新启动。

虽然我们的业务主库有MMM高可用架构,事实发现VIP确实是漂移到另一台master上,但仍然给我们的其他slave造成了复制同步错误的故障,更为严重的是影响到了我们的多源复制库的使用,内部人员使用和维护也带来很大的影响。对于数据库本身来讲,error log和slow log不能自动清理,这有一定的优点,但同时也会有磁盘空间可能被撑爆的潜在危险。

如果能够通过一个crontab,或者一个告警,定期或者提醒我们对慢日志进行清理,我想也不会造成如今的这个麻烦。我们可以通过如下的一个Shell脚本,策略是删除几天以前的慢日志 ,保留最近几天的慢日志,或者使用过Inception工具的,可以将慢日志定期拉走,备份到远端。

[root@172-16-3-190 shells]# cat clean_mysql_slow_log.sh

#!/binbash

#author=lyx

#time:2018-05-29

cur_date=`date +%y%m%d`

#step_days=5 #clean slowlog 6 days ago

for step_days in $(seq 5 -1 0)

do

end_date=`expr $cur_date - $step_days`

clean_line_num=`cat /opt/shells/slow.log |grep -n "^# Time: $end_date"|head -n 1|cut -d : -f 1`

if ((${#clean_line_num} > 1))

then

clean_max_line_num=`expr $clean_line_num - 1`

sed -i "1,$clean_max_line_num d" /opt/shells/slow.log

break

fi

done

echo $clean_max_line_num

echo $step_days

该脚本的策略是根据当前时间,保留最近5天的慢日志,每次运行脚本则保留的日志天数减少一天。当然如果你有更好的业务策略或者脚本逻辑也可以择优选择,比如你可以根据慢日志的文件大小,配置告警并触发清理,或者crontab都可以。

[root@172-16-3-190 shells]# bash clean_mysql_slow_log.sh

1746208

5

[root@172-16-3-190 shells]# bash clean_mysql_slow_log.sh

1638936

4

[root@172-16-3-190 shells]# cp /opt/app/mysql_3309/logs/slow.log .

cp: overwrite `./slow.log'? y

[root@172-16-3-190 shells]# ls -lh slow.log

-rw-r----- 1 root root 844M May 29 18:24 slow.log

[root@172-16-3-190 shells]# bash clean_mysql_slow_log.sh

1746208

5

[root@172-16-3-190 shells]# ls -lh slow.log

-rw-r----- 1 root root 781M May 29 18:25 slow.log

[root@172-16-3-190 shells]# bash clean_mysql_slow_log.sh

1638936

4

[root@172-16-3-190 shells]# cat slow.log |head -n 1

# Time: 180525 0:00:00

[root@172-16-3-190 shells]# bash clean_mysql_slow_log.sh

4257796

3

[root@172-16-3-190 shells]# ls -lh slow.log

-rw-r----- 1 root root 571M May 29 18:26 slow.log

[root@172-16-3-190 shells]# cat slow.log |head -n 1

# Time: 180526 0:00:01

其实这是一个比较low的一个技术点,但是慢日志的清理很容易被我们忽略,很多时候开发不会随意上线,DBA也会对慢SQL进行把控并优化,然而当你半夜在睡觉,开发很晚上线一段有问题的代码,这个 时候的后果....,确实有些危险。慢日志功能是我们优化数据库的一个重要的参考,但也要注意慢日志文件的大小的增长速度,避免占据过多的磁盘空间。

mysql 错误日志 占用硬盘_MySQL慢日志占满磁盘空间导致业务主库宕机解决相关推荐

  1. oracle扩展归档空间大小,解决Oracle数据库归档日志占满磁盘空间问题

    1.常用命令 show parameter log_archive_dest; sql> archive log list; sql> select * from V$FLASH_RECO ...

  2. kubernetes 清理日志命令_Kubernetes之容器数据写满磁盘解决方法

    磁盘写满引发的后果 容器数据磁盘写满造成的后果: Pod 不能删除 (一直 Terminating) Pod 不能被创建 (一直 ContainerCreating) 磁盘写满分两种情况: 磁盘空间全 ...

  3. mysql主库宕机能写吗_MYSQL主主切换(主库宕机)_MySQL

    bitsCN.com MYSQL主主切换(主库宕机) 将主主(3307写--3308读)切换 前提:3307宕机 一.修改配置文件.命令行操作 vim /home/bbq/mysql/mysql-33 ...

  4. linux内存不足宕机,记一次linux机器内存占用太多导致的服务宕机

    背景 最近我们测试环境部署的一个项目总是不停的宕机,之前也有过,但是最近特别频繁 猜测 可能是因为cup或者内存占用太大导致的服务宕机 执行 1.登录linux服务器 2.top命令 下面是对每一行信 ...

  5. mysql 二进制日志 解析c++_mysql二进制日志文件恢复数据库

    二进制日志的文件的作用 mysql二进制日志文件用来记录所有用户对数据库操作,即记录用户对数据库操作的sql语句.如果有此文件,当数据库发生意外时,可以通过此文件查看到用户在此文件记录的时间段内用户所 ...

  6. mysql 二进制日志详解_Mysql二进制日志详解

    引言 注:图片取自网络 提一下比较重要的几个: 重做日志(Redo Log):重做日志是实现mysql事务的持久性的原理之一,当新增数据时,Redo Log会备份新数据,在事务提交前,只要持久化Red ...

  7. mysql配置日志老化配置_mysql中日志的配置与分析

    默认情况下,如果日志没有配置,则只记录错误日志,记录到syslog,配置文件 /etc/mysql/conf.d/mysqld_safe_syslog.cnf (ubuntu下) [mysqld_sa ...

  8. mysql二进制日志内容说明_MySQL二进制日志相关问题详细说明

    软件安装:装机软件必备包 SQL是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言.在使用它时,只需要发出& ...

  9. mysql日志文件名字_MySQL各类日志文件相关变量介绍

    文章转自:http://www.ywnds.com/?p=3721 查询所有日志的变量 1 mysql>show global variables like'%log%'; GLOBAL表示查全 ...

最新文章

  1. Framework启动过程浅析
  2. 万维网发布服务 w3svc 已停止 除非万维_W3C万维网联盟宣布停止发布HTML 5.3版
  3. linux启动顺序怎么修改,怎样修改启动顺序?
  4. 做了一个画f(x,y)=0函数图像的算法,果断codeplex之
  5. 190106每日一句
  6. paip.编程语言方法重载实现的原理及python,php,js中实现方法重载
  7. html自动登录网页,简单网页登陆代码html
  8. mac Python安装pybloomfilter 出现找不到libcrypto的问题
  9. 如何深入Delphi编程
  10. labview 写入mysql_LabVIEW 连接MySQL数据库
  11. 16. M601 低功耗测试
  12. OpenGL学习之路18---- 点光源
  13. handbrake中文版下载 | HandBrake(大菠萝视频格式转换器)官方中文版V1.3.3视频格式转换器哪个最好用
  14. ZCMU-1635- 超大型 LED 显示屏
  15. 程序自动修复相关工作总结
  16. 硬件工程师和软件工程师哪个更有前途?
  17. html保存到桌面的代码,H5创建webApp保存到桌面(代码教程)
  18. FL Studio(水果)里PC键盘如何弹奏音源?
  19. 三天打鱼两天晒网问题Java解法
  20. Excel怎么自动生成目录点击这个目录就可进入对应的工作表格

热门文章

  1. JAVA day07:代码作业(继承)
  2. 2019“欢乐春节”赴摩洛哥活动在拉巴特启幕
  3. 指静脉代码学习---5.ROI感兴趣区域提取/图像分割
  4. 公钥与私钥的使用方式
  5. 北航2018计算机学院录取名单,北航2018年拟录取硕士研究生名单公示3352
  6. 10个基于Java的CMS网站内容管理系统
  7. 【OpenMI】开放模型接口简介
  8. windows必备软件神器
  9. 微信小程序:趣味娱乐多流量主微信小程序源码下载趣味制作,藏头诗,隐藏图
  10. 将搜狗浏览器的收藏夹导入到IE