故障分析 | MySQL 备份文件静默损坏一例分析
mysql 故障 分析 损坏 备份文件 一例 静默
2023-06-13 09:17:38 时间
背景
线上一套 MySQL 计划升级到 8.0 ,通过备份还原搭建一个测试环境,用于升级测试。数据库采用 xtrabackup 每天进行全备,压缩备份文件约 300G ,解压到一半就报错了:
gzip: stdin: invalid compressed data--format violated
tar: Unexpected EOF in archive
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now
刚开始以为只是这个备份文件不完整,又找了前一天备份文件,解压过程中也报了同样的错误,备份文件比较大,无疑增加了排障时间。
故障分析
备份脚本通过 crontab 每天凌晨执行,线上都是同一套备份脚本,不同项目时常做备份数据还原,还是头一次遇到备份文件解压失败现象,查看了脚本,每个关键阶段都做了状态码判断是否成功,若失败就告警,同时对 xtrabackup 备份日志最后一行是否包含 completed OK 关键词也做了判断,关键备份脚本如下:
xtrabackup xxx --stream=tar --no-timestamp $bkdir 2> xxx.log | gzip - > xxx.tar.gz
近期也没收到失败告警,说明备份脚本是执行成功了的,感觉太奇怪了,查看定时任务日志,发现同一任务同一时间点竟然启了2次:
[root@localhost backup]# grep backup /var/log/cron
Mar 6 00:00:01 localhost CROND[6212]: (root) CMD (sh xxx/mysql_ftp_backup.sh || echo 1 > xxx/err.log)
Mar 6 00:00:01 localhost CROND[6229]: (root) CMD (sh xxx/mysql_ftp_backup.sh || echo 1 > xxx/err.log)
Mar 7 00:00:01 localhost CROND[5387]: (root) CMD (sh xxx/mysql_ftp_backup.sh || echo 1 > xxx/err.log)
Mar 7 00:00:01 localhost CROND[5420]: (root) CMD (sh xxx/mysql_ftp_backup.sh || echo 1 > xxx/err.log)
crond 服务每次同时拉起2个进程执行备份,并发地往同一个压缩文件 xxx.tar.gz 写数据,备份数据相互覆盖,导致备份文件损坏,每天看似备份成功的任务,其实备份都是无效的,这也说明了定期备份恢复演练的重要性。为何定时任务同一时间点会启动2次?查看 crond 进程:
[root@localhost backup]# ps -ef|grep crond |grep -v grep
root 2883 1 0 2018 ? 01:42:46 crond
root 17293 1 0 2022 ? 00:43:22 crond
原来是因为系统启动了2个 crond 进程,kill crond 进程后重启,再次查看只有一个 crond 进程:
[root@localhost backup]# service crond stop
Stopping crond: [ OK ]
[root@localhost backup]# ps -ef|grep crond
root 2883 1 0 2018 ? 01:42:46 crond
root 31486 31856 0 10:59 pts/2 00:00:00 grep crond
[root@localhost backup]# kill 2883
[root@localhost backup]# ps -ef|grep crond
root 31572 31856 0 10:59 pts/2 00:00:00 grep crond
[root@localhost backup]# service crond start
Starting crond: [ OK ]
[root@localhost backup]# ps -ef|grep crond
root 31632 1 0 10:59 ? 00:00:00 crond
root 31639 31856 0 11:00 pts/2 00:00:00 grep crond
总结
为了确保备份有效,需要做如下改进:
1、flock给脚本执行加互斥锁,确保一个时间点只有1个进程运行。
2、定期做备份恢复演练。
3、增加crond进程监控,不等于1告警。
相关文章
- 故障分析 | MySQL 主从延时值反复跳动
- MySQL Error number: MY-010216; Symbol: ER_VALGRIND_DO_QUICK_LEAK_CHECK; SQLSTATE: HY000 报错 故障修复 远程处理
- MySQL Error number: MY-010777; Symbol: ER_EVENT_CANT_OPEN_TABLE_MYSQL_EVENT; SQLSTATE: HY000 报错 故障修复 远程处理
- MySQL Error number: MY-013781; Symbol: ER_GRP_RPL_MYSQL_NETWORK_PROVIDER_CLIENT_ERROR_COMMAND_ERR; SQLSTATE: HY000 报错 故障修复 远程处理
- ASP结合MySQL:实现快速数据库连接(asp如何连接mysql)
- MySQL网络数据抓取分析实战(mysql抓包)
- MySQL分析工具:最佳实践方案(mysql分析工具)
- 的因素MySQL 性能优化:影响因素分析(mysql影响性能)
- MySQL实现汉字拼音首字母获取(mysql获取拼音首字母)
- 深入探索MySQL数据日志分析(mysql数据日志分析)
- MySQL数据库平方运算的实现方法及应用场景分析(mysql平方)
- MySQL文本表使用技巧(mysql 文本表)
- MySQL 运维面试题精选,助你成功应对技术面试!(mysql运维面试题)
- 谁胜?MSSQL vs MYSQL 对比分析(mssql 比mysql)
- 深入解析MySQL的SQL语句(mysql的 sql语句)
- MySQL分区表性能分析——优势与劣势(mysql分区表优劣分析)
- Mysql中如何使用ASC排序(mysql 中asc排序)
- MySQL中1查询不到如何解决问题(mysql中1查询不到)
- 解决MySQL运行异常自动停止问题分析与处理(mysql一运行就会停止)
- MySQL下载速度慢,怎么办(mysql下载的好慢)
- 数据库故障,MySQL无法写入新数据(mysql不能写入新数据)