6.4 恢复数据库

上一节介绍了如何备份数据库,在数据库中的数据遭到破坏,例如,如果服务器由于断电而突然停机造成数据丢失等,这时需要使用恢复技术来恢复数据。

恢复数据库的过程使用两个信息源:备份文件和更新日志。其中,备份文件将表恢复到进行该备份时的状态。另外,在备份和故障发生这段时间中,表通常已经被修改。更新日志包含了用来完成这些修改的命令。可以通过将更新日志输入mysql的方法来重复这些查询命令,彻底恢复数据。

6.4.1 恢复整个数据库

首先来看如何恢复整个数据库,步骤如下。

(1)将原数据库目录的内容拷贝到其他的地方。

保存遭到破坏后的数据,可以用来进行数据破坏的原因分析。

(2)用最新的备份文件重新加载数据库:

● 如果使用由mysqldump备份的文件,则需要将它们作为mysql的输入;

● 如果使用从数据库中直接拷贝的文件,则将它们直接拷贝回到该数据库目录中。在这种情况下,应该在拷贝这些文件之前关闭服务器,在拷贝结束后再重新启动。

(3)用更新日志重做在进行数据备份后又修改了的数据。

对于所有可用的更新日志,可使用它作为mysql的输入。指定--one-database选项,使mysql只对想要恢复的数据库执行查询命令。

例如,如果自备份以来所产生的日志命名为update.001、update.002,等等,可以重新运行它们中的命令:

    % mysql --one-database db_name<update.001
    % mysql --one-database db_name<update.002

如果正在运行恢复,应确保先从更新日志中删除引起数据丢失的操作语句:DROP DATABASE、DROP TABLE或DELETE等。

★ 注意 ★

如果要恢复的数据库是含有授权表的MySQL数据库,则需要使用--skip-grant-tables选项启动服务器。否则,服务器将提示无法找到授权表。在恢复表之后,执行如下命令:

% mysqladmin flush-privileges

来告诉服务器加载授权表,并用它们启动。

6.4.2 恢复单个的表

相对于恢复整个数据库来说,恢复单个表更加困难。如果有通过mysqldump生成的备份文件,并且它恰好包含想要恢复的表数据,则需抽取相关的行并用它们作为mysql的输入,这需要了解SQL语句,实际上也不是特别困难的。

更为困难的是抽取应用于该表的更新日志的片段,这时可以使用mysql_find_rows实用程序,它可以从更新日志中抽取多行查询。

另一种方法是用另一个MySQL服务器恢复整个数据库,然后将所需要恢复的部分表数据文件拷贝到原始数据库中。