日期:2013-06-05  浏览次数:20379 次

   数据库毁坏发生的缘由有许多,且程度各不相反。如果侥幸的话,可能是一两个表的小毁坏(例如,如果您的机器由于断电而暂时停机)。如果不是这样,可能需求置换整个的数据目录(例如,如果某个磁盘瘫痪而且数据目录在它上)。在其他情况下也需求恢复操作,例如,当用户错误地删除数据库或表时,或者错误地删除表的内容时。不论这些不幸的事件发生是由于什么缘由,都需求恢复它们。
    如果表被毁坏但没有丢失,可试着用myisamchk 或isamchk 来修复它们。如果修复实用程序能修复它们,就基本挥斜匾褂帽阜菸募1淼男薷垂探诘?3 章讨论。如果表被丢失或不能修复,则需求恢复它们。
    恢复过程包括两个信息源:备份文件和更新日志。备份文件将表恢复到进行该备份时的形状。但是,在备份和毛病发生这段时间中,表通常曾经被修正。更新日志包含了用来完成这些修正的查询。可以通过将更新日志作为对mysql的输入来反复这些查询(这就是为什么
应该允许更新日志的缘由。如果您还没有使更新日志无效,如今赶快做,并在进一步读取之前生成一个新的备份)。
    恢复过程依据必须恢复的信息的多少而变化。理想上,恢复整个数据库比恢复单个的表要容易,由于对数据库使用更新日志比对表要容易。

恢复整个数据库

    首先,如果要恢复的数据库是含有授权表的mysql数据库,将需求使用- - s k i p - g r a n t - tables选项运转服务器。否则,服务器将抱怨无法找到授权表。在恢复表之后,执行mysqla d m i n flush-privileges 来通知服务器加载授权表,并用它们启动。
    将原数据库目录的内容拷贝到其他的地方。例如,您可能会在稍后用它们进行崩溃表的事后分析检查(post-mortem examination)。
    用最新的备份文件重新加载数据库。如果您打算使用由mysqldump 加载的文件,则需求将它们作为mysql的输入。如果打算使用从数据库中直接拷贝的文件(如,用tar 或c p),则将它们直接拷贝回到该数据库目录中。但是,在这种情况下,应该在拷贝这些文件之前关闭服务器,然后再重新启动它。
    用更新日志重做在进行备份后又修正了数据库表的查询。对于所有可用的更新日志,可使用它作为mysql的输入。指定--one-database 选项,使mysql只对想要恢复的数据库执行查询。如果您知道需求使用所有的更新日志文件,可在包含日志的目录中使用
下列命令:
    % ls -t -r -l update.(0-9)* | xargs cat | mysql--one-database db_name
    ls 命令产生更新日志文件的单列列表,更新日志文件依据服务器生成的顺序进行排序(要知道,如果您修正了其中的任何文件,排序的顺序都将改变,这将导致更新日志按错误的顺序使用)。
    您很可能必须使用某些更新日志。例如,如果自备份以来所产生的日志命名为up date . 3 9 2、update.393 等等,可以重新运转它们中的命令:
    % mysql--one-database db_name < updata.392
    % mysql--one-database db_name < updata.393
    。。。
    如果正在运转恢复并打算使用更新日志恢复由于失策的DROP DATA B A S E、D R O P TABLE 或DELETE 语句而丢失的信息,应确保先从更新日志中删除这些语句。

恢复单个的表

    恢复单个表是很困难的。如果有通过mysqldump 生成的备份文件并且它恰好不包含您想要的表数据,则需求抽取相关的行并用它们作为mysql的输入,这部分较容易。困难的是抽取使用于该表的更新日志的片段。您会发现: mysql_find_rows 实用程序对这方面有协助,它可以从更新日志中抽取多行查询。
    另一种可能性是用另一个服务器恢复整个数据库,然后将所要的该表的文件拷贝到原始数据库中。这实际很容易!在将文件拷贝回数据库目录时,应确保原始数据库的服务器关闭。