MySQL通过binlog恢复数据


Posted in MySQL onMay 27, 2021

mysql 日志文件

任何成熟软件都会有一套成熟的日志系统,当软件出现问题时,这些日志就是查询问题来源的宝库。同样,mysql也不例外,也会有一系列日志记录mysql的运行状态。

mysql主要有以下几种日志:

  • 错误日志:记录mysql运行过程中的错误信息
  • 一般查询日志:记录mysql正在运行的语句,包括查询、修改、更新等的每条sql
  • 慢查询日志:记录查询比较耗时的SQL语句
  • binlog日志:记录数据修改记录,包括创建表、数据更新等

这些日志均需要在my.cnf文件进行配置,如果不知道mysql的配置文件路径,可以使用mysql命令进行查找,

mysql --verbose --help|grep -A 1 'Default options' #该命令会罗列出my.cnf顺序查找的路径。

binlog日志

binlog就是binary log,二进制日志文件,记录所有数据库更新语句,包括表更新和记录更新,即数据操纵语言(DML),binlog主要用于数据恢复和配置主从复制等;

数据恢复:当数据库误删或者发生不可描述的事情时,可以通过binlog恢复到某个时间点的数据。主从复制:当有数据库更新之后,主库通过binlog记录并通知从库进行更新,从而保证主从数据库数据一致;

mysql按照功能分为服务层模块和存储引擎层模块,服务层负责客户端连接、SQL语句处理优化等操作,存储引擎层负责数据的存储和查询;binlog属于服务层模块的日志,即引擎无关性,所有数据引擎的数据更改都会记录binlog日志。当数据库发生崩溃时,如果使用InnoDB引擎,binlog日志还可以检验InnoDB的redo日志的commit情况。

binlog日志开启

日志开启方式:

1、添加配置

log_bin=ON
log_bin_basename=/path/bin-log
log_bin_index=/path/bin-log.index

2、仅仅设置log-bin参数

log-bin=/path/bin-log

当开启binlog日志之后,mysql会创建一个 log_bin_index指定的 .index 文件和多个二进制日志文件,index中按顺序记录了mysql使用的所有binlog文件。binlog日志则会以指定的名称(或默认值) 加自增的数字作为后缀,ex:bin-log.000001,当发生下述三种情况时,binlog日志便会进行重建:

文件大小达到max_binlog_size参数的值 执行 flush logs命令 重启mysql服务

binlog 日志格式

通过参数binlog_format参数的值,可以设置binlog的格式,可选值有 statement、row、mixed * statement格式:记录数据库执行的原始SQL语句 * row格式:记录具体的行的修改,这个为目前默认值 * mixed格式:因为上边两种格式各有优缺点,所以就出现了mixed格式

binlog日志查看工具:mysqlbinlog

因为binlog是二进制文件,不能像其他文件一样,直接打开查看。但mysql提供了binlog查看工具mysqlbinlog,可以解析二进制文件。当然不同格式的日志解析结果是不一样的; 1. statement格式日志,执行mysqlbinlog /path/bin-log.000001,可以直接看到原始执行的SQL语句 2. row格式日志,则可读性没有那么好,但仍可通过参数使文档更加可读 mysqlbinlog -v /path/bin-log.000001

mysqlbinlog两对非常重要的参数 1. --start-datetime --stop-datetime 解析某一个时间段内的binlog; 2. --start-position --stop-position 解析在两个position之间的binlog;

使用binlog恢复数据

使用binlog恢复数据,本质上就是通过binlog找到所有DML操作,去掉错误的SQL语句,然后重走一遍长征路,就可以将数据恢复;

线下实操

1.创建数据表并插入初始值

CREATE TABLE `users` (
              `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
              `name` varchar(255) DEFAULT NULL,
              `age` int(8) DEFAULT NULL,
              PRIMARY KEY (`id`)
     ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
     INSERT INTO `users` (`id`, `name`, `age`)
        VALUES
            (null, '姓名一', 5);

2.找到上一次全量备份的数据库和binlog的position(ps:当然也可以通过时间进行恢复)。此处以目前状态作为备份的初始值,

mysqldump -uroot -p T > /path/xxx.sql;   # 备份数据库
    show master status;   # 查看当前的position位置,此时值为154

3.插入多条记录

INSERT INTO `users` (`id`, `name`, `age`)
  VALUES
     (null, '姓名二', 13),
     (null, '姓名三', 14),
     (null, '姓名四', 15),
     (null, '姓名五', 16),
     (null, '姓名六', 17);

4.进行误操作,并且在误操作之后又插入几条数据

update users set age = 5;
 INSERT INTO `users` (`id`, `name`, `age`)
 VALUES
    (null, '姓名七', 16),
    (null, '姓名八', 18);

5.发现误操作之后,进行数据恢复,首先停止mysql对外的服务,利用备份数据恢复到上次数据;

6.通过mysqlbinlog命令对二进制文件进行分析,分析发现

误操作发生在position为706位置,且上次正常操作的结束位置在513
    在1152到结尾位置有正常执行的SQL执行

7.通过mysqlbinlog命令从binlog日志中导出可执行的SQL文件,并将数据导入到mysql

mysqlbinlog --start-position=154  --stop-position=513  bin-log.000001 > /path/bak.sql;
 mysql -uroot -p < /path/bak.sql;

8.跳过错误的更新语句,再通过步骤7的逻辑把后续正常语句重新跑一遍,完成数据恢复工作

小结

无论什么时间,数据库发生崩溃都会令人愁眉紧锁,心烦意乱。binlog可以说是在各种情况下,数据库崩溃、数据丢失之后的一粒后悔药,本文通过线下环境,简单的对数据库进行了一次数据恢复实验,如有不对,还请指教

以上就是MySQL通过 binlog 恢复数据的详细内容,更多关于MySQL binlog 恢复数据的资料请关注三水点靠木其它相关文章!

MySQL 相关文章推荐
MySQL索引篇之千万级数据实战测试
Apr 05 MySQL
MySQL注入基础练习
May 30 MySQL
zabbix监控mysql的实例方法
Jun 02 MySQL
MySQL索引是啥?不懂就问
Jul 21 MySQL
一篇文章看懂MySQL主从复制与读写分离
Nov 07 MySQL
MySQL创建定时任务
Jan 22 MySQL
解析MySQL索引的作用
Mar 03 MySQL
使用Mysql计算地址的经纬度距离和实时位置信息
Apr 29 MySQL
MYSQL常用函数介绍
May 05 MySQL
MySQL 原理与优化之原数据锁的应用
Aug 14 MySQL
了解MySQL查询语句执行过程(5大组件)
Aug 14 MySQL
MySQL实现用逗号进行拼接、以逗号进行分割
Dec 24 MySQL
MySQL 数据类型选择原则
May 27 #MySQL
详解MySQL中的主键与事务
May 27 #MySQL
MySQL中使用or、in与union all在查询命令下的效率对比
MySQL下使用Inplace和Online方式创建索引的教程
May 26 #MySQL
MySQL中InnoDB存储引擎的锁的基本使用教程
May 26 #MySQL
MySql存储过程之逻辑判断和条件控制
MYSQL主从数据库同步备份配置的方法
May 26 #MySQL
You might like
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
北京奥运官方网站幻灯切换效果flash版打包下载
2008/01/30 Javascript
JavaScript 格式字符串的应用
2010/03/29 Javascript
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
2012/03/01 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战一)
2013/08/21 Javascript
仿当当网淘宝网等主流电子商务网站商品分类导航菜单
2013/09/25 Javascript
JavaScript通过事件代理高亮显示表格行的方法
2015/05/27 Javascript
微信企业号开发之微信考勤百度地图定位
2015/09/11 Javascript
Vue2递归组件实现树形菜单
2017/04/10 Javascript
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
2017/04/28 jQuery
微信小程序自定义模态对话框实例详解
2017/08/16 Javascript
js通过Date对象实现倒计时动画效果
2017/10/27 Javascript
js实现以最简单的方式将数组元素添加到对象中的方法
2017/12/20 Javascript
vue 子组件向父组件传值方法
2018/02/26 Javascript
微信小程序webview 脚手架使用详解
2019/07/22 Javascript
微信小程序如何播放腾讯视频的实现
2019/09/20 Javascript
[02:27]DOTA2英雄基础教程 莱恩
2014/01/17 DOTA
[48:35]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 TNC vs Optic
2018/04/03 DOTA
[01:14]英雄,所敬略同——2018完美盛典宣传视频4K
2018/12/05 DOTA
教你用python3根据关键词爬取百度百科的内容
2016/08/18 Python
Python实现学校管理系统
2018/01/11 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
2018/04/19 Python
python 画三维图像 曲面图和散点图的示例
2018/12/29 Python
谈谈Python中的while循环语句
2019/03/10 Python
docker django无法访问redis容器的解决方法
2019/08/21 Python
python轮询机制控制led实例
2020/05/03 Python
终于搞懂了Keras中multiloss的对应关系介绍
2020/06/22 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
2020/09/16 Python
Unix如何在一行中运行多个命令
2015/05/29 面试题
商场拾金不昧表扬信
2014/01/13 职场文书
巧克力蛋糕店创业计划书
2014/01/14 职场文书
图书室管理制度
2014/01/19 职场文书
小学生一分钟演讲稿
2014/08/26 职场文书
小石潭记导游词
2015/02/03 职场文书
学校捐款活动总结
2015/05/09 职场文书
2015年政务公开工作总结
2015/05/19 职场文书