热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

利用binlog恢复生产环境误操作的数据

什么是binlogbinlog是记录所有数据库表结构变更(例如CREATE、ALTER、DROPTABLE…)以及表数据修改(INSER

什么是binlog

binlog是记录所有数据库表结构变更(例如CREATE、ALTER、DROP TABLE…)以及表数据修改(INSERT、UPDATE、DELETE…)的二进制日志。切记binlog中是不会记录select、show等对数据库数据库没有产生变更的操作的。


binlog的作用


  1. 数据复制
    在MySQL主从架构中,从库的数据如何保持和主库的数据一致?其实就是利用的binlog,其实在实际的开发中,也有场景使用binlog来同步复制数据,比如将MySQL中的数据同步到ES中等;
  2. 数据恢复
    可以利用数据库备份+binlog恢复任意时间范围的数据;
  3. 数据审计
    用户可以通过二进制日志中的信息来进行审计,判断是否有对数据库进行注入攻击;

mysqlbinlog工具常用命令


mysqlbinlog
常用参数参数说明
-d ,--database=name根据指定库拆分binlog(拆分单表binlog可通过SQL关键字过滤)
-r ,--result-file=name指定解析binlog输出SQL语句的文件
-R,--read-from-remote-server从mysql服务器读取binlog日志,是下面参数的别名
-j,--start-position=#读取binlog的起始位置点,#号是具体的位置点
-j,--start-position=#读取binlog的停止位置点,#号是具体的位置点
--start-datetime=name读取binlog的起始位置点,name是具体的时间,格式为:2004-12-25 11:25:26
--stop-datetime=name读取binlog的停止位置点,name是具体的时间,格式为:2004-12-25 11:25:26
--base64-output=decode-rows解析row级别binlog日志的方法,例如:mysqlbinlog  --base64-output=decode-rows -v  mysqlbin.000016

怎么利用binlog恢复误操作的数据

说一个实际的经历:前几天一个同事上线一个版本,上线后没多久就收到了用户的反馈,系统部分会员等级都没有了(上线版本中有个sql误将部分会员的会员等级给清除了),那个负责此次功能开发的同学第一时间找到了我,想让我帮忙恢复生产的数据。其实这样的时候,我之前的工作生涯中也遇到了两三次,但是基本上都是让运维去操作的,这次需要我亲自去处理。考虑到受影响的数据只有几千条,而且系统服务着几百万的用户,为了保证系统的稳定性和恢复数据的速度,我没有采用备份+binlog的方式进行恢复。我看了下sql的执行时间(2021-02-04 18:00:00),于是我去找个这个时间段的binlog文件,利用mysqlbinlog命令解析出来:

./mysqlbinlog --no-defaults -vv --base64-output=decode-rows --start-datetime='2021-02-04 17:59:50' --stop-datetime='2021-02-04 18:00:10' ~/Desktop/mysql-bin.000992 -r ~/Desktop/hotel.sql

得到这个文件后,记录格式如下:

### UPDATE `hub2`.`es_hotel_member`
### WHERE
### @1='1da3221a351911eb9d5eec0d9a37059e' /* VARSTRING(128) meta=128 nullable=0 is_null=0 */
### @2='34081119980622xxxx' /* VARSTRING(80) meta=80 nullable=1 is_null=0 */
### @3='王伟' /* VARSTRING(240) meta=240 nullable=1 is_null=0 */
### @4=1 /* INT meta=0 nullable=1 is_null=0 */
### @5='1' /* VARSTRING(80) meta=80 nullable=1 is_null=0 */
### @6='340811199806226319' /* VARSTRING(80) meta=80 nullable=1 is_null=0 */
### @7=NULL /* VARSTRING(80) meta=80 nullable=1 is_null=1 */
### @8='2021:02:20' /* DATE meta=0 nullable=1 is_null=0 */
### @9=0 /* TINYINT meta=0 nullable=1 is_null=0 */
### @10='1998:06:22' /* DATE meta=0 nullable=1 is_null=0 */
### @11=NULL /* DECIMAL(19,2) meta=4866 nullable=1 is_null=1 */
### @12=NULL /* DECIMAL(19,2) meta=4866 nullable=1 is_null=1 */
### @13=NULL /* LONGINT meta=0 nullable=1 is_null=1 */
### @14='18016885237' /* VARSTRING(80) meta=80 nullable=1 is_null=0 */
### @15=NULL /* VARSTRING(1020) meta=1020 nullable=1 is_null=1 */
### @16=NULL /* DATETIME(0) meta=0 nullable=1 is_null=1 */
### @17=NULL /* DATETIME(0) meta=0 nullable=1 is_null=1 */
### @18=NULL /* DATETIME(0) meta=0 nullable=1 is_null=1 */
### @19=NULL /* TINYINT meta=0 nullable=1 is_null=1 */
### @20=1 /* TINYINT meta=0 nullable=1 is_null=0 */
### @21=0 /* INT meta=0 nullable=1 is_null=0 */
### @22='37fd332cdeb811e987766c92bf5c82be' /* VARSTRING(128) meta=128 nullable=1 is_null=0 */
### @23=NULL /* VARSTRING(400) meta=400 nullable=1 is_null=1 */
### @24=NULL /* VARSTRING(400) meta=400 nullable=1 is_null=1 */
### @25=NULL /* VARSTRING(400) meta=400 nullable=1 is_null=1 */
### @26=NULL /* VARSTRING(200) meta=200 nullable=1 is_null=1 */
### @27=NULL /* VARSTRING(200) meta=200 nullable=1 is_null=1 */
### @28=NULL /* VARSTRING(4000) meta=4000 nullable=1 is_null=1 */
### @29='2020-12-03 11:39:15.260' /* DATETIME(3) meta=3 nullable=0 is_null=0 */
### @30='system' /* VARSTRING(128) meta=128 nullable=0 is_null=0 */
### @31='2020-12-03 11:39:15.260' /* DATETIME(3) meta=3 nullable=0 is_null=0 */
### @32='system' /* VARSTRING(128) meta=128 nullable=0 is_null=0 */
### @33=0 /* TINYINT meta=0 nullable=0 is_null=0 */
### SET
### @1='1da3221a351911eb9d5eec0d9a37059e' /* VARSTRING(128) meta=128 nullable=0 is_null=0 */
### @2='34081119980622xxxx' /* VARSTRING(80) meta=80 nullable=1 is_null=0 */
### @3='王伟' /* VARSTRING(240) meta=240 nullable=1 is_null=0 */
### @4=1 /* INT meta=0 nullable=1 is_null=0 */
### @5='1' /* VARSTRING(80) meta=80 nullable=1 is_null=0 */
### @6='340811199806226319' /* VARSTRING(80) meta=80 nullable=1 is_null=0 */
### @7=NULL /* VARSTRING(80) meta=80 nullable=1 is_null=1 */
### @8='2021:02:20' /* DATE meta=0 nullable=1 is_null=0 */
### @9=1 /* TINYINT meta=0 nullable=1 is_null=0 */
### @10='1998:06:22' /* DATE meta=0 nullable=1 is_null=0 */
### @11=NULL /* DECIMAL(19,2) meta=4866 nullable=1 is_null=1 */
### @12=NULL /* DECIMAL(19,2) meta=4866 nullable=1 is_null=1 */
### @13=NULL /* LONGINT meta=0 nullable=1 is_null=1 */
### @14='18016885237' /* VARSTRING(80) meta=80 nullable=1 is_null=0 */
### @15=NULL /* VARSTRING(1020) meta=1020 nullable=1 is_null=1 */
### @16=NULL /* DATETIME(0) meta=0 nullable=1 is_null=1 */
### @17=NULL /* DATETIME(0) meta=0 nullable=1 is_null=1 */
### @18=NULL /* DATETIME(0) meta=0 nullable=1 is_null=1 */
### @19=NULL /* TINYINT meta=0 nullable=1 is_null=1 */
### @20=0 /* TINYINT meta=0 nullable=1 is_null=0 */
### @21=0 /* INT meta=0 nullable=1 is_null=0 */
### @22='37fd332cdeb811e987766c92bf5c82be' /* VARSTRING(128) meta=128 nullable=1 is_null=0 */
### @23=NULL /* VARSTRING(400) meta=400 nullable=1 is_null=1 */
### @24=NULL /* VARSTRING(400) meta=400 nullable=1 is_null=1 */
### @25=NULL /* VARSTRING(400) meta=400 nullable=1 is_null=1 */
### @26=NULL /* VARSTRING(200) meta=200 nullable=1 is_null=1 */
### @27=NULL /* VARSTRING(200) meta=200 nullable=1 is_null=1 */
### @28=NULL /* VARSTRING(4000) meta=4000 nullable=1 is_null=1 */
### @29='2020-12-03 11:39:15.260' /* DATETIME(3) meta=3 nullable=0 is_null=0 */
### @30='system' /* VARSTRING(128) meta=128 nullable=0 is_null=0 */
### @31='2020-12-03 11:39:15.260' /* DATETIME(3) meta=3 nullable=0 is_null=0 */
### @32='system' /* VARSTRING(128) meta=128 nullable=0 is_null=0 */
### @33=0 /* TINYINT meta=0 nullable=0 is_null=0 */

至此,恢复数据就比较简单了,因为这里记录了sql之前前后数据的变化,只需要写段代码解析一下就可以了。


推荐阅读
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Oracle10g备份导入的方法及注意事项
    本文介绍了使用Oracle10g进行备份导入的方法及相关注意事项,同时还介绍了2019年独角兽企业重金招聘Python工程师的标准。内容包括导出exp命令、删用户、创建数据库、授权等操作,以及导入imp命令的使用。详细介绍了导入时的参数设置,如full、ignore、buffer、commit、feedback等。转载来源于https://my.oschina.net/u/1767754/blog/377593。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
author-avatar
mobiledu2502912377
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有