记录一次数据库崩溃的处理

现象描述

本人使用mac电脑。在docker上搭建php+mysql+ubuntu开发环境。使用phpmyadmin去管理数据库。在容器关闭之后再次启动进入之后发现了phpmyadmin不能使用了。如果按照报错查询资料是要求修改phpmyadmin的配置文件这个是错的。其实使用service mysql status会发现mysql已经启动不了了。这个才是问题关键。

排查过程

在处理问题上我这次是有点实用主义的原则。能拿到可以处理问题的报错就好,不会深入的纠结于到底发生了什么。但是我使用service mysql start启动的时候,什么错误也没有是怎么回事呢?
那是因为报错文档都写到了log里面。都在/var/log/mysql/error.log里面。我们不妨看一下.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2017-11-29T03:07:42.750695Z 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB.
2017-11-29T03:07:42.751483Z 0 [Note] InnoDB: 96 redo rollback segment(s) found. 96 redo rollback segment(s) are active.
2017-11-29T03:07:42.751515Z 0 [Note] InnoDB: 32 non-redo rollback segment(s) are active.
2017-11-29T03:07:42.752010Z 0 [Note] InnoDB: 5.7.20 started; log sequence number 2674982
2017-11-29T03:07:42.752373Z 0 [Note] Plugin 'FEDERATED' is disabled.
2017-11-29T03:07:42.755688Z 0 [Warning] Failed to set up SSL because of the following SSL library error: SSL context is not usable without certificate and private key
2017-11-29T03:07:42.755744Z 0 [Note] Server hostname (bind-address): '127.0.0.1'; port: 3306
2017-11-29T03:07:42.755765Z 0 [Note] - '127.0.0.1' resolves to '127.0.0.1';
2017-11-29T03:07:42.755792Z 0 [Note] Server socket created on IP: '127.0.0.1'.
2017-11-29T03:07:42.755974Z 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
2017-11-29T03:07:42.757059Z 0 [Note] InnoDB: Buffer pool(s) load completed at 171129 3:07:42
2017-11-29T03:07:42.758298Z 0 [ERROR] /usr/sbin/mysqld: Table './mysql/db' is marked as crashed and should be repaired
2017-11-29T03:07:42.760700Z 0 [ERROR] Couldn't repair table: mysql.db
2017-11-29T03:07:42.760783Z 0 [ERROR] Fatal error: Can't open and lock privilege tables: Incorrect key file for table 'db'; try to repair it
2017-11-29T03:07:42.761125Z 0 [ERROR] Aborting
2017-11-29T03:07:42.761211Z 0 [Note] Binlog end

对不起我就截取了一段。但是就够用了。我们看一下这里面关键的是ERROR哪里。稍微百度翻译一下你会发现他说这里的表被记录为已经损坏了不能启动了。可能你报错的时候不是mysql这个而是user什么的。其实都是一样的,告诉你表已经崩溃要修复。
好了你可能会查询修复表的命令。于是查到这个mysqlcheck。结果发现不行啊。那是当然这条指令是要你启动了mysql才能用的。那怎么办呢?
我在网站找到了一个跳过这个东西先启动然后在登陆的方法。我试试那条指令(一会会告诉你的),结果发现报错,是上面的那一坨,于是要先修复了这个mysql的表才行,至少能让我跳过启动。于是我有查询,得到了修复二进制文件的指令myisamchk这条好不用启动mysql。于是乎就好了。

流程记录

  1. 修复二进制文件(先cd到/var/lib/mysql/mysql)
    myisamchk -f *.MYI
  2. 跳过启动在修复
    service mysql start –skip-grant-tables
    mysqlcheck -r mysql user
  3. 喝杯咖啡🎉一下。

传送门

我将一直的迷惑和无知,我是黄油香蕉君,再见。

给作者买杯咖啡吧。喵~