概述
上周发生了一个Mysql报错的问题,今天有时间整理一下产生的原因和来龙去脉,Mysql的版本是5.5
,发生错误的表存储引擎都是MyISAM
,产生的报错信息是Table 'xxxxxx' is marked as crashed and should be repaired
。
定位问题
产生的后果是Nginx服务没有响应,找到Mysql的进程,想做的是查找到mysql的错误日志路径,查看错误信息,错误信息里的关键词是定位问题、解决错误的有效手段。
在多说一句Linux服务器中的进程管理,使用 ps aux
里面主要留意的信息是PID、进程所属用户和后面启动进程所执行的Bash命令。
ps aux | grep mysql
mysql 17743 4.7 33.1 3722028 2604540 ? Sl 3月01 338:55
/usr/local/mysql/libexec/mysqld
--defaults-file=/usr/local/mysql/etc/my.cnf
--basedir=/usr/local/mysql
--datadir=/usr/local/mysql/data
--plugin-dir=/usr/local/mysql/lib/mysql/plugin
--user=mysql
--log-error=/usr/local/mysql/var/mysql_error.log
--open-files-limit=10240
--pid-file=/usr/local/mysql/var/mysql.pid
--socket=/tmp/mysql.sock
--port=3306
- 配置文件路径: --defaults-file /usr/local/mysql/etc/my.cnf
- Mysql文件路径: --basedir /usr/local/mysql
- Mysql数据报错路径: --datadir /usr/local/mysql/data
- Mysql错误日志 --log-error /usr/local/mysql/var/mysql_error.log
使用 tail -f -n 20 /usr/local/mysql/var/mysql_error.log
观测错误信息,如果想让log的行数展示的多些,可以指定最后行数,例如想展示20行,tail -f -n 20 /usr/local/mysql/var/mysql_error.log
,报错消息如下图:
成因
网上查了一下,错误的产生原因,有网友说是频繁查询和更新表造成的索引错误,还有说法是Mysql数据库因某种原因而受到了损坏,如:数据库服务器突发性断电,在数据表提供服务时对表的源文件进行某种操作都有可能导致,Mysql数据表被损坏而无法读取数据,总之就是因为某些不可测的问题造成表的损坏。
我个人估计是没有正确编写和使用代码导致的,出现问题的表都是MyISAM
存储引擎。
解决办法
命令行方式
1、登录,切换到error的数据库上:
mysql -u root -p
use cc;
2、检查出现问题的表的状态
check table cc_user_area;
3、修复表(table_name 需要修复的表名)
repair table table_name
4.检查一下状态,如下图
check table cc_user_address;
Navcat
还有一种更为便捷的方法,使用Navicat来处理,首先连接上数据库,选择表,右键->Maintain(维护)->Repair Tables(修复表)->Extended(扩展)
修复就完成了,服务也正常使用了,有时候需要规范的编码,才不会出现奇奇怪怪的问题。