记一次Mysql57数据库数据恢复过程

灾难总会发生,常备才是真理!

虽然常念叨上述话语,但是上周末不幸还是发生了。部署在天翼云乐山机房的Centos7服务器不幸挂了,Mysqld服务无法启动,每天备份服务也在半个月之前,由于某区域华为路由器故障离线,因此没有可用的备份直接上线。

用了半天通过.frm与.ibd文件恢复,下文讲述一下修复过程。

环境如下: Centos7.1 + Mysqld57

一、尝试innodb_force_recovery = 1修复

修改/etc/my.cnf 添加以下内容后重新Mysqld,发现依然无法修复后决定采用其它方法。

innodb_force_recovery = 1

二、重新初始化Mysqld

由于Mysql的系统表Mysql等损坏,因此确定采用重新初始化/var/lib/mysql目录的方式先启动Mysql服务,再导入损坏数据的方式。

由于根目录磁盘已满,所以决定在其它磁盘存放Mysql数据文件。

2.1 修改/etc/my.cnf,重定向Mysql数据文件目录

修改后内容如下,所有文件由/var/lib/mysql目录变为/mnt/vdb/mysql目录。

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/mnt/vdb/mysql
socket=/mnt/vdb/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

innodb_force_recovery = 0

注意datadir=与socket=需要同时修改。

2.2 kill所有Mysql进程

执行以下命令,寻找Mysql进程,并采用kill工具停止所有残余进程。

ps -aux | grep mysql

2.3 重新初始化Mysql数据库

执行命令:

mysqld --user=root  --initialize --console
# 或
mysqld --user=root --basedir=/mnt/vdb/mysql  --initialize --console

2.4 给Mysql授予/mnt/vdb/mysql目录权限

chown mysql:mysql -R /mnt/vdb/mysql

2.5 重启Mysqld服务

systemctl restart mysqld

若无意外,mysqld已经重启成功。若重启失败,可以查看/var/log/mysqld.log日志文件,予以解决。常见的问题有:1. 权限问题,请执行2.4;2.3306端口被占用;

2.6 验证Mysqld服务

从/var/log/mysqld.log查看登录密码后,使用mysql_secure_installation工具重新初始化密码。

三、恢复数据

安装mysqlUtils,下载地址:http://dev.mysql.com/downloads/utilities/

3.1 采用mysqlfrm工具获取表结构

mysqlfrm --diagnostic user.frm

user.frm文件是待恢复的表结构文件。

执行以上命令后,控制台会显示数据表创建命令,通过该命令创建数据库与数据表即可。

3.2 恢复原始数据

通过以下命令登录Mysql后,先解除user表frm与idb文件映射关系,后替换ibd文件,再重新添加表关系即可恢复数据。

登录命令:

 mysql -uroot -h127.0.0.1 -p

解决user表映射:

alter table user discard tablespace;

用原来/var/lib/mysql/目录的user.ibd文件把/mnt/vdb/mysql目录的user.idb替换掉后,执行下列命令即可重新关联恢复数据,如果报错请修改文件权限:

alter table user import tablespace;

四、总结

上述方法虽然解决了问题,但是过程极其繁琐,如果有更好的方法,希望路过的各位伙伴留言。