测试环境机器断电后重启机器发现mysql启动失败,查看mysqld的日志发现
按照日志文件中的参考文档地址,在配置文件my.cnf中添加了innodb_force_recovery=1,重新启动mysql,发现还是不行,日志中报错如下:
出现这种情况首先想到的是表损坏了,要先备份数据,于是强制启动mysql,使用mysqld_safe命令,在配置文件中添加skip_grant_tables, mysqld_safe --user=mysql, 确认mysql启动后,去检查哪些表被损坏了:mysqlcheck -C -uroot -p -A,跑完后检查日志中新增的记录,根据日志可以找到被损坏的表,由于表过多损坏,所以重新初始化个mysql数据目录,在这之前先把所有的数据备份下:
mysqldump -uroot -p -A >/var/lib/dump.sql
初始化新的mysql数据路径:
mkdir /var/lib/mysql_new
chown -R mysql:mysql /var/lib/mysql_new
修改my.cnf中的datadir=/var/lib/mysql_new,注释掉skip_grant_tables和innodb_force_recovery
最后mysqld --initialize --basedir=XX --datadir=/var/lib/mysql_new,执行完后查看新的数据目录下的文件,mysql系统文件都有了,这个时候停止mysqld_safe进程: pkill mysql ;
正常启动mysql,service mysqld start ,换完数据目录后一般会出现 不能通过 /var/lib/mysql/mysq.sock去连接mysql的错误提示,这个时候建个软连接:
ln -s /var/lib/mysql_new/mysql.sock /var/lib/mysql/mysq.sock即可,service mysqld start可以正常启动mysql了,
mysql -uroot -p两次回车,等候后第一件事就是修改root密码,否则操作的时候也会提示强制去设置,
>alter user root@'localhost' identified by 'passoword'\G;
>flush privileges\G;
>source /var/lib/dump.sql (执行完后数据就全部恢复了)
>exit; 退出后就可以用原来数据库的用户名密码正常连接了
到此完全恢复数据库中的表和数据,停掉数据库,可以吧数据的目录名相应的改成原来的