本文地址:https://www.askmaclean.com/archives/mysql-data-recovery.html
11.8 数据恢复
进行数据恢复操作的前提是你需要一份备份,作为恢复所需的一部分。它可以是你数据库某个时间点所做的snapshot快照(当进行备份时)。不过,对于一个活动的服务端,数据会在最近的备份之后就会发生改变。因此恢复操作所需的另一部分材料则是服务端之后所做的数据变更记录 —— 也就是,binary log。因此一个恢复操作涉及到使用备份来恢复数据库并且之后重新执行在binary log中所包含的备份之后的数据修改操作。
通常恢复操作有以下步骤:
- 首先对数据存放目录进行拷贝,这是为了防止在恢复时出错而以防万一。
- 使用备份文件恢复数据库。如果你已经制作有一个二进制备份,那么这个步骤涉及到关闭服务端并使用这些备份来替换丢失或损坏的文件。
- 重新执行在备份后记录在binary log中的数据修改操作。
11.8.1 导入mysqldump输出
可以使用mysqldump工具来导出数据并生成SQL格式的dump文件,之后通过mysql客户端工具来执行此文件进行导入操作。例如,你可以使用如下语句来生成一份world数据库下Country表的dump文件:
shell> mysqldump world Country > dump.sql
之后的数据库导入,则使用mysql:
shell> mysql world < dump.sql
当mysqldump的输出文件中没有指定数据库时,你在使用mysql客户端工具命令时就有必要指定到某个需要操作的库。如果在mysqldump执行中带有 –database 或 –all-databases项时,所生成的dump文件则已包含有相应的 USE db_name语句。
mysqldump在使用时不仅仅可用于恢复表和数据库,同时和mysql一起使用也可起到类似”拷贝”的用途。mysql可以直接从管道支进行读取,因此两个命令可以组合成一条命令来将库中的表拷贝到另一个库中。例如,将world数据库中Country表拷贝到test库中,使用以下命令:
shell> mysqldump world Country | mysql test
管道技术也可以将数据库或表通过网络拷贝到另一个远端库中。如,远端主机为other.host.com:
shell> mysqldump world Country | mysql -h other.host.com world
如果dump文件中包含有很长的INSERT语句,那么这可能会超出默认到通信缓冲(communication buffer: 1M)。你可以对mysqldump和mysql通过使用 --max-allowed-packet
项来增大缓冲大小。这个命令项可以设置一个单位为byte的值或者值后加上K,M或G来指明大小。例如,--max-allowed-packet=32M
定义了大小为32MB。服务端也需要在运行时使用 --max-allowed-packet
值来增大其自身的通信缓冲,使其足够大。
当你使用mysqldump时使用了 --tab
项,那么它会生成一个以tab制表符分隔的数据文件。对于这种dump文件,重新导入时则需要注意使用相应的方法。假设你的dump文件对应导出表world.City使用/tmp目录在作为输出目录:
shell> mysqldump --tab=/tmp world City
输出将分两部分,一部分为一个包含有City表CREATE TABLE语句的City.sql文件,另一部分为一个City.txt文件包含了相应的表数据。当使用这些文件进行表导入时,首先切换当前路径到导出的目录,然后使用mysql来处理.sql文件,之后只用mysqlimport来导入.txt中的表数据。
shell> cd /tmp shell> mysql world < City.sql shell> mysqlimport world City.txt
如果你在使用 --tab
项时还结合其它格式控制项如 --fields-terminated-by
和 --fields-enclosed-by
一起使用,那么在使用mysqlimport进行导入时,就需要使用对应相同的格式控制项来使得命令程序知道如何翻译数据文件以进行导入。