解决由于日志占满空间导致的MySQL无法启动问题

本文详细介绍了遇到磁盘空间不足导致MySQL服务无法启动的问题,并通过删除日志文件、注释配置文件中binlog相关设置、重启MySQL服务等步骤成功解决了问题。避免了因磁盘空间限制导致的服务中断。

今天收到监控邮件说博客访问失败。打开页面一看,硕大的502 Bad Gateway,ping了一下VPS发现是通的,SSH连接上去看了下Nginx日志发现没问题,重启lnmp的时候发现Mysql起不来,问题源头基本找到。

tail /usr/local/mysql/var/slyar.err

看了一下Mysql的错误日志,意外状况出现。。。

Disk is full writing './mysql-bin.~rec~' (Errcode: 28). Waiting for someone to free space... (Expect up to 60 secs delay for server to continue after freeing disk space)

神奇的情况,居然是因为磁盘满了无法写入日志导致Mysql起不来

root@slyar# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 3016688 2877540 0 100% /

果然啊,/var目录爆了

root@slyar:/usr/local/mysql/var# ll --block-size=MB
total 504MB
-rw-rw---- 1 mysql mysql 26MB Jul 23 2012 mysql-bin.000011
-rw-rw---- 1 mysql mysql 5MB Jul 26 2012 mysql-bin.000012
-rw-rw---- 1 mysql mysql 27MB Aug 8 2012 mysql-bin.000013
-rw-rw---- 1 mysql mysql 43MB Aug 23 2012 mysql-bin.000014
-rw-rw---- 1 mysql mysql 270MB Feb 9 17:05 mysql-bin.000020
-rw-rw---- 1 mysql mysql 115MB Apr 19 12:27 mysql-bin.000021
-rw-rw---- 1 mysql mysql 1MB Feb 10 12:07 mysql-bin.index
-rw-rw---- 1 mysql mysql 0MB Apr 19 12:34 mysql-bin.~rec~

基本上就是被这些玩意占满了,查了一下Mysql手册发现这些东西也没啥用,直接删除(此操作最好在Mysql服务停止时进行,因为当前日志使用的话无法删除,而且有可能导致一些其它问题,不过用mysql>reset master命令可以直接清空日志)

root@slyar:/usr/local/mysql/var# rm -f mysql-bin.*

为了防止再次出现此类状况,直接关闭Mysql的log-bin日志功能

vim /etc/my.cnf

找到:
log-bin=mysql-bin
binlog_format=mixed

在前面加上#注释掉,:wq保存退出

最后

/etc/init.d/mysql restart

启动Mysql服务,一切正常。

<think>嗯,用户需要解决因断电导致MySQL无法启动问题。从引用内容看,错误信息显示InnoDB表空间ID冲突(space ID:2被两个表重复使用),这是典型的断电造成的InnoDB数据字典损坏。用户可能正在紧急恢复数据库,情绪会比较焦虑。 这类问题通常需要分三步处理:首先是安全备份,避免二次损坏;其次是核心修复,重点解决space ID冲突;最后是数据验证。考虑到用户环境是Windows(错误路径中的反斜杠提示),需要特别注意文件权限问题。 具体到技术细节,ibd文件头部的space ID与数据字典不一致是根源。mysql.ibd文件损坏会影响更大范围,需要优先处理。用户提供的引用中提到的metro/line1_lable.ibd冲突案例很有参考价值,但要注意每个库的表空间路径可能不同。 修复过程中最关键的步骤是innodb_force_recovery的渐进式尝试。从级别3开始比较安全,若无效再逐步提高。需要提醒用户级别6是最后手段,可能导致数据丢失。另外,遇到"Table 'mysql.plugin' doesn't exist"这类错误时,说明系统表损坏,需要单独处理。 最后生成的三个相关问题覆盖了预防措施(事务日志)、替代方案(其他恢复工具)和核心机制(space ID冲突原理),这样既解决当前问题又提供知识延伸。特别要强调定期备份的重要性,毕竟断电是突发情况,预防胜于治疗。</think>断电导致MySQL无法启动是常见问题,通常由InnoDB存储引擎数据文件损坏引起。以下是系统化的解决步骤: ### 核心修复流程 1. **备份数据文件(关键!)** ```bash cp -r /var/lib/mysql /var/lib/mysql_backup ``` 避免操作失误导致二次损坏[^1]。 2. **清理冲突表空间(针对Space ID冲突)** 根据错误日志`[ERROR] InnoDB: Attempted to open a previously opened tablespace`: ```bash mv /var/lib/mysql/mysql/innodb_index_stats.ibd /tmp/ mv /var/lib/mysql/mysql/innodb_index_stats.frm /tmp/ ``` 3. **强制恢复模式启动** 在`my.cnf`中添加(逐级尝试,成功后立即停止): ```ini [mysqld] innodb_force_recovery = 3 # 从3开始尝试,最高到6 ``` 启动后立即导出数据: ```bash mysqldump -u root -p --all-databases > full_backup.sql ``` 4. **重建系统表** ```bash mysql_install_db --user=mysql --ldata=/var/lib/mysql ``` 5. **恢复数据** 移除`innodb_force_recovery`参数后重启: ```bash mysql -u root -p < full_backup.sql ``` ### 预防措施 - **启用双写缓冲**(默认开启) 在`my.cnf`中确认: ```ini innodb_doublewrite = ON ``` - **配置UPS电源** 避免异常断电 - **定期验证数据** ```sql CHECK TABLE mysql.innodb_index_stats; ``` > 典型案例:当出现`space ID: 2`冲突时,需删除冲突的`.ibd`文件并重建表结构[^1]。若`mysql`系统库损坏,需通过`mysql_upgrade`修复数据字典。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值