mysql的binlog进行数据恢复
什么是binlog?
binlog,也称为二进制日志,记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中,可以用来查看数据库的变更历史(具体的时间点所有的SQL操作)、数据库增量备份和恢复(增量备份和基于时间点的恢复)、Mysql的复制(主主数据库的复制、主从数据库的复制)。
如何开启binlog?
首先我们可以进入mysql输入命令
- show variables like '%bin%'
我们可以通过这个命令来查询关于binlog相关的设置,其中有一个log_bin选项,如果为off,那么证明我们的binlog没有开启,如果为on证明我们的binlog已经开启,开启binlog的方法很简单,只需要打开mysql的配置文件my.ini(也可能是my.cnf),找到log-bin,去掉前面的#号,如果没有该选项,则可以手动添加。
- log-bin=mysql-bin
其中mysql-bin就是日志文件的名称了,日志文件的名称和路径都可以自定义,如果不配置路径和名称,那么该文件会出现在mysql/data目录下,名称为mysql-bin.xxxxxx。
添加完成后重启mysql,我们就会在mysql/data目录下找到binlog日志文件了,首次使用binlog的时候会出现两个文件,一个是mysql-bin.000001,一个是mysql-bin.index,其中,000001结尾的文件就是我们需要的日志文件,它包含了我们数据库的所有增,改,删操作(查询操作不做记录),以index结尾的文件是索引文件,包含了所有的以000xxx结尾的日志文件。
开启binlog后mysql会自动为了记录以后增,改,删操作,关于备份操作无需我们手动操作,我们只要在需要恢复数据的时候查找对应的数据即可,由于binlog存储的格式为二进制,因此我们无法直接使用,需要借助mysql提供的工具mysqlbinlog(mysqlbinlog在mysql安装目录下的bin目录下)。初次接触一个命令不知道如何使用的时候,我们可以通过帮助命令查看它如何使用
- mysqlbinlog --help
通过该命令我们可以了解到mysqlbinlog可以附带哪些参数,不同的参数对应什么状况。
如何使用mysqlbinlog查询操作记录?
1.读取所有数据库的操作
- mysqlbinlog ../data/mysql-bin.000001
通过该命令,我们可以看到该日志文件中记录的所有数据库的增,该,删操作。
2.查询指定数据库的操作
- mysqlbinlog --database=test ../data/mysql-bin.000001
通过该命令,我们可以查询数据库名称为test的增,该,删操作
3.查询指定位置的操作
binlog每次进行记录的时候都会为其标注一个position,用于标识该操作所在的位置,与之相关的参数为--start-position(开始位置)和--stop-position(结束位置),我们可以通过position进行指定操作的查询。

- mysqlbinlog --start-position=4 --stop-position=98 ../data/mysql-bin.000001
4.查询指定时间的操作
除了有位置标识外,binlog还有时间标识,参数为--start-datetime(开始时间)和--stop-datetime(结束时间),如果想要查询某个时间段的操作,可以使用该参数。
- mysqlbinlog --start-datetime="2015-08-08 10:00:00" --stop-datetime="2015-08-08 12:00:00" ../data/mysql-bin.000001
常用的查询操作也就这么多了,查询操作不是我们的目的,恢复记录才是我们的目的,一切的查询都是为了恢复。
如何恢复删除记录?
如果你对于查询操作了如指掌了,那么恢复操作就简单的多了,因为恢复数据就是在查询的基础上,恢复的方法大致分为两种:
1.直接使用mysqlbinlog进行查询带恢复
- mysqlbinlog --start-position=4 --stop-position=98 ../data/mysql-bin.000001 | mysql -u root -p
上述命令跟查询操作不同的地方在于尾部添加了“| mysql -u root -p”,该命令是用于连接数据库,整条命令连接起来就是恢复开始位置为4,结束位置为98的所有操作(不限于单行记录的恢复,如果想要用于连续的多行操作,只需要把最后的结束位置设置为最后一个需要进行恢复的行的End_log_pos即可)
2.先导出查询记录,然后通过mysql source操作进行数据恢复
- mysqlbinlog --start-position=4 --stop-position=98 ../data/mysql-bin.000001 > test.sql
- mysql>source test.sql
恢复数据实例
首先开启binlog,然后新建一个logtest数据库,然后新建一个test数据表,插入几条测试数据,然后删除,此时我们使用binlog来恢复数据
- mysqlbinlog --database=logtest --start-position=98 --stop-position=664 ../data/mysql-bin.000001 | mysql -u root -p
数值98是对数据库logtest的首次操作的Pos,数值664是对数据库logtest删除前的最后一次操作的End_log_pos,binlog的操作记录都在mysql-bin.000001中存储着,我们可以通过上述命令来恢复已经被删除的数据库logtest,从下图中我们可以看到1070-1636重复了98-664的动作,重新建立数据库,数据表和插入数据,我们再来打开数据库,发现被删除的数据库logtest,数据表test以及插入test的数据都已经被找回来了。
当然使用binlog恢复的时候一定要注意几个问题:
问题一:为什么使用mysqlbinlog --database=logtest ../data/mysql-bin.000001 | mysql -u root -p恢复数据不管用?
其实并非该命令出错,而是日志中同时记录了最后一个drop操作,在没有选在position和datetime的情况下,binlog会读取有关该数据库的所有记录,从create到drop,使用该命令的情况下会重新把create到drop的语句再执行一遍,而在我们看来跟什么都没有做差不多,但是你再次使用mysqlbinlog查看该数据库的相关操作记录的时候就会发现,从create到drop的操作出现了两次,证明该命令的确被执行过,不过由于最后有drop语句,因此被恢复的数据库信息又被删除,回到没有恢复的状态。因此该命令不适用于数据的恢复,想要恢复数据,还要根据情况选择指定的时间或者位置。
问题二:为什么使用position参数的时候数据恢复不完全?
选择position的时候也是非常有讲究的,就拿上图来说,如果执行命令语句的时候,只是执行到492
- mysqlbinlog --database=logtest --start-position=98 --stop-position=492 ../data/mysql-bin.000001 | mysql -u root -p
那么进行数据恢复的时候只能恢复logtest数据库和test数据表,而不能恢复数据表中的数据,Pos是一条记录的起始位置,End_log_pos是一条记录的结束 ,如果想要恢复某连续行的数据的时候,不要忘了把最后一行需要恢复的数据的End_log_pos作为stop-position,而不是把Pos作为stop-position。
注意事项
1.每当重启mysql的时候,都会自动生成一个新的binlog文件,恢复数据的时候首先确定需要恢复的数据在哪个日志文件中,然后查找对应binlog文件进行数据恢复。
2.binlog分别记录了一个操作的起始位置Pos和结束位置End_log_pos,当起始位置和终止位置都选择正确的时候,恢复的数据才会正确,尤其是当进行连续的多行记录进行恢复的时候,对于stop-position的选择一定要注意,最后一行的End_log_pos才是我们需要的。
3.使用show binlog events的时候默认指定的是第一个二进制文件,如果想要查看其它的二进制文件,可以使用show binlog events in 'logname',其中logname是个字符串,不要忘记带上引号,否则会出错。
mysql的binlog进行数据恢复的更多相关文章
- mysql利用binlog进行数据恢复
目录 mysql利用binlog进行数据恢复 binlog基本配置和格式 binlog基本配置 查看binlog状态 binlog的三种格式 转换成sql mysql自带的mysqlbinlog 利用 ...
- 解说mysql之binlog日志以及利用binlog日志恢复数据
众所周知,binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 废 ...
- 不小心删除数据--利用MySQL的binlog恢复数据
MySQL Binary Log也就是常说的bin-log, ,是mysql执行改动产生的二进制日志文件,其主要作用有两个: * 数据回复 * 主从数据库.用于slave端执行增删改,保持与maste ...
- mysql通过binlog日志来恢复数据
简介 在生产的过程中有这么一个业务场景:比如我在2016-11-19 09:30:00 通过mysqldump的方式备份了数据库,但是在2016-11-19 10:30:00的时候数据库崩溃了,如果通 ...
- mysql之binlog
binlog 基本认识 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日 ...
- MySQL的binlog恢复(Windows下)
前言 在最近的工作中,由于自己粗(zuo)心(si)误update操作导致几百行的数据出现错误,在心急如焚的同时(那时候我竟然不知道除了备份之后还有binlog日志恢复)立马查资料学习binlog的恢 ...
- Mysql之binlog日志说明及利用binlog日志恢复数据操作记录
众所周知,binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 一 ...
- MySQL 误操作后数据恢复(update,delete忘加where条件)【转】
在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句 写的有问题导致服务器出问题,导致资源耗尽.最危险的操作就是在做DML操作的时候忘加where条件,导致全表更新,这是作为运维或者 ...
- MySQL的binlog日志<转>
binlog 基本认识 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日 ...
随机推荐
- TPL DataFlow初探(二)
上一篇简单的介绍了TDF提供的一些Block,通过对这些Block配置和组合,可以满足很多的数据处理的场景.这一篇将继续介绍与这些Block配置的相关类,和挖掘一些高级功能. 在一些Block的构造函 ...
- python深入理解类和对象
1,鸭子类型和多态 当看到一只鸟走起来像鸭子,游泳起来像鸭子,叫起来也像鸭子,那这只鸟就是鸭子 是不是比较混乱,看个例子: # -*- coding:UTF-8 -*- __autor__ = 'zh ...
- linux下的音量控制器alsamixer 桌面v7
转载 http://blog.sina.com.cn/s/blog_0ca103850102vpml.html 耳机 插后边 line out 耳机插前边 模拟耳机 声卡自带工具 linux下的音量控 ...
- 拉普拉斯平滑处理 Laplace Smoothing
背景:为什么要做平滑处理? 零概率问题,就是在计算实例的概率时,如果某个量x,在观察样本库(训练集)中没有出现过,会导致整个实例的概率结果是0.在文本分类的问题中,当一个词语没有在训练样本中出现,该词 ...
- Swift 从OC入门
前言:断断续续学了蛮多天的Swift,感触还是蛮多的~~ 1.OC是以C语言为基础的语言,学习之前有C语言的基础,所以对于 `*` 这些指针还是比较容易理解的.问过其他程序员,对OC里面的 `*` 指 ...
- win10系统配置jdk环境不能用%JAVA_HOME% 代替目录
发现以前配好的java环境变量和tomcat环境变量全都清空了,在重新配置的时候总是出现问题,即在cmd命令窗口下,输入java,显示正常,输入java -version 也是显示正常,唯独输入jav ...
- Boost::bind使用详解
1.Boost::bind 在STL中,我们经常需要使用bind1st,bind2st函数绑定器和fun_ptr,mem_fun等函数适配器,这些函数绑定器和函数适配器使用起来比较麻烦,需要根据是全局 ...
- javaweb开发.调试
一.快速调试一个类 1.类里面写public static void main(String[] args) throws Exception{}方法 2.该类上右键->Run As->J ...
- 《Miracle-House团队》第三次作业:团队项目的原型设计与开发
一.实验目的与要求 1.掌握软件原型开发技术 2.学习使用软件原型开发工具 二.实验内容与步骤 1.开发工具: 使用的工具:墨刀(APP端开发原型) 工具简介: 墨刀(MockingBot)是一款简单 ...
- 20175316盛茂淞 2018-2019-2 《Java程序设计》第2周学习总结
20175316盛茂淞 2018-2019-2 <Java程序设计>第2周学习总结 教材学习内容总结 1.整数:可细分为为short整数(占2字节),int整数(占4字节),long整数( ...