mysql 实例启动利用binlog恢复_mysql利用binlog进行数据恢复
mysql利用binlog进行数据恢复
最近线上误操作了一个数据,由于是直接修改的数据库,所有唯一的恢复方式就在mysql的binlog。binlog使用的是ROW模式,即受影响的每条记录都会生成一个sql。同时利用了
binlog基本配置和格式
binlog基本配置
binlog需要在mysql的配置文件的mysqld节点中进行配置:
# 日志中的Serverid
server-id= 1
# 日志路径
log_bin= /var/log/mysql/mysql-bin.log
# 保存几天的日志
expire_logs_days= 10
# 每个binlog的大小
max_binlog_size = 1000M
#binlgo模式
binlog_format=ROW
# 默认是所有记录,可以配置哪些需要记录,哪些不记录
#binlog_do_db= include_database_name
#binlog_ignore_db= include_database_name
查看binlog状态
SHOW BINARY LOGS; 查看binlog文件
SHOW VARIABLES LIKE '%log_bin%' 查看日志状态
SHOW MASTER STATUS 查看日志文件位置
binlog的三种格式
1.ROW
针对行记录日志,每行修改产生一条记录。
优点:上下文信息比较全,恢复某条误操作时可以直接在日志中查找到原文信息,对于主从复制支持好。
缺点:输出非常大,如果是Alter语句将产生大量的记录
格式如下:
DELETE FROM `back`.`sys_user` WHERE `deptid`=27 AND `status`=1 AND `account`='admin' AND `name`='张三' AND `phone`='18200000000' AND `roleid`='1' AND `createtime`='2016-01-29 08:49:53' AND `sex`=2 AND `email`='sn93@qq.com' AND `birthday`='2017-05-05 00:00:00' AND `avatar`='girl.gif' AND `version`=25 AND `password`='ecfadcde9305f8891bcfe5a1e28c253e' AND `salt`='8pgby' AND `id`=1 LIMIT 1; #start 4 end 796 time 2018-10-12 17:03:19
2.STATEMENT
针对sql语句的,每条语句产生一条记录
优点:产生的日志量比较小,主从版本可以不一致
缺点:主从有些语句不能支持,像自增主键和UUID这种类型的
格式如下:
delete from `sys_role`;
3.MIX
结合了两种的优点,一般情况下都采用STATEMENT模式,对于不支持的语句采用ROW模式
转换成sql
mysql自带的mysqlbinlog
由于binlog是二进制的,所以需要先转换成文本文件,一般可以采用Mysql自带的mysqlbinlog转换成文本。
mysqlbinlog --no-defaults --base64-output='decode-rows' -d room -v mysql-bin.011012 > /root/binlog_2018-10-10
参数说明
--no-defaults 为了防止报错:mysqlbinlog: unknown variable 'default_character_set=utf8mb4'
--base64-output='decode-rows' 和-v一起使用, 进行base64解码
其他有很多用来限定范围的参数,比如数据库,起始时间,起始位置等等。这些参数在查找误操作的时候非常有用。
binlog的基本块如下:
# at 417750
#181007 1:50:38 server id 1630000 end_log_pos 417844 CRC32 0x9fc3e3cd Querythread_id=440109962exec_time=0error_code=0
SET TIMESTAMP=1538877038/*!*/;
BEGIN
# at 417750
指明的当前位置相对文件开始的偏移位置,这个在mysqlbinlog命令中可以作为--start-position的参数
#181007 1:50:38 server id 1630000 end_log_pos 417844 CRC32 0x9fc3e3cd Querythread_id=440109962exec_time=0error_code=0
181007 1:50:38指明时间为18年10月7号1:50:38,serverid也就是你在配置文件中的配置的,end_log_pos 417844,这个块在417844结束。thread_id执行的线程id,exec_time执行时间,error_code错误码
SET TIMESTAMP=1538877038/!/;
BEGIN
具体的执行语句
一行记录产生的日志如下所示
# at 417750
#181010 9:50:38 server id 1630000 end_log_pos 417844 CRC32 0x9fc3e3cd Querythread_id=440109962exec_time=0error_code=0
SET TIMESTAMP=1539136238/*!*/;
BEGIN
/*!*/;
# at 417844
#181010 9:50:38 server id 1630000 end_log_pos 417930 CRC32 0xce36551b Table_map: `goods`.`good_info` mapped to number 129411
# at 417930
#181010 9:50:38 server id 1630000 end_log_pos 418030 CRC32 0x5827674a Update_rows: table id 129411 flags: STMT_END_F
### UPDATE `goods`.`good_info`
### WHERE
### @1='2018:10:07' /* DATE meta=0 nullable=0 is_null=0 */
### @2=9033404 /* INT meta=0 nullable=0 is_null=0 */
### @3=1 /* INT meta=0 nullable=0 is_null=0 */
### @4=8691108 /* INT meta=0 nullable=0 is_null=0 */
### @5=9033404 /* INT meta=0 nullable=0 is_null=0 */
### @6=20 /* LONGINT meta=0 nullable=0 is_null=0 */
### @7=1538877024 /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */
### SET
### @1='2018:10:07' /* DATE meta=0 nullable=0 is_null=0 */
### @2=9033404 /* INT meta=0 nullable=0 is_null=0 */
### @3=1 /* INT meta=0 nullable=0 is_null=0 */
### @4=8691108 /* INT meta=0 nullable=0 is_null=0 */
### @5=9033404 /* INT meta=0 nullable=0 is_null=0 */
### @6=21 /* LONGINT meta=0 nullable=0 is_null=0 */
### @7=1538877024 /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */
# at 418030
#181010 9:50:38 server id 1630000 end_log_pos 418061 CRC32 0x468fb30e Xid = 212760460521
COMMIT/*!*/;
# at 418061
一行记录产生的日志如上所示。以SET TIMESTAMP=1539136238/*!*/;开始,以COMMIT/*!*/;结尾。我们可以根据两个at指明的位置来限定范围。
注意一条记录开始的SET TIMESTAMP之前的# at 417750和结尾的COMMIT之后的# at 418061
利用binlog2sql
binlog2sql官网介绍:从MySQL binlog解析出你要的SQL。根据不同选项,你可以得到原始SQL、回滚SQL、去除主键的INSERT SQL等。
基本使用如下:
python binlog2sql.py -hlocalhost -P3306 -udev -p'\*' -d room -t room_info --start-file='mysql-bin.011012' --start-position 129886892 --stop-position 130917280 > rollback.sql
具体的使用我就不讲解了github上讲解的十分清楚,主要看下很多用来筛选的条件,比如起止时间--start-datetime/--stop-datetime,表名限定-t,数据库限定-d,语句限定--sql-type,主要说说我遇到的一些问题。
mysql的binlog模式
这里需要设置为ROW,因为ROW模式有原来的信息,如果可以直接利用binlog2sql反向生成回滚sql,如果是STATEMENT无法生成,需要利用的mysql定时备份的文件再去做回滚
恢复数据的具体操作
因为当时线上执行的是一条update语句,没有唯一键索引的。导致有两千多条记录被更新。语句如下:
update room_info set status=1 where status=2;
根据操作时间先定位对应的binlog文件
我记得当时操作的时间大概的是上午9多左右,所以去找对应的binlog文件最后修改时间大于9点并且时间最接近的一个文件。使用linux的ll命令查看文件的修改时间。
筛选具体的数据库
因为一个mysql实例的所有binlog文件是在一个文件中的,所以我们先要去除其他不想关的数据库。利用-d参数来指明数据实例。然后在利用开始时间(--start-datetime)和结束时间(--stop-datetime)来进一步筛选
mysqlbinlog --no-defaults -v --base64-output='decode-rows' -d room --start-datetime='2018-10-10 9:00:00' --stop-datetime='2018-10-10 10:00:00' mysql-bin.011012>temp.sql
压缩取回文件分析
zip temp.zip temp.sql && sz temp.zip
取回文件在本地用文本工具如vscode分析,里面有正则匹配,根据你改动过的特征,比如我有个房间号888888,这个不应该被修改,你就查看这个房间号的修改记录,ROW模式的语句是Where在前,set在后。利用正则room_id=888888.*show_state=1.*AND show_state=2很快就能匹配到。我当时的语句影响了两千多条记录,你根据找到的语句去找开始的SET TIMESTAMP=1539136238的位置之前的at和结尾的COMMIT之后的at。
利用binlog2sql生成回滚语句
python binlog2sql.py -hlocalhost -P3306 -udev -p'*' -d room -t room_info -B --start-file='mysql-bin.011012' --start-position 129886892 --stop-position 130917280 > rollback.sql
另外
因为我这边是一条update影响多条的情况,如果是带唯一键的情况下,影响的只有一条记录,完全没必要这么麻烦,直接利用binlog2sql带上-d和-t参数限定数据库和表,然后利用grep来查找,直接可以得出对应的sql。mysqlbinlog少了一个限定表和限定语句的功能。比如精确到一张表的Delete语句,能减少很多的数据,能快速定位。
mysql 实例启动利用binlog恢复_mysql利用binlog进行数据恢复相关推荐
- mysql未开启binlog恢复_mysql 开启binlog,并恢复数据操作
binlog是二进制日志文件,用于记录mysql的数据变更,数据在恢复的时候binlog日志能起到很大的作用.mysql的主从复制就是利用的binlog原理 本文目录 一.开启binlog 二.测试数 ...
- mysql根据bin log恢复_MySQL 通过 binlog 恢复数据
目的 通过了解 binlog 日志的相关配置,简单掌握通过 binlog 对数据库进行数据恢复操作: mysql 日志文件 任何成熟软件都会有一套成熟的日志系统,当软件出现问题时,这些日志就是查询问题 ...
- mysql推binlog流_MySQL中binlog日记清理
以下的文章首要讲述的是对自动清理MySQL binlog日记与手动删去的实际处理完成方案的设置, 我们大家都懂得MySQL数值库从复制(replication)接纳了RBR 模式之后,binlog 的 ...
- mysql binlog 丢失_mysql数据库binlog丢失引起的问题
线上某业务需要对日志信息入库并进行分析最后呈现在管理后台上.某天突然发现后台没有前一天的分析数据.首先认为是java程序问题,于是查看应用程序日志,发现数据缺失的那天应用程序日志也没有记录,很是奇怪. ...
- Mysql当前模式让不记录日志_MySQL日志binlog的三种模式
1三种模式的介绍 二进制日志binlog作用: 1.以二进制形式记录更改数据库的SQL语句(insert,update,delete,create,drop,alter等) 2.用于Mysql主从复制 ...
- mysql 用户无法读取日志文件_MySQL读取Binlog日志常见的3种错误
1. mysqlbinlog: [ERROR] unknown variable 'default-character-set=utf8mb4' 当我们在my.cnf中添加default-charac ...
- mysql 8.0数据备份恢复_MySQL 8.0 增强逻辑备份恢复工具介绍-爱可生
作者:杨涛涛 资深数据库专家,专研 MySQL 十余年.擅长 MySQL.PostgreSQL.MongoDB 等开源数据库相关的备份恢复.SQL 调优.监控运维.高可用架构设计等.目前任职于爱可生, ...
- mysql数据库整体备份和恢复_MySQL 数据库的备份和恢复
MySQL 数据库的备份和恢复 基本知识>>>>>>> 逻辑备份: 1.mysqldump(数据导出工具) mysqldump options db_name ...
- mysql的binlog开启方式,查看方式.三种binlog模式介绍.以及使用binlog恢复数据.删除binlog
判断MySQL是否已经开启binlog SHOW VARIABLES LIKE 'log_bin'; 查看MySQL的binlog模式 show global variables like " ...
最新文章
- gmr 通信 matlab,matlab使用TCP/IP Server Sockets
- python和php对比
- ClassLoader.getResourceAsStream(name);获取配置文件的方法
- 用VC写Assembly代码(6)--附录3[X86指令使用详解]
- mysql数据库权限传递,mysql数据库权限分配-参考
- mysqldump 导入导出数据
- asp.net设置元素css的属性
- Atitit 图片 验证码生成attilax总结
- 8、Linux下文件服务器搭建及原理讲解
- RouterOS 端口映射
- ios睡眠分析 卧床 睡眠_使用Swift在HealthKit中进行睡眠分析
- 新浪vip邮箱 服务器,新浪手机邮箱
- 人在职场:可以让你少奋斗10年的工作经验
- Word处理控件Aspose.Words功能演示:使用Java合并MS Word文档
- excel 重复方差分析_如何在Excel中运行方差方差分析的两种方法
- flash特效原理:图片切换滚动
- linux下实现dlna识别当前音频格式,如何将实时音频流设置为DLNA兼容设备?
- CDA LEVEL 1 考试,知识点汇总《市场调研》
- flutter实现多语言之项目使用
- 单片机开发教程1——开发环境的搭建
热门文章
- 医疗保健、零售、金融、制造业……一文带你看懂大数据对工业领域的影响!...
- 腾讯启动“SaaS技术联盟”联合行业制定互联互通标准
- 全球再迎超级飓风,黑客可利用微软“蠕虫级”高危漏洞暴击全球
- C语言 单链表查找出倒数第,查找单链表倒数第k个元素
- 读研期间一定得看论文吗_读研期间各阶段的目标和任务,你明确吗?
- 分布式6大核心专题_分布式Session
- Apache JMeter 背景颜色修改
- linux CentOS7最小化安装环境静默安装Oracle11GR2数据库(oracle基础配置_04)
- Flowable通过api查询流程返回流程图节点
- NB企业级微服务框架