本人使用 Mac 电脑. 在 docker 上搭建 PHP+MySQL+Ubuntu 开发环境. 使用 phpmyadmin 去管理数据库. 在容器关闭之后再次启动进入之后发现了 phpmyadmin 不能使用了. 如果按照报错查询资料是要求修改 phpmyadmin 的配置文件这个是错的. 其实使用 service MySQL status 会发现 MySQL 已经启动不了了. 这个才是问题关键.
排查过程
在处理问题上我这次是有点实用主义的原则. 能拿到可以处理问题的报错就好, 不会深入的纠结于到底发生了什么. 但是我使用 service MySQL start 启动的时候, 什么错误也没有是怎么回事呢?
那是因为报错文档都写到了 log 里面. 都在 / var/log/MySQL/error.log 里面. 我们不妨看一下.
- 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. 于是乎就好了.
流程记录
修复二进制文件 (先 cd 到 / var/lib/MySQL/MySQL)
myisamchk -f *.MYI
跳过启动在修复
- service MySQL start -skip-grant-tables
- mysqlcheck -r MySQL user
喝杯咖啡?? 一下.
传送门
传送门 1
传送门 2
我将一直的迷惑和无知, 我是黄油香蕉君, 再见.
来源: http://www.bubuko.com/infodetail-3236018.html