记录一次mysql启动失败解决方案

文章目录

  • 1.由于binlog占用磁盘空间太大,清理掉之后数据库启动不了
  • 2.网上找的解决方案删除bin-log.index来解决
  • 3.之后查看mysql.log日志发现一直在报错
  • 4.然后检查文件是否存在
  • 5.后来觉得是mysql启动去读取InnoDB日志文件导致的
  • 6.最终强制重启数据库
  • 7.添加之后服务重启mysql服务,启动不卡住了,直接启动报错了
  • 8.解决方案

1.由于binlog占用磁盘空间太大,清理掉之后数据库启动不了

systemctl restart mysqld

卡住不动了

2.网上找的解决方案删除bin-log.index来解决

把/var/lib/myql/bin-log.index里面的内容也删掉,注释掉配置文件的bin-log,启动服务,结果还是不行

3.之后查看mysql.log日志发现一直在报错

[ERROR] [MY-012894] [InnoDB] Unable to open './#innodb_redo/#ib_redo17190' (error: 1504)

4.然后检查文件是否存在

ls -l ./#innodb_redo/#ib_redo17190

结果没有这个文件

5.后来觉得是mysql启动去读取InnoDB日志文件导致的

在MySQL数据目录中删除InnoDB日志文件
也就是/var/lib/mysql目录下

sudo rm -rf ./#innodb_redo/

结果启动依旧解决不了

6.最终强制重启数据库

心里觉得数据应该都没丢失,只要数据库先启动就能解决

设置innodb_force_recovery=1是一种MySQL数据库的应急修复模式,它用于尝试恢复由于InnoDB引擎发生故障而导致的数据库崩溃
在/etc/my.cnf中

[mysqld]innodb_force_recovery=1 ####最好放在首行

当将innodb_force_recovery参数设置为1时,MySQL将在启动过程中尝试执行一些简化和跳过错误检查的操作,以允许数据库在某种程度上继续运行。这可以帮助您备份或导出数据,并诊断和解决底层问题。

请注意以下事项:

  1. 强制恢复模式不是一个持久的解决方案,它只是为了临时修复数据库并确保数据可用。在应用该模式后,请尽快采取必要的措施来解决根本的问题,并进行适当的修复。
  2. 在强制恢复模式下,数据库可能无法完全正常工作,并可能存在数据损坏的风险。因此,请在确定风险并备份数据的情况下操作。
  3. 在完成数据备份后,应立即关闭数据库并进行修复工作。具体的修复步骤将取决于实际的数据库故障原因和情况。

总之,使用innodb_force_recovery=1仅限于临时应对数据库故障的情况,并且需要后续的详细故障诊断和修复工作。建议在尝试此模式之前备份数据并与数据库专家或管理员进行进一步的讨论和指导。

7.添加之后服务重启mysql服务,启动不卡住了,直接启动报错了

Neither found #innodb_redo subdirectory, nor ib_logfile* files

原因找到了,是我把/#innodb_redo/目录删掉导致的
其实只要清空改目录就可以了

8.解决方案

在my.cnf里加上这两句指定一下日志存放目录可以了
还要在/var/lib/mysql下创建两个目录

mkdir \#innodb_redomkdirmysql-binchown -R mysql:mysql #innodb_redo###记得改权限chown -R mysql:mysqlmysql-bin
[mysqld]log_bin_basename=/var/lib/mysql/mysql-bininnodb_log_group_home_dir=/var/lib/mysql/redo_log/#innodb_redo

重启数据库完美解决
记得重启成功后将my.cnf里面的innodb_force_recovery=1给注释掉
附加一个mysql8的binlog自动清理命令
设置二进制日志过期时间为7天(相当于expire_logs_days=7),请执行以下命令:

sql

SET GLOBAL binlog_expire_logs_seconds = 604800; -- 7天的秒数