MySQL使用二进制日志恢复数据

转载自:

http://blog.youkuaiyun.com/liangCK/archive/2009/04/27/4129920.aspx

http://blog.chinaunix.net/u1/54130/showart_1912663.html

不错的东西,学习了下,做个记录。

mysqlbinlog 工具的使用 , 大家可以看 MySQL 的帮助手册。里面有详细的用,在这个例子中,重点是 --start-position 参数和 --stop-position 参数的使用。

 

· --start-position=N

从二进制日志中第 1 个位置等于 N 参量时的事件开始读。

· --stop-position=N

从二进制日志中第 1 个位置等于和大于 N 参量时的事件起停止读。

 

OK ,现在开始,要启动二进制日志记录,要先在 my.cnf / my.ini 文件的 mysqld 里添加

log-bin= 日志名

在这里,偶是的设置是 log-bin=liangck

然后再启动 mysql 服务,因为偶是用 windows 系统,所以执行 net start mysql 命令即可。

 

然后在一测试数据库里,创建一个表,并添加记录。

mysql>  create  table  test( id int  auto_increment not  null  primary  key , val int , data varchar ( 20));

 

mysql>  insert  into  test( val, data)  values ( 10, 'liang' );

Query OK,  1 row affected  ( 0.03 sec)

 

mysql>  insert  into  test( val, data)  values ( 20, 'jia' );

Query OK,  1 row affected  ( 0.08 sec)

 

mysql>  insert  into  test( val, data)  values ( 30, 'hui' );

Query OK,  1 row affected  ( 0.03 sec)

 

mysql>  flush logs;    -- 产生第二个日志文件

Query OK,  0 rows  affected  ( 0.09 sec)

 

mysql>  insert  into  test( val, data)  values ( 40, 'aaa' );

Query OK,  1 row affected  ( 0.05 sec)

 

mysql>  insert  into  test( val, data)  values ( 50, 'bbb' );

Query OK,  1 row affected  ( 0.03 sec)

 

mysql>  insert  into  test( val, data)  values ( 60, 'ccc' );

Query OK,  1 row affected  ( 0.03 sec)

 

mysql>  delete  from  test where  id between  4 and  5;   -- 删除记录

Query OK,  2 rows  affected  ( 0.05 sec)

 

mysql>  insert  into  test( val, data)  values ( 70, 'ddd' );

Query OK,  1 row affected  ( 0.03 sec)

 

mysql>  flush logs;           -- 产生第三个文件文件

Query OK,  0 rows  affected  ( 0.11 sec)

 

mysql>  insert  into  test( val, data)  values ( 80, 'dddd' );

Query OK,  1 row affected  ( 0.05 sec)

 

mysql>  insert  into  test( val, data)  values ( 90, 'eeee' );

Query OK,  1 row affected  ( 0.03 sec)

 

mysql>  drop  table  test;        -- 删除表

Query OK,  0 row affected  ( 0.05 sec)

 

――――――――――――――――――――――――――――――――――

OK ,现在测试数据已经建好了,要求是什么呢?

就是将 test 表的数据全部恢复出来。

 

先用 mysqlbinlog 工具将日志文件生成 txt 文件出来分析。

 

F:\Program Files\MySQL_Data\data\log>mysqlbinlog liangck.000001 > G:\001.txt

 

F:\Program Files\MySQL_Data\data\log>mysqlbinlog liangck.000002 > G:\002.txt

 

F:\Program Files\MySQL_Data\data\log>mysqlbinlog liangck.000003 > G:\003.txt

 

通过这三个命令,可以在 G 盘下生成 3 个文件,里面分别记录了日志文件的内容,也就是用户操作的步骤。

因为我们需要重做第一个日志文件的所有操作,所以这里只需要将第一个日志文件全恢复就行了。

F:\Program Files\MySQL_Data\data\log>mysqlbinlog liangck.000001 | mysql -uroot –p

 

Ok, 接着,我们需要分析的是第二个日志文件。为什么要分析它呢,因为它中途执行了一个操作是 DELETE ,因为我们要做的是恢复全部数据,也就是我们不希望去重做这个语句。所以在这里我们要想办法去绕开它。

我们先打开 002.txt 文件来分析一下。

 

/*!40019 SET @@session.max_insert_delayed_threads=0*/;

/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;

DELIMITER /*!*/;

# at 4

#090427 15:27:56 server id 1   end_log_pos 106 Start: binlog v 4, server v 5.1.32-community-log created 090427 15:27:56

BINLOG '

fF71SQ8BAAAAZgAAAGoAAAAAAAQANS4xLjMyLWNvbW11bml0eS1sb2cAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC

'/*!*/;

# at 106

#090427 15:28:37 server id 1   end_log_pos 176 Query   thread_id=1    exec_time=0    error_code=0

use mytest/*!*/;

SET TIMESTAMP=1240817317/*!*/;

SET @@session.pseudo_thread_id=1/*!*/;

SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/;

SET @@session.sql_mode=1344274432/*!*/;

SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;

/*!\C gbk *//*!*/;

SET @@session.character_set_client=28,@@session.collation_connection=28,@@session.collation_server=28/*!*/;

SET @@session.lc_time_names=0/*!*/;

SET @@session.collation_database=DEFAULT/*!*/;

BEGIN

/*!*/;

# at 176

#090427 15:28:37 server id 1   end_log_pos 204 Intvar

SET INSERT_ID=4/*!*/;

# at 204

#090427 15:28:37 server id 1   end_log_pos 312 Query   thread_id=1    exec_time=0    error_code=0

SET TIMESTAMP=1240817317/*!*/;

insert into test(val,data) values(40,'aaa')

/*!*/;

# at 312

#090427 15:28:37 server id 1   end_log_pos 339 Xid = 12

COMMIT/*!*/;

# at 339

#090427 15:28:46 server id 1   end_log_pos 409 Query   thread_id=1    exec_time=0    error_code=0

SET TIMESTAMP=1240817326/*!*/;

BEGIN

/*!*/;

# at 409

#090427 15:28:46 server id 1   end_log_pos 437 Intvar

SET INSERT_ID=5/*!*/;

# at 437

#090427 15:28:46 server id 1   end_log_pos 545 Query   thread_id=1    exec_time=0    error_code=0

SET TIMESTAMP=1240817326/*!*/;

insert into test(val,data) values(50,'bbb')

/*!*/;

# at 545

#090427 15:28:46 server id 1   end_log_pos 572 Xid = 13

COMMIT/*!*/;

# at 572

#090427 15:29:35 server id 1   end_log_pos 642 Query   thread_id=1    exec_time=0    error_code=0

SET TIMESTAMP=1240817375/*!*/;

BEGIN

/*!*/;

# at 642

#090427 15:29:35 server id 1   end_log_pos 670 Intvar

SET INSERT_ID=6/*!*/;

# at 670

#090427 15:29:35 server id 1   end_log_pos 778 Query   thread_id=1    exec_time=0    error_code=0

SET TIMESTAMP=1240817375/*!*/;

insert into test(val,data) values(60,'ccc')

/*!*/;

# at 778

#090427 15:29:35 server id 1   end_log_pos 805 Xid = 14

COMMIT/*!*/;

# at 805

#090427 15:30:21 server id 1   end_log_pos 875 Query   thread_id=1    exec_time=0    error_code=0

SET TIMESTAMP=1240817421/*!*/;

BEGIN

/*!*/;

# at 875

#090427 15:30:21 server id 1   end_log_pos 981 Query   thread_id=1    exec_time=0    error_code=0

SET TIMESTAMP=1240817421/*!*/;

delete from test where id between 4 and 5

/*!*/;

# at 981

#090427 15:30:21 server id 1   end_log_pos 1008     Xid = 15

COMMIT/*!*/;

# at 1008

#090427 15:30:34 server id 1   end_log_pos 1078     Query   thread_id=1    exec_time=0     error_code=0

SET TIMESTAMP=1240817434/*!*/;

BEGIN

/*!*/;

# at 1078

#090427 15:30:34 server id 1   end_log_pos 1106     Intvar

SET INSERT_ID=7/*!*/;

# at 1106

#090427 15:30:34 server id 1   end_log_pos 1214     Query   thread_id=1    exec_time=0     error_code=0

SET TIMESTAMP=1240817434/*!*/;

insert into test(val,data) values(70,'ddd')

/*!*/;

# at 1214

#090427 15:30:34 server id 1   end_log_pos 1241     Xid = 16

COMMIT/*!*/;

# at 1241

#090427 15:30:41 server id 1   end_log_pos 1282     Rotate to liangck.000003   pos: 4

DELIMITER ;

# End of log file

ROLLBACK /* added by mysqlbinlog */;

/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

 

―――――――――――――――――――――――――――――――――――――

 

在这个文件中,我们可以看到 DELETE 的操作的起始位置是 875 ,终止位置是 1008. 那么我们只要重做第二个日志文件的开头到 875 的操作,然后再从 1008 到末尾的操作,我们就可以把数据给恢复回来,而不会 DELETE 数据。所以执行两个命令:

F:\Program Files\MySQL_Data\data\log>mysqlbinlog liangck.000002 --stop-pos=875 | mysql -uroot -p

 

F:\Program Files\MySQL_Data\data\log>mysqlbinlog liangck.000002 --start-pos=1008 | mysql -uroot -p mytest

 

OK, 现在第二个日志文件的数据了。

第三个日志文件也是同理,只要找到 DROP TABLE 的位置,就可以了。

F:\Program Files\MySQL_Data\data\log>mysqlbinlog liangck.000003 --stop-pos=574 | mysql -uroot –p

 

现在我们再查一下数据看看 :

mysql> select * from test;

+----+------+-------+

| id | val   | data   |

+----+------+-------+

|   1 |    10 | liang |

|   2 |    20 | jia    |

|   3 |    30 | hui    |

|   4 |    40 | aaa    |

|   5 |    50 | bbb    |

|   6 |    60 | ccc    |

|   7 |    70 | ddd    |

|   8 |    80 | dddd   |

|   9 |    90 | eeee   |

+----+------+-------+

9 rows in set (0.00 sec)

 

可以看到,全部数据都回来了。

 

数据守护神:深入解析MySQL二进制日志与数据恢复的奥秘 MySQL的二进制日志是一个非常重要的功能,它记录了服务器上执行的所有更改数据库结构或内容的操作语句,包括但不限于INSERT、UPDATE、DELETE等SQL命令。每条记录被称为事件(Event),这些事件按照时间顺序存储,并且每个事件都包含了足够的信息以供后续重放(Replay)。启用二进制日志不仅可以帮助我们追踪数据库的历史变化,还能用于实现主从复制、点故障恢复以及审计跟踪等功能。此外,在某些情况下,通过分析二进制日志中的查询模式,还可以为性能优化提供有价值的线索。 阅读详情

相关推荐

南京邮电大学《数学实验》模块二(函数的迭代)参考答案

【代码】南京邮电大学《数学实验》模块二(函数的迭代)参考答案。

qq_1293730064的博客 3万+

mysqlbinlog 恢复数据的四种方法

mysqlbinlog 命令作用:mysqlbinlog 是用来解析mysql的binlog日志的。[root@MySQL data]# file mysql-bin.000001mysql-bin.000001: MySQL replication log[root@MySQL data]#mysqlbinlog日志无法直接用cat 查看,需要用mysqlbinlog命令...

weixin_33937499的博客 484

利用OrthoFinder做泛基因家族聚类分析

这条命令会将 Arabidopsis_thaliana.TAIR10.59_longest_trans.pep.fa 文件中的所有序列ID,去掉ID中的空格后面的部分,只保留 > 后第一个空格之前的基因ID,并将结果保存在 An1.fasta 文件中。muscle 是一种常用的多序列比对工具,用于基因组或蛋白质序列的比对。基因家族(Gene family),是来源于同一个祖先,由一个基因通过基因重复而产生两个或更多的拷贝而构成的一组基因,它们在结构和功能上具有明显的相似性,编码相似的蛋白质产物。

qq_64400864的博客 2749

使用 MYSQLBINLOG 来恢复数据

今天在家里做了一下试验,终于搞明白了以前做复制的时候没有搞明白的问题。原来BINLOG就是一个记录SQL语句的过程,和普通的LOG一样。不过只是她是二进制存储,普通的是十进制存储罢了。1、配置文件里要写的东西:[mysqld]log-bin=yueliangdao_binglog(名字可以改成自己的,如果不改名字的话,默认是以主机名字命名)重新启动MSYQL服务。二进制文件里面的东西显示的就是执行

twosecond 567

MATLAB语言的并发编程

并发编程是指在同一程序中同时执行多个计算任务。通过将任务分解为较小的子任务,程序可以利用多核处理器的优势,提高计算效率。并发编程与并行编程密切相关,但不完全相同。并行编程强调任务的同时执行,而并发编程则侧重于任务的调度与管理,即使某些任务并没有同时执行。MATLAB的并发编程为数据分析、科学计算等应用提供了强大的支持。通过使用parforparfevalspmd等工具,用户可以轻松实现高效的并行计算。尽管MATLAB的并发编程工具相对简单易用,但在实际应用中仍需关注数据共享、通信、错误处理等问题。

2501_90485575的博客 365

ROS 入门教程:小乌龟仿真器和基础操作

小乌龟仿真器和ros基础操作

zlflll的博客 4125

mysql mysqlbinlog: unknown variable 'default-character-set=gbk'解决方法

mysql   [root@localhost data]# /Data/apps/mysql/bin/mysqlbinlog mysql-bin.000004 > yhs_binlog.log /Data/apps/mysql/bin/mysqlbinlog: unknown variable 'default-character-set=gbk'

Mr_Melody的专栏 4945

ISO 15118-20标准深度解读【精简篇】

ISO 15118-2 是开创者,它解决了“如何让电动汽车充电像给手机充电一样简单(即插即用且自动付费)”的问题,为行业奠定了基础。 ISO 15118-20 是革新者,它站在前者的肩膀上,回答了一个更宏大的问题:“如何让电动汽车深度融入未来的能源系统和智慧城市?” 它不仅是充电协议,更是一个车网互动的综合能源管理协议。简单来说,ISO 15118-2 是关于“如何充电”,而 ISO 15118-20 是关于“如何智慧地使用和管理电动汽车这块大电池”。

网络安全的研究者、新能源行业的追求者 1925

一个简单的binlog恢复测试

日常的数据备份及恢复测试,是DBA工作重中之重的事情,所以要做好备份及测试,日常的备份常见有mysqldump+binlog备份、xtrabackup+binlog备份,无论那一种,几乎都少不了对binlog的备份,说明了binlog在数据恢复中的重要性,下面做个小测试,是工作中不少运维或者新人DBA容易犯的错。 创建一个测试表tb1: <test>(root@loc...

weixin_30596023的博客 399

混沌系统在图像加密中的应用(二维离散Hénon混沌映射)

Hénon映射是一种二维离散时间动力系统,由美国数学家Michel Hénon在1976年引入。它是混沌动力系统中的经典模型之一,具有简单的形式和复杂的行为。

weixin_42207434的博客 2489

STM32解析航模遥控器的PPM信号

使用STM32对航模遥控器的PPM信号进行解析

qq_44343584的博客 9734

mysql通过binlog恢复数据的几种情况

binlog恢复数据的几种情况 1.数据库丢失或者drop 1)恢复系统自动备份 2)用binlog恢复系统备份时间到此刻的的数据(drop操作需要binlog删除drop记录) 2.误操作update,delete 1)恢复系统自动备份 2)在binlog日志中删除误操作的操作语句,执行binlog恢复其他的数据 或者 在binlog中找到误操作的记录,用脚本反生成sql,进行恢

飞龙在天的博客 7407

UI自动化控制PC端微信获取当前群聊的群友列表

在一个月前,某个群友在获取整个群的群友信息时遇到了一点问题: 对整个群进行群友数据获取经测试确实有点棘手,下面我将我的解决过程公布给大家。 基础教程详见: https://blog.youkuaiyun.com/as604049322/article/details/121391639 人工打开要抓取的群聊窗口后,首先获取微信窗口并点击聊天信息按钮: import uiautomation as auto auto.uiautomation.SetGlobalSearchTimeout(1) wechatWind

小小明-代码实体的专栏 3万+

mysql使用二进制日志恢复数据

使用二进制日志恢复mysql数据,恢复到某一个pos,或者恢复到某一个时间点,或者恢复到某一个二进制文件。本文说明了根据二进制恢复数据的详细操作步骤。

3509

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

mysql用过二进制日志恢复_MySQL使用二进制日志恢复数据库

一、二进制日志简介MySQL有不同类型的日志,其中二进制文件记录了所有对数据库的修改,如果数据库因为操作不当或其他原因丢失了数据,可以通过二进制文件恢复。在my.ini文件中设置了log-bin,重新启动MySQL后就开启了二进制日志。数据库每次重新启动(或执行flush logs命令)后,都会生成一个新的二进制日志,如在在my.ini文件中设置了log-bin=F:\mysqllog\logbi...

weixin_28893221的博客 453

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

mysql二进制日志文件恢复数据库_MySQL使用二进制日志恢复数据库

一、二进制日志简介MySQL有不同类型的日志,其中二进制文件记录了所有对数据库的修改,如果数据库因为操作不当或其他原因丢失了数据,可以通过二进制文件恢复。在my.ini文件中设置了log-bin,重新启动MySQL后就开启了二进制日志。数据库每次重新启动(或执行flush logs命令)后,都会生成一个新的二进制日志,如在在my.ini文件中设置了log-bin=F:\mysqllog\logbi...

weixin_32287563的博客 1046

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

mysql 二进制日志恢复_如何通过Mysql的二进制日志恢复数据库数据

经常有网站管理员因为各种原因和操作,导致网站数据误删,而且又没有做网站备份,结果不知所措,甚至给网站运营和盈利带来负面影响。所以本文我们将和大家一起分享学习下如何通过Mysql的二机制日志(binlog)来恢复数据。系统环境:操作系统:CentOS 6.5 X64 (虚拟机);WEB服务:PHP+Mysql+apache;网站:为方便,直接在本地用蝉知系统搭建一个DEMO站点;操作步骤:1.开启...

weixin_39834475的博客 268

mysql 二进制日志恢复_MYSQL如何二进制日志恢复数据库

测试流程:1:打开二进制开关。在INI文件的MYSQLD下,添加log-bin=log,如果不指定=log,那么日志名称为hostname开头。2:指定需要记录日志的数据库名称。在INI文件的MYSQLD下,添加binlog-do-db=dbbin。MYSQL官方建议不在这里过滤日志,在复制的时候到SLAVE用replication-do-db来过滤.3:重新启动MYSQL服务,使前面修改的生效。...

weixin_32561279的博客 266

mysql二进制恢复_mysql使用二进制日志恢复数据

一、恢复到某个二进制文件1.开启二进制日志在mysqld的配置节点下添加如下配置log-bin="E:/Mysql57BinLog/binlog"(windows下的路径,linux下自行修改路径)expire_logs_days=10max_binlog_size=100M2.重启mysql服务使用命令show VARIABLES like '%log_bin%';查看3.创建库和表create...

weixin_32234493的博客 644

mysql使用二进制恢复_mysql使用二进制日志恢复数据

一、恢复到某个二进制文件1.开启二进制日志在mysqld的配置节点下添加如下配置log-bin="E:/Mysql57BinLog/binlog"(windows下的路径,linux下自行修改路径)expire_logs_days=10max_binlog_size=100M2.重启mysql服务使用命令show VARIABLES like '%log_bin%';查看 3.创建库和表creat...

weixin_33188832的博客 532

MySQL二进制日志 恢复数据

MySQL二进制日志 什么是Binlog? 二进制日志:记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中; 主要作用:复制(Master-Slave 主从同步)、恢复和审计。 Binlog相关变量 变量名称 变量含义 相关语句 log_bin ...

大白的博客 629

linux mysql 日志恢复_通过 MySQL 的二进制日志恢复数据库数据

导读经常有网站管理员因为各种原因和操作,导致网站数据误删,而且又没有做网站备份,结果不知所措,甚至给网站运营和盈利带来负面影响。所以本文我们将和大家一起分享学习下如何通过 MySQL 的二机制日志(binlog)来恢复数据。系统环境:操作系统:CentOS 6.5 X64 (虚拟机);Web 服务:PHP+MySQL+apache;网站:为方便,直接在本地用蝉知系统搭建一个演示站点;操作步骤1、开...

weixin_31859277的博客 367

详解mysql的二进制日志恢复数据库

今天是蛋疼的一天,一大早就把客户的服务器

Ze_wait的专栏 1299

利用MySQL 二进制日志恢复数据库

今天无意当中误操作了自己机器上数据库中的一个表。本来也没什么大事。但是后来一想万一遇到这种情况我该什么办?打开了手册看了一下,如果在启动MySQL时启用了bin日志,则可以利用日志来恢复。 MySQL的二进制日志记录了对数据库进行修改的所有SQL语句。当然在恢复之前你需要事先知道当前的MySQL的二进制日志的位置和名称,默认情况下,MySQL会将这个文件直接放在数据目录下。但是你可以在

magento网站建设,magento模板开发,magento支付模块 2290
上一篇: 浅谈CSRF攻击方式(转-图文说明)
下一篇: 关于IE对z-index的解析
gwikimo
博客等级 码龄18年 4粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值