使用 MyFlash 实现 MySQL 数据闪回

文章目录

  • 简介
  • Github
  • MyFlash 限制
  • MySQL 准备
    • 开启 binlog
    • mysqlbinlog
  • 安装 MyFlash
  • flashback 选项
  • 生成回滚文件
  • 执行回滚操作
  • 操作示例

简介

MySQL中的Binlog(Binary Log)数据闪回,也称为Point-in-Time Recovery (PITR),是一种强大的数据库恢复技术。它基于MySQL的二进制日志系统,允许用户在发生错误或需要回滚事务后,将数据库状态恢复到指定的过去某个时间点,而不仅仅是最近的一次提交。

  1. Binlog记录:当MySQL执行写操作时,会将这些操作记录在二进制日志中,包括SQL语句、更新前后的数据等。这些记录按时间顺序存储,形成一个完整的历史记录链。

  2. 闪回操作:如果需要恢复到某个时间点,管理员可以定位到那个时间点的日志位置,然后使用相应的工具(如mysqlbinlog或商业备份工具)读取和应用那些日志条目,使数据库回到那个时间点的状态。

  3. 特殊类型:MySQL 8.0及更高版本引入了ROW格式的二进制日志,使得闪回操作更加高效,可以直接根据行级别的修改来恢复数据,而不仅仅是整个事务。

Github

  • https://github.com/Meituan-Dianping/MyFlash

MyFlash 限制

  1. 仅支持 5.65.7 版本
  2. binlog 格式必须为 row,且 binlog_row_image=full
  3. 只能回滚DML(增、删、改

MySQL 准备

注: 本章 MySQL 是采用 Docker 部署,容器内是 不带mysqlbinlog 的,可以从已安装 MySQL 的Linux服务器上拷贝 mysqlbinlog 文件。

开启 binlog

[mysqld]
# binlog功能
log_bin=/var/lib/mysql/mysql-bin
# binlog 文件格式
binlog_format=ROW
# 表无论有没有主键约束或者唯一约束binlog都会记录所有前后镜像
binlog_row_image=FULL
# binlog 文件保留时间7天(默认0天)
expire_logs_days=7
# binlog 单个文件的最大值大小(默认1G)
max_binlog_size=512m
# 开启 binlog 后需要创建 function 或 procedure 时要开启
log_bin_trust_function_creators=1
# 服务id,以区分主库和备库
server-id=1
-- 显示是否开启 binlog
show variables like 'log_bin%';
-- 显示 binlog 文件格式
show variables like 'binlog_format%';
-- 显示 binlog 文件保留时间
show variables like 'expire_logs_days%';
-- 显示 binlog 单个文件的最大值大小
show variables like 'max_binlog_size%';
-- 显示 binlog 事件
show binlog events;
-- 显示全部 binlog 文件列表
show binary logs;
show master logs;
-- 显示最新 binlog 文件编号以及最后一个操作事件结束点(Position)值
show master status;
-- 结束当前 binlog 文件并生成新的 binlog 文件
flush logs;
-- 重置 binlog 文件(清空全部 biglog 文件)
reset master;

注: binlog 默认存放在 /var/lib/mysql/ 数据库文件目录。

mysqlbinlog

  • 查看 Linux 环境下 mysqlbinlog 目录
# /usr/bin/mysqlbinlog
whereis mysqlbinlog
  • 将 mysqlbinlog 文件复制到容器内的 /usr/bin 目录
docker cp mysqlbinlog mysql:/usr/bin
# 进入容器内
docker exec -it mysql /bin/bash
# 在容器内为 mysqlbinlog 添加权限
chmod +x /usr/bin/mysqlbinlog
  • 使用 mysqlbinlog 生成 sql 文件
# 进入容器内执行
mysqlbinlog --no-defaults \
--base64-output=DECODE-ROWS \
-v /var/lib/mysql/mysql-bin.000001 >/tmp/binlog_000001.sql

在这里插入图片描述

# 进入容器内执行
mysqlbinlog --no-defaults \
--base64-output=DECODE-ROWS \
--database=db_name \
--start-datetime='2024-06-20 00:00:00' \
--stop-datetime='2024-06-20 17:00:00' \
-v /var/lib/mysql/mysql-bin.000001 >/tmp/binlog_000001.sql

安装 MyFlash

注: 文章 MyFlash 是在 Linux 宿主机上安装。

  • 安装依赖
# 安装 git gcc glib-2.0
yum install -y git gcc glib2 libgnomeui-devel
# 验证是否安装成功
pkg-config --modversion glib-2.0
  • 安装MyFlash
# 下载源码
git clone https://github.com/Meituan-Dianping/MyFlash.git
# 或者国内镜像
git clone https://gitee.com/wufengsheng/MyFlash.git
cd MyFlash
# 动态编译链接安装
gcc -w `pkg-config --cflags --libs glib-2.0` source/binlogParseGlib.c -o binary/flashback
  • 配置环境变量
vim /etc/profile
# 在文件末尾添加
alias flashback=~/MyFlash/binary/flashback
source /etc/profile
  • 验证是否安装成功
cd ~/MyFlash/binary
./flashback --help

flashback 选项

选项说明
–databaseNamesdatabaseName to apply. if multiple, seperate by comma(,)
–tableNamestableName to apply. if multiple, seperate by comma(,)
–tableNames-filetableName to apply. if multiple, seperate by comma(,)
–start-positionstart position
–stop-positionstop position
–start-datetimestart time (format %Y-%m-%d %H:%M:%S)
–stop-datetimestop time (format %Y-%m-%d %H:%M:%S)
–sqlTypessql type to filter . support INSERT, UPDATE ,DELETE. if multiple, seperate by comma(,)
–maxSplitSizemax file size after split, the uint is M
–binlogFileNamesbinlog files to process. if multiple, seperate by comma(,)
–outBinlogFileNameBaseoutput binlog file name base
–logLevellog level, available option is debug,warning,error
–include-gtidsgtids to process. if multiple, seperate by comma(,)
–include-gtids-filegtids to process. if multiple, seperate by comma(,)
–exclude-gtidsgtids to skip. if multiple, seperate by comma(,)
–exclude-gtids-filegtids to skip. if multiple, seperate by comma(,)

生成回滚文件

# 进入MyFlash的bin目录
cd ~/MyFlash/binary
# 生成回滚文件,执行后生成 binlog_output_base.flashback 文件
./flashback --sqlTypes='INSERT' \
--databaseNames=db_name \
--tableNames=table_name \
--start-datetime='2024-06-20 18:23:00' \
--binlogFileNames=/var/lib/mysql/mysql-bin.000001 \
--outBinlogFileNameBase=/var/lib/mysql/binlog_output_base

执行回滚操作

# 在binlog_output_base.flashback所在目录下执行以下命令
mysqlbinlog --no-defaults binlog_output_base.flashback | mysql -h 127.0.0.1 -uroot -p
# 或
mysqlbinlog --no-defaults binlog_output_base.flashback | mysql -uroot -p
# 输入数据库密码

操作示例

注: 容器内 /var/lib/mysql/ 映射到宿主机目录 /u01/mysql/data/

注: 例子中我们在时间 2024-06-21 09:39:00时,操作 DELETE 删除 lkmdbs 库中的 app_version 表中的数据,现在想恢复被删除的数据。

# 生成回滚文件
./flashback --sqlTypes='DELETE' \
--databaseNames=lkmdbs \
--tableNames=app_version \
--start-datetime='2024-06-21 09:38:00' \
--binlogFileNames=/u01/mysql/data/mysql-bin.000001 \
--outBinlogFileNameBase=/u01/mysql/data/binlog_000001
# 进入 mysql 容器
docker exec -it mysql /bin/bash
# 执行回滚操作,需要输入数据库 root 密码
mysqlbinlog --no-defaults binlog_000001.flashback | mysql -uroot -p

在这里插入图片描述

  • 回滚操作

在这里插入图片描述

注: 输入数据库 root 密码回车,没有报错说明回滚成功;数据库 lkmdbs 中的 app_version 表中被删除数据已回滚至2024-06-21 09:38:00时间点。

  • 如果想回滚整个库到某个时间点,可以参考以下脚本。

注意: 要根据数据库当前最新 binlog 文件编号恢复

# 生成回滚文件
./flashback --sqlTypes='INSERT,UPDATE,DELETE' \
--databaseNames=lkmdbs \
--start-datetime='2024-06-21 09:38:00' \
--binlogFileNames=/u01/mysql/data/mysql-bin.000001 \
--outBinlogFileNameBase=/u01/mysql/data/binlog_000001

Docker 部署 MySQL 数据库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/751396.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ansible-综合练习-生产案例

斌的招儿 网上教程大多都是官网模板化的教程和文档,这里小斌用自己实际生产环境使用的例子给大家做一个详解。涉及到一整套ansible的使用,对于roles的使用,也仅涉及到tasks和files目录,方便大家快速上手并规范化管理。 0.环境配置…

私接路由器导致部分终端(电脑、手机等)无法上网问题分析

目录 【1】私接路由器场景 【2】进行网络基本配置,模拟终端可以正常上网 【2.1】Http-Server配置 【2.2】ISP配置 【2.3】R-hefa配置 【2.4】Client1配置 【2.5】PC配置 【2.6】测试验证上网是否正常 【3】私接路由器后再测试验证公司内网各终端访问外网是…

大模型AI技术实现语言规范练习

人工智能技术可以为语言规范练习提供多种有效的解决方案,帮助学习者更有效地掌握语言规范。以下是一些常见的应用场景。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1. 智能纠错 利用自然语言处理技术,可以…

代码随想录-Day42

1049. 最后一块石头的重量 II 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果…

定制型汽车传感器在汽车中的应用

定制型汽车霍尔传感器在汽车中的应用及功能 曲轴和凸轮轴位置传感器&#xff1a; 这些传感器用于监测发动机的曲轴和凸轮轴的位置&#xff0c;帮助发动机管理系统精确控制点火时机和燃油喷射&#xff0c;提高发动机效率。 变速器控制系统&#xff1a; 在自动变速器中&#xf…

通达信短线抄底主升浪幅图指标公式源码

通达信短线抄底主升浪幅图指标公式源码&#xff1a; A1:REF(C,1); A2:SMA(MAX(C-A1,0),5,1)/SMA(ABS(C-A1),5,1)*1000; A3:BARSLAST(REF(CROSS("RSI.RSI1"(6,12,24),"RSI.RSI2"(6,12,24)),1)); A4:A2-LLV(A2,10); A5:(MA(A4,2)*3A4*13)/16; A6:IF(A5>1…

PTE-靶场训练-1

PTE-靶场训练实战笔记 靶场搭建 靶场下载链接&#xff1a; https://pan.baidu.com/s/1ce1Kk0hSYlxrUoRTnNsiKA?pwdha1x vim /etc/sysconfig/network-scripts/ifcfg-eth0 设置好后reboot重启一下即可&#xff0c;然后访问81-85端口&#xff0c;共5题。 因为靶场出了问题&a…

学生信息管理系统

DDL和DML -- 创建学生表 CREATE TABLE students (student_id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50),age INT,gender VARCHAR(10) );-- 创建课程表 CREATE TABLE courses (course_id INT PRIMARY KEY AUTO_INCREMENT,course_name VARCHAR(50) );-- 创建教师表 CREA…

酷瓜云课堂(内网版)v1.1.5 发布,局域网在线学习+考试系统

更新内容 更新layui-v2.9.10更新docker国内镜像地址增加导入镜像构建容器的方式教师不批阅非首次考试试卷轮播图增加专栏类型目标链接增加课程能否发布检查去除初始化kindeditor语言文件去除选择题EF选项优化富文本内容显示样式优化内容图片点击放大监听优化试题题干答案等图片…

基于STM32的智能水质监测系统

目录 引言环境准备智能水质监测系统基础代码实现&#xff1a;实现智能水质监测系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;水质管理与优化问题解决方案与优化收尾与总结 1. 引言 智能水质监测系统通过使用STM32嵌…

ONLYOFFICE桌面编辑器8.1版:个性化编辑和功能强化的全面升级

ONLYOFFICE是一款全面的办公套件&#xff0c;由Ascensio System SIA开发。该软件提供了一系列与微软Office系列产品相似的办公工具&#xff0c;包括处理文档&#xff08;ONLYOFFICE Document Editor&#xff09;、电子表格&#xff08;ONLYOFFICE Spreadsheet Editor&#xff0…

Pycharm主题切换(禁用)导致UI界面显示异常解决

安装其他主题 Material Theme UI One Dark theme One Dark theme安装 (Material Theme UI主题同理) Pycharm 打开 Settings > Plugins&#xff0c;搜索One Dark theme 安装即可 One Dark theme 效果显示 问题记录 UI显示异常 安装多个主题时&#xff0c;当禁用某些主题&…

通信协议总结

IIC 基本特点 同步&#xff0c;半双工 标准100KHz&#xff0c;最高400KHz&#xff08;IIC主要应用于低速设备&#xff09; 硬件组成 需外接上拉电阻 通信过程 空闲状态 SDA和SCL都处于高电平 开始信号S和终止信号P 在数据传输过程中&#xff0c;当SCL0时&#xff0c;SDA才…

Redis-主从复制-测试主从模式下的读写操作

文章目录 1、在主机6379写入数据2、在从机6380上写数据报错3、从机只能读数据&#xff0c;不能写数据 1、在主机6379写入数据 127.0.0.1:6379> keys * (empty array) 127.0.0.1:6379> set uname jim OK 127.0.0.1:6379> get uname "jim" 127.0.0.1:6379>…

高中数学:不等式-常见题型解题技巧

一、“1”的代换 练习 例题1 例题2 解 二、基本不等式中的“变形” 就是&#xff0c;一般情况下&#xff0c;我们在题目中&#xff0c;是不能够直接使用基本不等式进行求解的。 而是要对条件等式进行变形&#xff0c;满足基本不等式的使用条件 练习 例题1 解析 两边同…

002关于Geogebra软件的介绍及与MatLab的区别

为什么要学Geogebra&#xff1f; 因为和MatLab的科学计算相比&#xff0c;GeoGebra重点突出教学展示&#xff0c;对于教师、学生人群来讲再合适不过了&#xff0c;尤其是可以融入到PPT里边呈现交互式动画&#xff0c;想想听众的表情&#xff01;这不就弥补了看到PPT播放数学公…

关于ONLYOFFICE8.1版本桌面编辑器测评——AI时代的领跑者

关于作者&#xff1a;个人主页 目录 一.产品介绍 1.关于ONLYOFFICE 2.关于产品的多元化功能 二.关于产品体验方式 1.关于套件的使用网页版登录 2.关于ONLYOFFICE本地版 三.关于产品界面设计 四.关于产品文字处理器&#xff08;Document Editor&#xff09; 1.电子表格&a…

1954springboot VUE 天然气系统隐患管理系统开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot VUE天然气系统隐患管理系统是一套完善的完整信息管理类型系统&#xff0c;结合springboot框架和VUE完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC 模式开发&#xff09;&#xff0c;系统具有完整的…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十九)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 29 节&#xff09; P29《28.网络连接-第三方库axios》 要想使用第三方库axios&#xff0c;需要先安装ohpm&#xff0c;因为 axios…

Jupyter Notebook 说明 和 安装教程【WIN MAC】

一、Jupyter Notebook 简介&#xff08;来源百度百科&#xff09; Jupyter Notebook&#xff08;此前被称为 Python notebook&#xff09;是一个交互式笔记本&#xff0c;支持运行40多种编程语言。 Jupyter Notebook 的本质是一个Web应用程序&#xff0c;便于创建和共享程序文…