灾难总会发生,常备才是真理!
虽然常念叨上述话语,但是上周末不幸还是发生了。部署在天翼云乐山机房的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;
四、总结
上述方法虽然解决了问题,但是过程极其繁琐,如果有更好的方法,希望路过的各位伙伴留言。