聊聊基于docker部署的mysql如何进行数据恢复
前言
偶然的机会朋友说他部门的数据库误删了,想恢复回来,他百度了一些资料,也跟着试了。但发现会报一些错,于是他就找我帮忙看一下。对于我来说,因为公司的数据库都是DBA在管控,平时都没机会操作,基本上都停留在理论上。
但为了维持我在他心中的光辉形象,不能让他看出我是个半吊子,我就装逼让他把错误的信息发给我一下,我好百度一下。于是就有今天这么一篇水文出现。
朋友的数据库是基于docker搭建的,朋友一度怀疑是因为docker原因导致他恢复不成功。
数据恢复之binlog前置知识
注: 本文的例子为demo示例,mysql基于docker搭建。版本为mysql 8.0
1、先确认mysql是否已经开启binlog
SHOW VARIABLES LIKE '%log_bin%';
注: mysql8.0默认就已经开启binlog,且binlog-format为row格式。如果是mysql8.0以下,需通过/etc/my.cnf进行配置开启。配置内容如下
##配置binlog日志路径以及日志文件名前缀、生成的日志格式为:binlog.000001 log-bin=/var/lib/mysql/binlog ##注意配置server-id,保证唯一性 server-id=1 ##binlog格式,有3种statement,row,mixed binlog-format=row
2、查看binlog日志列表
SHOW MASTER LOGS;
3、查看当前binlog以及当前位置
SHOW MASTER STATUS;
4、查看binlog内容
SHOW BINLOG EVENTS IN 'binlog.000008';
5、指定位点查询,比如从pos为746开始查询
SHOW BINLOG EVENTS IN 'binlog.000008' FROM 746;
6、指定位点分页查询
SHOW BINLOG EVENTS IN 'binlog.000008' FROM 746 LIMIT 0,5
7、刷新产生新binlog
FLUSH LOGS;
数据恢复案例
有这么一张用户表
假设我们误删了lisi这条记录
现在我们想把lisi恢复回来。
1、查看binlog
SHOW MASTER LOGS;
2、查看binlog事件
SHOW BINLOG EVENTS IN 'binlog.000010';
3、通过指定位置恢复数据
/usr/bin/mysqlbinlog --start-position=65945--stop-position=66150 --database=demo_test /var/lib/mysql/binlog.000010 | /usr/bin/mysql -uroot -p123456 -v demo_test
注:
/usr/bin/mysqlbinlog 为binlog命令 --start-position=65945为恢复的开始位置 --stop-position=66150为恢复的结束位置 --database=demo_test 指定数据库为demo_test /var/lib/mysql/binlog.000010 为binlog日志 | /usr/bin/mysql -uroot -p123456 -v demo_test 通过管道连接数据库,并通过-v显示详细信息
此时执行下去就会可能会出现
ERROR 1062 (23000) at line 19: Duplicate entry '1' for key 't_user.PRIMARY'
这个报错也是朋友出现的问题。这种看字面的意思就是出现主键冲突了,此时的办法有2种
a、 方法一:将数据库产生冲突的记录删除,然后再执行恢复语句。此时查看数据库
就会发现数据已经恢复回来了
b、 方法二:就是将binlog导出成sql语句,将insert语句改成replace into。
具体操作如下:
1、将binlog内容输入到一个sql文件
/usr/bin/mysqlbinlog --start-position=65945 --stop-position=66150 --database=demo_test --base64-output=decode-rows -v /var/lib/mysql/binlog.000010 --result-file=/var/lib/mysql/binlog000010.sql
2、将生成的sql文件拷贝到宿主机
docker cp e0b7fb702f75:/var/lib/mysql/binlog000010.sql /
3、导出来的文件内容如下
注: 如果不加--base64-output=decode-rows,则输出来的内容为base64加密内容
4、将insert into 改成replace into
5、将改好的sql语句重新导入到docker里面
docker cp /binlog000010.sql e0b7fb702f75:/var/lib/mysql
6、执行sql语句
mysql -uroot -p123456 -f </var/lib/mysql/binlog000010.sql
4、通过时间恢复数据
先通过如下命令,查看时间点
/usr/bin/mysqlbinlog --no-defaults /var/lib/mysql/binlog.000010 > /var/lib/mysql/bin_log000010.sql
注: 因日志比较多,就先导入到文件再查看
执行如下语句进行恢复
/usr/bin/mysqlbinlog --no-defaults --start-datetime="2022-04-25 16:10:00" --stop-datetime="2022-04-25 16:11:00" --database=demo_test /var/lib/mysql/binlog.000010 | /usr/bin/mysql -uroot -p123456 -v demo_test
注:
--start-datetime="2022-04-25 16:10:00" 为恢复的开始时间 -stop-datetime="2022-04-25 16:11:00" 为恢复的结束时间
执行语句,观察数据库,可以发现数据同样恢复回来
总结
虽然以前就看过基于mysqlbinlog恢复数据的八股文,但一直没有去尝试。刚好借朋友这次机会,尝试了一把。本文算是一次记录吧。真的应了一句话纸上得来终觉浅,绝知此事要躬行。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
用HMS Core地图服务自定义地图样式,给你的应用制作专属个性化地图
不同行业的开发者对地图样式的展示需求差异很大。例如,物流类应用希望地图样式简洁一些,重点突出城市分布和快递路径;AR游戏类应用中的地图色彩需要和游戏UI适配,做的更酷炫一些;景区导览应用中的地图样式要景区特色相结合,重点呈现关键景点。 自定义地图样式可以更好的迎合不同行业的开发者对于地图样式的展示需求,开发者可以综合考虑自身产品的使用场景、品牌色调等因素,自由创建最适合的地图样式。 HMS Core地图服务(Map Kit)提供了自定义地图样式能力,开发者可通过更改Petal Maps Studio中的样式选项,自定义地图样式的显示,更改道路、公园、企业和其他兴趣点等功能的可视化显示。提供七大类,上百种地图元素的样式编辑,让开发者自由编辑个性化地图。同时,开发者只需编辑一次,地图即可适用于多种终端(Android/iOS/Web)极大的提高了开发效率 集成步骤 一、 生成样式ID 1. 登录Petal Maps Studio,点击“Create map”创建自定义样式。 2. 导入JSON样式文件,点击“Import”。 3. 在编辑器里修改样式。 4. 点击“SAVE”生成预览ID,...
- 下一篇
解读ICDE'22论文:基于鲁棒和可解释自编码器的无监督时间序列离群点检测算法
摘要:本文提出了两个用于无监督的具备可解释性和鲁棒性时间序列离群点检测的自动编码器框架。 本文分享自华为云社区《解读ICDE'22论文:基于鲁棒和可解释自编码器的无监督时间序列离群点检测算法》,作者:云数据库创新Lab 。 导读 本文(Robust and Explainable Autoencoders for Unsupervised Time Series Outlier Detection)是由华为云数据库创新Lab联合丹麦Aalborg University与电子科技大学发表在顶会ICDE’22的文章。该文章针对时间序列离群点检测问题,提出了基于自动编码器(AE)和鲁棒的主成分分析(RPCA)结合的兼具鲁棒性和可解释性的深度神经网络算法鲁棒自动编码器(RAE)和鲁棒双自动编码器(RDAE),并通过大量的实验证明RAE和RDAE算法能有效提高时间序列离群点检测的准确度,鲁棒性和可解释性。ICDE是CCF推荐的A类国际学术会议,是数据库和数据挖掘领域顶级学术会议之一。 1. 摘要 随着数据挖掘技术在制造业、众包和交通等领域的普及,大量的时序性数据被产生及应用。本文研究的是时间序列...
相关文章
文章评论
共有0条评论来说两句吧...