缘起

节省成本,测试环境DB使用的一台个人电脑,今天办公室装修,停电了。电力恢复以后发现mysql无法启动,报错如下

./mysql.server start

记一次Mysql无法启动的问题_mysql

但是如果用restart命令又是报错另外一个

./mysql.server restart

记一次Mysql无法启动的问题_adb_02


一时间搞不懂什么原因,跟剧下面那个提示又提示什么pid文件不存在,尝试过在data文件下新建一个pid文件写入一个数字也不行。

解决方案

找问题的过程就不说了,说自己的解决方案吧

先看日志文件

vi /etc/my.cnf

记一次Mysql无法启动的问题_数据库_03

tail -200f /usr/local/mysql/error.log

记一次Mysql无法启动的问题_mysql_04


说的是这个文件不能写,看了下这个文件不知道为什么没权限?我这个mysql都用很久了,没权限早该没权限啊,不管了,给他分一个权限。这里要写*,不能只给那一个文件的权限

cd /usr/local/mysql/mysqldb
chmod -R 777 *

继续启动,又报错

记一次Mysql无法启动的问题_数据文件_05


通过这篇文章看的出来原因是索引损坏了,如何修复呢?

修改mysql 配置文件 /etc/my.cnf

[mysqld]
innodb_force_recovery=6
  • 1 (SRV_FORCE_IGNORE_CORRUPT)
    使服务器即使检测到损坏的页面也可以运行 。尝试 跳过损坏的索引记录和页,这有助于转储表。 SELECT * FROM tbl_name
  • 2 (SRV_FORCE_NO_BACKGROUND)
    阻止主线程和任何清除线程运行。如果在清除操作期间发生意外退出,则此恢复值将阻止它。
  • 3 (SRV_FORCE_NO_TRX_UNDO)
    崩溃恢复后 不运行事务 回滚。
  • 4 (SRV_FORCE_NO_IBUF_MERGE)
    防止插入缓冲区合并操作。如果它们会导致崩溃,请不要这样做。不计算表 统计信息。此值可能会永久损坏数据文件。使用此值后,准备删除并重新创建所有二级索引。设置 InnoDB为只读。
  • 5 (SRV_FORCE_NO_UNDO_LOG_SCAN)
    启动数据库时 不查看撤消日志: InnoDB即使未完成的事务也视为已提交。此值可能会永久损坏数据文件。设置InnoDB为只读。
  • 6 (SRV_FORCE_NO_LOG_REDO)
    不进行与恢复有关的重做日志前滚。此值可能会永久损坏数据文件。使数据库页面处于过时状态,这反过来可能会使B树和其他数据库结构遭受更多破坏。设置 InnoDB为只读。

好像是说设置成6有可能丢失数据吧,但是管他呢,我们这个是测试环境,而且我需要尽快的把数据库恢复启动,大家要干活的啊~

但是啊但是
发现设置为6之后,数据库只能读,不能改了。我又尝试改成1,但是改成1以后又无法启动了,跟上面一样,最终没有能够找到很好的解决办法,重新弄了一个库,然后用navcat备份了数据,然后恢复了。

总结

这次Mysql无法启动的原因,应该就是忽然间的断电导致索引文件损坏了。过程就是看日志,然后忽然检查,然后启动。这样就可以查询数据了,然后就备份,然后又重新建数据库恢复。当然可能有更好的办法,但反正我是没找到,也没有那么多时间尝试。教训就是数据库还是不用本地的,买个阿里云的吧,

“这种事你们可以花点钱嘛!花点!哪怕阿里云呢,花不了多少钱,哪怕偷偷摸摸的,简直就是土匪,土匪都不如!”

折腾老子一下午,C。


阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: mysql