上个月一天早上醒来,几个客户的站全挂了,打开一看MySQL服务停了。这种事第一次遇到会慌,多遇到几次就有套路了。今天整理一下排查流程。
第一步:看错误日志。路径在/www/server/data/你的主机名.err。打开翻到最后几十行,最常见的几个报错:磁盘空间不足(No space left on device)、内存不足被OOM Killer杀了、InnoDB表损坏(Tablespace is missing)。
第二步:磁盘空间。df -h看一眼,如果/目录使用率超过95%,先清理。宝塔的/www/server/data/下面经常堆一堆binlog,清理命令:PURGE BINARY LOGS BEFORE NOW();(进MySQL执行)。如果磁盘满了MySQL根本起不来。
第三步:内存。free -h看一下。如果内存不够用,MySQL启动时分配buffer pool会失败。临时方案是进/etc/my.cnf把innodb_buffer_pool_size改小(比如原来1G改成256M),先让MySQL起来再说。长期还是要加内存或者优化查询。
第四步:端口占用。netstat -tlnp | grep 3306,看看是不是有其他进程占了3306端口。遇到过Docker里跑了个MySQL容器占了宿主机3306的情况。
第五步:如果以上都正常,尝试手动启动。用/etc/init.d/mysqld start,不要用宝塔面板的按钮——面板有时候状态显示不准确。手动启动能看到详细报错。
第六步:终极手段——强制恢复模式。在my.cnf的[mysqld]段加一行innodb_force_recovery=1,然后启动。值从1到6逐级尝试,1是最温和的。数据能读出来之后赶紧mysqldump备份,然后重建数据库。
流程不复杂,关键是不要慌。80%的情况前三步就解决了。
还木有评论哦,快来抢沙发吧~