一次深刻的教训(阿里云自建mysql,centos6.9,mysql5.6),没有对数据库备份足够的重视,升级服务没有做应急预案,导致线上环境停机4小时维护。
一、事情经过:
1、应用需要升级,
2、阿里云提示系统有漏洞需要打补丁,需要重启服务器
3、停了应用服务,没有手工停mysql服务,重启服务器
4、部署好应用,发现mysql连接异常,一脸懵逼。
提示:Cannot connect to local MYSQL server through socket '/var/lib/mysql/mysql.sock'
找不到mysql.sock,通过网上搜索也没找到原因,
执行 service mysqld restart;提示stop成功,start failed。
执行service mysqld status,提示mysql dead but subsys locked
一时间定位不到问题,查看错误日志。
二、通过请教高人,解决问题的步骤:
1、应该是表中有错误的数据导致启动失败,此时mysql -uroot -P已经连接不到mysql,通过修改/ect/my.cnf 增加一行innodb_force_recovery=2,强制启动mysql,完成数据备份。
2、此时该出错的表还是操作不了,通过navicat导出除此表之外的其他数据,庆幸这张表还只是暂时的日志文件,还没太大的意义。
3、mysqldump到错误表处就结束了。
4、新建一个数据库实例,数据导入,新建出错的表,启动服务恢复生产应用。
到此,离停服务器已经过去4个小时,仿佛经历了一场大劫难,以长时间停止线上服务和丢失数据的风险为代价,这个教训实在太大了。