尝试用binlog恢复mysql数据
来源:SegmentFault
时间:2023-02-17 08:24:18 447浏览 收藏
对于一个数据库开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《尝试用binlog恢复mysql数据》,主要介绍了MySQL,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!
Binlog介绍:
- Binlog又称归档日志是专门用来记录逻辑的 (监控并记录你在干啥,比如有没有偷偷删表删库??)
- Binlog位于server层,因此所有的存储引擎都可以使用
- Binlog没有固定大小,会追加写入且不会覆盖旧的Binlog
Binlog开启和配置:
首先我们要检查下我们是否开启了Binlog
输入命令:
show variables like '%bin%';
1,变量
log_bin为 on表示已开启 (如何开启? 直接my.cnf添加
log_bin="log_bin_basername"即可)
2,变量
log_bin_basename为 binlog日志的文件名,还会自动接后缀.00000xx,每次重启mysql服务或者使用
flush logs命令都会生成一个新的binlog文件
3,变量
bin_format则表示日志记录的格式,共有三种格式,分别是
statement,
rows,
mixed,
-
statement
记录的是sql语句 -
rows
记录的是对数据操作的上下文 -
mixed
则兼容statement
和rows
,会自动根据场景来选择使用前两者的哪一种
一般我们推荐使用
mixed,因为
statement存在隔离限制,如果在"rc/ru" 即 读未提交/读提交的隔离级别下,会产生不可重复读,配置主从后使用
statement格式(因为只是记录sql)进行复制会导致主从数据不一致,而 rows 由于记录的行数据操作的上下文,相比
statement占用空间更大
接着我们先查看一下当前的
isolation
输入命令:
show variables like '%isolation%';
ps:5.7+变量名变为`tracsaction_isolation`,我这边是5.6版本的所以还是`tx_isolation`
通过图可以看到,我这边隔离级别为rc,也就是读提交
对照上面讲的,rc 不支持
statement格式,所以我们要切换格式为
rows或者
mixed
可以直接通过global 变量更改,或者直接修改my.cnf,我这里直接修改my.cnf
保存,重启服务,然后重新查看变量
binlog_format,ok,已变更为
mixed
建立测试数据并备份:
建立一个test库,然后在test库中建立一个简单的t1表用以测试
CREATE TABLE `t1` ( `id` int(3) NOT NULL AUTO_INCREMENT, `num` int(4) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
然后往t1表插入三条数据
insert into t1 (num) values(1),(2),(3);
这样我们测试表和备份数据就完成了,然后用mysqldump进行备份
mysqldump -u -h -p database > /dirs/xxx.sql
接着再插入3条新数据用以测试数据恢复,由于备份中不存在这三条,所以这三条是需要恢复的数据
insert into t1 (num) values(4),(5),(6);
然后我们假装误删表。。。。
drop table t1
准备阶段到此结束~~~
开始恢复数据:
ok,现在开始进入场景,由于我误删了t1表,所以我需要恢复数据(t1应当数据有6条),但备份的数据中只有3条,所以后面插入的那3条记录遗失了,但由于我们配置了binlog,所以后面那3条的数据日志是有被记录的,因此我们只需要用Binlog来恢复那三条数据即可,下面开始数据恢复。
1,先使用备份恢复
我们先把数据恢复到备份状态
mysql -uroot -p -h127.0.0.1 test
恢复成功,检查表中数据
ok,已经恢复到备份状态啦
2,使用Binlog恢复
先查询下当前使用的binlog是哪个文件
show master status;
可以看到使用的是
binlog.000001文件,position累计计数到1615
接着我们先熟悉下
mysqlbinlog的筛选规则
mysqlbinlog --help
如图,我们可以看到
mysqlbinlog命令有4个筛选条件:
start-datetime/stop-datetime 分别表示想要筛选的记录区间的`起始时间`和`截止时间` start-position/stop-position 则表示想要筛选的记录区间的`起始位置`和`截止位置`
我们需要用这几个筛选条件来定位所需要恢复的日志区间
然后我们来瞅一下这个
binlog.000001文件
/*-d参数表示筛选的数据库名称*/ mysqlbinlog -d test /data/mysql/binlog.000001
由于我们使用的隔离限制为rc,
mixed会自动选择
rows格式记录对行的数据操作,所以看不到对应的sql,只能看到对应的上下文
But whatever 直接向下拉,然后我们找到一个重点!
position 699 有一个
drop table t1的操作, 而后面的position 814 和 poistion 939则是恢复备份时的删表建表操作。
因此我们确定了
stop-position就是699
然后我们在找下备份时间,因为我们不好确定
start-position,而不指定开始位置全部恢复又有点太说不过去了。。因此直接查看下备份时间。
ok,这样我们的
start-datetime也确定了, 有了
start-datetime和
stop-position,我们就能确定所要恢复的日志区间了
接下来就要用mysqlbinlog 命令开始恢复了
/*这里的 -D 参数表示防止出现新的日志记录,我不想把恢复时添加的数据记录也加到binlog里面*/ mysqlbinlog -d test -D --start-datetime="2019-05-25 09:39:00" --start-position=699 /data/mysql/binlog.000001 | mysql -uroot -p -h127.0.0.1 test
可以看到加了 -D 参数 `position`数目没有发生改变,即没有生成新的日志记录
查询t1表, 发现已经恢复成功了,id 567都恢复进来了
恢复结束
上面的操作是直接通过
mysqlbinlog导入到库中的,当然你也可以选择用
mysqlbinlog生成sql文件,然后再导入sql文件进行恢复,我们再试一下。
先恢复到备份状态(因为-D 参数没有生成新的记录,所以直接
start-position = 699即可)
然后用
mysqlbinlog生成sql
/*没有加-D 参数就是为了测试会不会出现新的日志记录*/ mysqlbinlog -d test --start-datetime="2019-05-25 09:39:00" --stop-position=699 /data/mysql/binlog.000001 > binlog_201905025.sql
生成成功,接着导入sql
mysql -uroot -p -h127.0.0.1 test
ok,发现恢复也成功了
然后查看
position个数
show master status;
果然
position变多啦~
一般建议恢复时添加-D 参数,因为恢复时记录也会被记录到binlog中,相当于重复了。
that's all ~~~
第一次在思否发文章,感觉格式啥不太标准。。见谅。。
今天关于《尝试用binlog恢复mysql数据》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于mysql的内容请关注golang学习网公众号!
-
499 收藏
-
244 收藏
-
235 收藏
-
157 收藏
-
101 收藏
-
214 收藏
-
155 收藏
-
485 收藏
-
436 收藏
-
125 收藏
-
174 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习
-
- 快乐的星月
- 赞 👍👍,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢老哥分享文章内容!
- 2023-04-30 21:35:31
-
- 大气的纸鹤
- 这篇技术贴出现的刚刚好,太详细了,受益颇多,收藏了,关注作者了!希望作者能多写数据库相关的文章。
- 2023-04-22 06:25:59
-
- 如意的黑夜
- 这篇博文太及时了,细节满满,太给力了,码起来,关注大佬了!希望大佬能多写数据库相关的文章。
- 2023-03-29 12:52:09
-
- 欢呼的黑裤
- 太全面了,已加入收藏夹了,感谢大佬的这篇文章内容,我会继续支持!
- 2023-03-25 19:11:03
-
- 干净的蛋挞
- 很有用,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢up主分享博文!
- 2023-02-19 12:38:44