一次InnoDB引擎MySQL数据库的恢复过程

服务器上有两个网站前几天开通了百度云观测,因为我的VPS配置并不高,而云观测的漏洞检测会大量的模拟攻击网站,结果服务器被百度云观测搞挂了,MySQL彻底启动不了。错误信息“The server quit without updating PID file”,因为我服务器已经禁掉MySQL日志了,所以按照《MySQL服务器启动错误 The server quit without updating PID file 的解决方法》的解决方案也解决不了,而因为没有日志,所以也无法判断MySQL无法启动的原因到底是什么。悲催的是,因为前段时间忙着硬件营销平台的事情,网站数据库有很长一段时间没有备份了,所以想通过备份文件恢复全部数据也不可能。不过,好在SSH还能登陆,我在/usr/local/mysql/var目录下可以看到数据库的整个文件夹,那就好办了,下面来讲讲如何通过复制数据库文件夹到新服务器上恢复数据的方法。

数据库恢复的原理:设置真实服务器为A,本地安装虚拟机Debian,配置好环境,设置本地服务器为B。保持两边数据库名字完全一致。复制 服务器A /usr/local/mysql/var 目录下整个数据库文件夹(假设数据库名为mydbname)到服务器B对应目录。这里要注意的是:InnoDB 和 MyISAM 两个数据库引擎的区别了,如果你使用的的引擎是MyISAM,那么复制mydbname文件夹即可,如果你使用的室InnoDB引擎,那么不但要复制mydbname文件夹,还要复制服务器A /usr/local/mysql/var 目录下的 ibdata1 文件到服务器B的/usr/local/mysql/var目录下。因为InnoDB引擎下,数据库真实数据实际上是写在ibdata1文件里的,mydbname文件夹内的文件实际上是数据对应的结构表,而不是数据本身。这一点与MyISAM引擎的数据直接写入mydbname文件家中的文件方式有很大的不同。所以,在迁移数据之前,可千万不要头脑发热把ibdata1文件给删除了,那可是神仙都救不了你。

在恢复过程中,我们会因为Debian的账号权限和InnoDB的数据结构问题遇到许多坑,比如直接拷贝数据库文件夹到服务器B之后,我们在phpmyadmin登陆时,数据库会出错:ERROR 1018 (HY000): Can't read dir of '.' (errno: 13),或者 出现 MySQL #1146错误,明明看得到表,但是就是打不开。那么看了下面的操作步骤,我遇到的坑,各位就可以直接跳过了,不用再填一次。

在服务器B上具体的数据恢复步骤:

1、停止MySQL数据库;
chown -R mysql.mysql /usr/local/mysql/   #给mysql账户授权操作mysql数据库,这样才能执行下面的命令:
/etc/init.d/mysql stop

2、将服务器A上 /usr/local/mysql/var 目录下的 mydbname文件夹 和 ibdata1文件 下载到本地,然后用SFTP上传到服务器B的/usr/local/mysql/var 目录下;
chown -R david /usr/local/mysql   #david是SSH登陆账号,授权david对 /usr/local/mysql 目录进行文件操作

3、在 /etc目录下的 my.cnf 文件的[mysqld]段中增加:innodb_force_recovery = 4
chown -R david /etc   #david是SSH登陆账号,授权david对 /etc 目录进行文件操作
# 你也可以以root账户的权限直接在终端里用vi把 my.cnf 给改了

4、启动MySQL数据库;
chown -R mysql.mysql /usr/local/mysql/   #给mysql账户授权操作mysql数据库
/etc/init.d/mysql start

5、停止数据库 注释掉innodb_force_recovery = 4
/etc/init.d/mysql stop
chown -R david /etc   #david是SSH登陆账号,授权david对 /etc 目录进行文件操作
# 你也可以以root账户的权限直接在终端里用vi把 my.cnf 给改回来

6、重新启动数据库,应该可以用mysqldump导出数据了
chown -R mysql.mysql /usr/local/mysql/   #给mysql账户授权操作mysql数据库
/etc/init.d/mysql start

执行上述6步之后,我们就可以在phpmyadmin里完全操作数据库的各种表,也可以用mysqldump导出数据了。现在导出的数据是完整的,可以在实际生产环境中进行恢复。

有洁癖的人,可以用本地的Debian服务器将网站的完整数据恢复一次,然后在lnmp的对应目录执行./backup.sh命令备份网站程序和数据库。至此,数据恢复和备份完美结束。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注