数据库恢复

【本文收录于[Go4Pro.org]

4月24日早上手欠,不知道进行了什么骚操作,造成我的VPS上MySQL服务无法正常启动。

以下是整个应急处理和数据库恢复过程。

首先,我停掉了Apache2的服务,中断了WEB访问——因为反正也访问不了。

然后,进入/var/lib/mysql目录,看到我之前的两个数据库的文件都还在,心里略微放心了一点。于是通过FileZilla将所有的idb和frm文件拷贝到本地。

为了进行数据恢复,我在工作机上创建了一个虚拟机,装了一个MySQL服务器。以下操作以其中一个数据库rsywx的恢复为例。

参照这篇文章的提示,进行如下操作。

首先,在虚拟机MySQL中创建一个数据库rsywx。该数据库上次的全备份是在2月份,但是我们不会用这个备份来恢复,因为这要丢掉2个多月的数据。我们用这个数据库备份是为了生成rsywx数据库的表结构。我们先用这个备份恢复到2月份,然后执行以下命令:

mysqldump –d –u root –p rsywx > rsywx.schema.sql

这会生成一个数据库表结构的SQL文件。

由于数据库中表格间存在PK/FK关联,所以需要手工将所有FK相关的SQL语句删除。

我们现在可以DROP这个rsywx数据库,再重新创建一个rsywx数据库。

上面这个步骤完成后,下面是最重要的一步。在MySQL服务器中执行下列命令(建议用GUI完成,这样可以将结果导出):

USE INFORMATION_SCHEMA;
SELECT
CONCAT(“ALTER TABLE `”, TABLE_SCHEMA,”`.`”, TABLE_NAME, “` DISCARD TABLESPACE;”)
AS MySQLCMD FROM TABLES
WHERE TABLE_SCHEMA = “dummy”;

结果应该是类似这样的几行数据,rsywx中有几个表,就有几行:

ALTER TABLE `rsywx`.`book_review` DISCARD TABLESPACE;

将结果导出,并重新执行。此时,所有的idb文件都将丢失。

停止MySQL服务,将从生产环境备份下来的rsywx数据库中的所有idb文件拷贝过来。重新启动MySQL服务。

然后运行

ALTER TABLE `rsywx`.`book_review` IMPORT TABLESPACE;

此时,rsywx数据库已经基本恢复完成。进行select操作时已经可以看到所有数据!

接下来,是重新生成对应的PK/FK。

注意,这一步有可能出错。请根据相应提示修改。而且一旦操作出错,会前功尽弃。

所以,最好是在完成select操作看到数据后,先将数据dump出来备用。

到这里,数据库恢复就已经完成了。

此次数据库奔溃,是4个月来的第二次。教训是,数据库每日全备份非常重要,而且要用dump的方式备份,因为这是恢复数据最简单、最快的方法。以上方法只适用于实在走投无路的时候。

Ashampoo_Snap_2018年4月25日_12h53m52s_001_Chrome Legacy Window