日期:2014-05-16  浏览次数:20723 次

MySQL使用二进制日志来恢复数据的方法

如果你不小心执行了drop table怎么办,先不要冒汗,假如你保留了完整的二进制日志的话,  这是可以恢复的,MySQL服务器启用了二进制日志,你就可以使用Mysqlbinlog工具来恢复从指定的时间点开始直到现在或另一个指定的时间点的数据。
从二进制日志恢复数据,你需要知道当前二进制日志文件的路径和文件名。一般可以从选项文件(取决于你的系统)中找到路径。如果未包含在选项文件中。Mysqlbinlog工具的使用,大家可以看MySQL的帮助手册。里面有详细的用法。

在这个例子中,重点是体现--start-position、--stop-position和—start-datetime、stop-datetime参数的使用。其含义是从二进制日志中第个位置等于N参量时的事件开始读,从二进制日 志中第个位置等于和大于N参量时的事件起停止读。

案例:
1、操作系统:Linux
2、数据库版本:Mysql5.0
3、问题描述:误对XXXDB数据库的XXX_TABLE等表进行DROP后,并重新创建了被DROP表,且实现了对数据的重新录入。如下脚本:
drop table XXX_TABLE;
create table ts_user(
id int auto_increment not null primary key;
name varchar(50);
pass varchar(50)
)
insert into XXX_TABLE values('tiancom','tiancom');

4、需求分析:要求对XXXDB数据库的XXX_TABLE等表进行还原到误操作DROP之前的状态。
5、操作步骤:
1.1、找到mysql二进制日志文件的存放目录,目录在/usr/local/mysql/date
1.2、通过cd 命令进入到Mysql的安装目录/usr/local/mysql/bin
1.3、进入1.2的目录后可以通过命令mysqlbinlog /usr/local/mysql/date/xx查看日
志文件;因数据库字符集的问题,在此步骤可能出现“default-character-set=utf8”的错误,为了设置字符集的差异问题和方便对日志查看,我们的命令可以修改为:mysqlbinlog --no-
defaults /usr/local/mysql/date/ xxx_db-bin.000001 > /usr/log.txt。最终的日志详细信息可以在usr目录的log.txt查看。
1.4、处理方法:
方法1:position
打开日志我们可以找到执行create table xxx_db之后和drop table xxx_db之前的position, 假如是20, 1000;
#mysqlbinlog --no-defaults--start-position="20" --stop-position="1000" /usr/local/mysql/date/xxx_db-bin.000001 | mysql -u root
方法2:datetime
#mysqlbinlog --no-defaults --start-datetime="2012-08-15 8:20:00" --stop-datetim="2012-08-15 10:25:00" /usr/local/mysql/date/xxx_db-bin.000001 | mysql -u root
如果create table xxx_db和drop table xxx_db之间的时间相距是较长, 或者分别在不同的二进制日志中,这样能行吗?答案告诉你就等着失眠!
方法3:
如在不同的二进制日志文件,或者二进制日志文件已经大于等于3个(第3个是记录你误操作的),那么我们的处理方法是#mysqlbinlog  --no-defaults  /usr/local/mysql/date/xxx_db-
bin.000001(000002….) | mysql -uroot –p,执行到你误操作日志之前的2个日志,因为我们要做的是正确的全部数据,也就是我们不希望去重做误操作这个语句所以不需要执行000003;

不小心执行了drop table xxx_db, 实际方法告诉你恢复是不成问题的,但是与其我们绷紧神经来处理这个意外的问题,不如做好数据备份;