首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊聊基于docker部署的mysql如何进行数据恢复

聊聊基于docker部署的mysql如何进行数据恢复

原创
作者头像
lyb-geek
发布于 2022-05-31 02:13:57
发布于 2022-05-31 02:13:57
1.9K0
举报
文章被收录于专栏:Linyb极客之路Linyb极客之路

前言

偶然的机会朋友说他部门的数据库误删了,想恢复回来,他百度了一些资料,也跟着试了。但发现会报一些错,于是他就找我帮忙看一下。对于我来说,因为公司的数据库都是DBA在管控,平时都没机会操作,基本上都停留在理论上。

但为了维持我在他心中的光辉形象,不能让他看出我是个半吊子,我就装逼让他把错误的信息发给我一下,我好百度一下。于是就有今天这么一篇水文出现。

朋友的数据库是基于docker搭建的,朋友一度怀疑是因为docker原因导致他恢复不成功。

数据恢复之binlog前置知识

注: 本文的例子为demo示例,mysql基于docker搭建。版本为mysql 8.0

1、先确认mysql是否已经开启binlog

代码语言:text
AI代码解释
复制
SHOW VARIABLES LIKE '%log_bin%';

注: mysql8.0默认就已经开启binlog,且binlog-format为row格式。如果是mysql8.0以下,需通过/etc/my.cnf进行配置开启。配置内容如下

代码语言:text
AI代码解释
复制
##配置binlog日志路径以及日志文件名前缀、生成的日志格式为:binlog.000001
log-bin=/var/lib/mysql/binlog
##注意配置server-id,保证唯一性
server-id=1
##binlog格式,有3种statement,row,mixed
binlog-format=row

2、查看binlog日志列表

代码语言:text
AI代码解释
复制
SHOW MASTER LOGS;

3、查看当前binlog以及当前位置

代码语言:text
AI代码解释
复制
SHOW MASTER STATUS; 

4、查看binlog内容

代码语言:text
AI代码解释
复制
SHOW BINLOG EVENTS IN 'binlog.000008'; 

5、指定位点查询,比如从pos为746开始查询

代码语言:text
AI代码解释
复制
SHOW BINLOG EVENTS IN 'binlog.000008' FROM 746;

6、指定位点分页查询

代码语言:text
AI代码解释
复制
SHOW BINLOG EVENTS IN 'binlog.000008' FROM 746 LIMIT 0,5

7、刷新产生新binlog

代码语言:text
AI代码解释
复制
FLUSH LOGS; 

数据恢复案例

有这么一张用户表

假设我们误删了lisi这条记录

在这里插入图片描述
在这里插入图片描述

现在我们想把lisi恢复回来。

1、查看binlog

代码语言:text
AI代码解释
复制
SHOW MASTER LOGS; 

2、查看binlog事件

代码语言:text
AI代码解释
复制
SHOW BINLOG EVENTS IN 'binlog.000010'; 
在这里插入图片描述
在这里插入图片描述

3、通过指定位置恢复数据

代码语言:text
AI代码解释
复制
/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

注:

代码语言:html
AI代码解释
复制
/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显示详细信息

此时执行下去就会可能会出现

代码语言:text
AI代码解释
复制
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文件

代码语言:text
AI代码解释
复制
/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文件拷贝到宿主机

代码语言:text
AI代码解释
复制
docker cp e0b7fb702f75:/var/lib/mysql/binlog000010.sql /

3、导出来的文件内容如下

注: 如果不加--base64-output=decode-rows,则输出来的内容为base64加密内容

4、将insert into 改成replace into

5、将改好的sql语句重新导入到docker里面

代码语言:text
AI代码解释
复制
docker cp /binlog000010.sql  e0b7fb702f75:/var/lib/mysql

6、执行sql语句

代码语言:text
AI代码解释
复制
mysql -uroot -p123456 -f </var/lib/mysql/binlog000010.sql

4、通过时间恢复数据

先通过如下命令,查看时间点

代码语言:text
AI代码解释
复制
/usr/bin/mysqlbinlog --no-defaults /var/lib/mysql/binlog.000010 > /var/lib/mysql/bin_log000010.sql

注: 因日志比较多,就先导入到文件再查看

执行如下语句进行恢复

代码语言:text
AI代码解释
复制
/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

注:

代码语言:text
AI代码解释
复制
--start-datetime="2022-04-25 16:10:00" 为恢复的开始时间
-stop-datetime="2022-04-25 16:11:00" 为恢复的结束时间

执行语句,观察数据库,可以发现数据同样恢复回来

总结

虽然以前就看过基于mysqlbinlog恢复数据的八股文,但一直没有去尝试。刚好借朋友这次机会,尝试了一把。本文算是一次记录吧。真的应了一句话纸上得来终觉浅,绝知此事要躬行。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聊聊基于docker部署的mysql如何进行数据恢复
偶然的机会朋友说他部门的数据库误删了,想恢复回来,他百度了一些资料,也跟着试了。但发现会报一些错,于是他就找我帮忙看一下。对于我来说,因为公司的数据库都是DBA在管控,平时都没机会操作,基本上都停留在理论上。
lyb-geek
2022/06/07
2.5K0
聊聊基于docker部署的mysql如何进行数据恢复
mysql误操作binlog恢复
一般正式环境使用数据库都会做全备份,但如果某个时刻数据库崩了,若利用全备份文件恢复,则在全备份到出现问题这段时间内的数据将会丢失,一般来说迫不得已也不会采取这种措施,更直接是采用binlog恢复。
doper
2022/09/26
7990
mysql误操作binlog恢复
MySQL基于Binlog的数据恢复实战
操作系统:CentOS 7.7 MySQL版本:5.7.30,搭建主从 开启binlog,binlog_format=row 备份情况:每天00:00对数据库进行全量备份 恢复原因:某日22:00左右,执行了批量update语句,需要回滚
仙人技术
2021/09/29
2.4K0
MySQL基于Binlog的数据恢复实战
mysql数据恢复 转
binlog 基本认识     MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。
wuweixiang
2018/12/24
3.1K0
Mysql通过binlog恢复数据
前提要开启binlog日志 用到的sql脚本 drop database if exists demo; create database demo; use demo; drop table if exists rumenz; create table rumenz(id int,name varchar(30)); insert into rumenz(id,name) values(1,'qaz'); insert into rumenz(id,name) values(2,'qaz'); inser
入门笔记
2022/06/02
8030
Mysql通过binlog恢复数据
Mysql之binlog日志说明及利用binlog日志恢复数据操作记录
众所周知,binlog日志对于mysql数据库来说是十分重要的。在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 废话不多说,下面是梳理的binlog日志操作解说: 一、初步了解binlog MySQL的二进制日志binlog可以说是MySQL最重要的日志,它记录了所有的DDL和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。 ---------
洗尽了浮华
2018/01/22
3K0
删库跑路不怕,用mysqldump和mysqlbinlog进行数据恢复
1.创建douyin数据库、tbl_douyin_author数据库表、插入测试数据。
用户2032165
2019/05/07
7830
删库跑路不怕,用mysqldump和mysqlbinlog进行数据恢复
删库不跑路!我含泪写下了 MySQL 数据恢复大法…
点击关注公众号,Java干货及时送达 作者:程淇铭 来源:segmentfault.com/a/1190000020116271 日常工作中,总会有因手抖、写错条件、写错表名、错连生产库造成的误删库表和数据的事情发生,那么,如果连数据都恢复不了,还要什么 DBA。 相关文章 MySQL备份策略:https://segmentfault.com/a/1190000019955399 MySQL数据恢复:https://segmentfault.com/a/1190000020116271 1 前言 数据恢
Java技术栈
2022/03/18
6890
MySQL 技术篇- linux下mysql数据库利用binlog文件进行数据回滚实例演示,binlog恢复数据库的两种方式
通过 bin 下面的 mysqlbinlog 工具来看法 binlog 文件,可以看到都记录了什么。
小蓝枣
2020/09/24
3.2K0
MySQL 技术篇- linux下mysql数据库利用binlog文件进行数据回滚实例演示,binlog恢复数据库的两种方式
mysqldump全量备份+mysqlbinlog二进制日志增量备份
日常的数据备份及恢复测试,是DBA工作重中之重的事情,所以要做好备份及测试,日常的备份常见有mysqldump+binlog备份、xtrabackup+binlog备份,无论那一种,几乎都少不了对binlog的备份,说明了binlog在数据恢复中的重要性,下面做个小测试,是工作中不少运维或者新人DBA容易犯的错。
大龄老码农-昊然
2021/04/22
1.4K0
mysqldump全量备份+mysqlbinlog二进制日志增量备份
面试系列-binary log
binlog 二进制日志文件,这个文件记录了MySQL所有的DML操作。通过binlog日志我们可以做数据恢复,增量备份,主主复制和主从复制等等。
用户4283147
2022/10/27
2760
面试系列-binary log
使用Python脚本实现MySQL误操作的快速回滚
1.简介 在Oracle数据库中,当一个误操作被提交后,我们可以通过Oracle提供的闪回功能将表闪回至误操作之前的状态。mysql中没有原生的flushback功能,DBA误操作时,传统的恢复方式是利用全备+二进制日志前滚进行恢复。
星哥玩云
2022/08/16
1K0
MySQL 管理
-e选项可以在Mysql客户端执行SQL语句,而不用连接到MySQL数据库再执行,对于一些批处理脚本,这种方式尤其方便。
用户9615083
2022/12/25
1.4K0
MySQL 管理
删库不跑路:论MySQL数据恢复
日常工作中,总会有因手抖、写错条件、写错表名、错连生产库造成的误删库表和数据的事情发生,那么,如果连数据都恢复不了,还要什么 DBA。
JavaFish
2020/07/21
1.6K0
MySQL的数据备份与恢复
备份就是在数据库发生宕机的情况下保证数据不丢失,或者最小程度丢失的解决方法。Mysql 提供了 mysqldump、ibbackup、replication 工具来备份,当然也有第三方工具,如 xtrabacup、LVM快照等
晚上没宵夜
2021/10/29
9.9K1
MySQL的数据备份与恢复
带你解析MySQL binlog
我们都知道,binlog可以说是MySQL中比较重要的日志了,在日常学习及运维过程中,也经常会遇到。不清楚你对binlog了解多少呢?本篇文章将从binlog作用、binlog相关参数、解析binlog内容三个方面带你了解binlog。
MySQL技术
2020/07/14
2.3K0
mysql数据库误删除后的数据恢复操作说明
在日常运维工作中,对于mysql数据库的备份是至关重要的!数据库对于网站的重要性使得我们对mysql数据的管理不容有失! 然后,是人总难免会犯错误,说不定哪天大脑短路了来个误操作把数据库给删除了,怎么办??? 下面,就mysql数据库误删除后的恢复方案进行说明。 一、工作场景 (1)MySQL数据库每晚12:00自动完全备份。 (2)某天早上上班,9点的时候,一同事犯晕drop了一个数据库! (3)需要紧急恢复!可利用备份的数据文件以及增量的binlog文件进行数据恢复。 二、数据恢复思路 (1)利用全备的
洗尽了浮华
2018/01/22
5K0
ROW 格式binlog 在MySQL5.6上的数据恢复实验
5.6和5.7版本的MySQL,有个参数binlog_row_p_w_picpath,默认值为FULL,表示记录的是全部的binlog操作日志(仅在binlog_format=ROW时候生效)。此外binlog_row_p_w_picpath还可以是minimal,表示binlog记录的就只是影响后的行。如此一来使用ROW格式就能节约很多的磁盘空间。
保持热爱奔赴山海
2019/09/18
1.3K0
mysql数据库基本操作语句,模拟误删数据恢复
作为小站长,mysql数据库算是比较常用的了。作为运维,肯定遇到过数据被误删的情况。下面模拟数据库为误操作删除后的恢复过程。
IT不难
2022/04/23
1.9K0
mysql数据库基本操作语句,模拟误删数据恢复
Mysql-12-mysql的备份和恢复
1.数据库的备份   备份=拷贝加管理,防止数据的丢失同时记录用户的操作记录。其中最有效的备份是对IT架构进行备份。 原则: (1)数据库要定期备份,备份的周期应当根据应用数据系统可承受的恢复时间,而且定期备份的时间应当在系统负荷最低的时候进行。对于重要的数据,要保证在极端情况下的损失都可以正常恢复。 (2)定期备份后,同样需要定期做恢复测试,了解备份的正确可靠性,确保备份的有意义的、可恢复的。 (3)根据系统需要来确定是否采用增量备份,增量备份只需要备份每天的增量数据,备份花费的时间少,对系统负载的压力也
用户1173509
2018/01/17
1.6K0
Mysql-12-mysql的备份和恢复
相关推荐
聊聊基于docker部署的mysql如何进行数据恢复
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档