数据库恢复

【本文收录于[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。 注意,这一步有可能出错。请根据相应提示修改。而且一旦操作出错,会前功尽弃。 […]