
前提:在利用 日志 恢复数据以前,我们需要知道我们的MYSQL服务器已经开启日志文件,通常情况下,我们可以使用命令 show variables like 'log_%'; 来查看是否存在可使用的日志文件
mysql> show variables like 'log_%';
+---------------------------------+------------------------------------------------------------------------+
| Variable_name | Value
+---------------------------------+------------------------------------------------------------------------+
| log_bin | ON
|
| log_bin_trust_function_creators | OFF
|
| log_error | D:\\Program Files\\MySQL\\MySQL Server 5.5\\Datas\\Data\\PC2011071113yod.err |
| log_output | FILE
|
| log_queries_not_using_indexes | OFF
|
| log_slave_updates | OFF
|
| log_slow_queries | OFF
|
| log_warnings | 1
|
+---------------------------------+------------------------------------------------------------------------+
注意蓝色部分,这里我们要看到的就是这一部分。
这时我们需要到我们的数据存储目录去查看是来有相应的日志文件,假设我们的数据配置文件(my.ini)中存在节点
[mysql]
Log-bin = mysql_bin
如果不存在,请自行配置好(如果你认为你有必要需要日志文件的话)。
这时在data目录中应该包含有 mysql_bin.000001 文件,如果中途有刷新日志文件,则还会生成mysql_bin.000002等更多文件。
到了这里我们可以确定我们的日志文件是存在的,那么我们就要根据数据进行分析恢复,假如我们只有一个日志文件,即 mysql_bin.000001,那么这个日志文件记录了我们从配置日志记录到现在的所有MYSQL数据操作,包括其增、删、改操作,我们现在要做的就是,将日志以.txt文档形式输出,以查看我们所需要的文件部分
实例:
1、打开命令行
2、输入 mysqlbinlog (如果环境变量中包括了这个目录,则会直接提示相关信息,否则提示无此命令,如果没有这个命令,我们可以直接到 MYSQL 的 BIN目录再运行此命令)。
3、详细命令 mysqlbinlog ../data/mysql_bin.000001 H:/001.txt;
4、这时我们就可以在H盘中找到001.txt分析我们所需要的内容了,这里我截取一部分数据,供大家参照。
# at 575
#120221 10:07:21 server id 1 end_log_pos 673 Query thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1329790041/*!*/;
insert into test values (6,'li')
/*!*/;
# at 673
#120221 10:07:21 server id 1 end_log_pos 700 Xid = 21
COMMIT/*!*/;
# at 700
#120221 10:24:57 server id 1 end_log_pos 771 Query thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1329791097/*!*/;
BEGIN
/*!*/;
# at 771
#120221 10:24:57 server id 1 end_log_pos 866 Query thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1329791097/*!*/;
delete from test where id = 3
/*!*/;
# at 866
#120221 10:24:57 server id 1 end_log_pos 3 Xid = 32
COMMIT/*!*/;
DELIMITER ;
DELIMITER /*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
从上述数据中,我们能看到 在 # at 771 位置的时候,我执行了一次 删除数据 操作,那么现在我想要恢复原来所有的数据,这样的话我们就可以使用命令
Mysqlbinlog ../datas/data/mysql-bin.000001 --stop-pos=700 | mysql -uroot -proot
这样,我们省去了删除数据的那一行,所有的数据也是必然的能恢复正常了。
5、那么,如果我是中间执行了一次删除呢?
OK,没有关系,依然是需要用这种办法进行分析,我们只要想办法绕过这一行就可以了。于是我们可以增加 开始位置,如
Mysqlbinlog ../datas/data/mysql-bin.000001 --start-pos=576 --stop-pos=700 | mysql -uroot -proot
六、纵上几个步骤,我们就可以将已经删除或覆盖的数据进行恢复了,注意我们的前提条件。
