当前位置: 首页 > news >正文

用OceanBase binlog service 轻松进行数据回滚

背景

在日常的数据库运维过程中,难免会遭遇数据误操作的情形,比如因疏忽而执行了非预期的delete或update操作,这时就需要进行数据回滚。如果在OceanBase中启用了回收站功能,并设置了合适的undo_retention,那么我们可以利用闪回查询这一功能来实现数据的快速恢复。对此感兴趣的朋友,可以前往平台进一步了解:闪回查询  。不幸的是,回收站是默认处于关闭状态的,一旦开启,数据盘的使用量也会相应增加。对于熟悉MySQL的用户来说,都知道存在一个binlog文件,这个文件可以通过各种开源工具来生成回滚的sql,OceanBase binlog service已经发布了一段时间,在2023年12月底,obd v250也开始支持部署oblogproxy(其中一种模式即binlog service)。本文将通过部署oblogproxy,并结合mysql工具来测试数据回滚操作。对于感兴趣的同学,也可以进一步测试MyFlash在回滚恢复数据方面的支持情况。

部署 oblogproxy

1、obd 版本不低于 2.5.0。

2、拷贝 oblogproxy 配置文件模版

安装obd后,配置文件模版在/usr/obd/example,可以按需拷贝,本次部署的是 oblogproxy 组件 且测试环境有ocp (提供了config server 服务),如果我们使用的环境没有ocp,需要拷贝 distributed-with-obproxy-and-oblogproxy-example.yaml 文件,这里以 oblogproxy-only-example.yaml 为例:

3、编辑oblogproxy-only-example.yaml配置文件

user:username: adminkey_file: /home/admin/.ssh/id_rsa
oblogproxy:servers:- 172.24.255.96version: 2.0.0global:: /home/admin/oblogproxyservice_port: 2983ob_sys_username: "binlog_user"ob_sys_password: "aaAA11__"#binlog_dir: /root/oblogproxy/run#binlog_mode: true  # enable binlog mode, default true

4、部署和启动oblogproxy

 obd cluster deploy oblogproxy -c oblogproxy-only-example.yaml -vobd cluster start oblogproxy -v

5、创建用户并授权

在要创建 binlog 服务所在集群的sys租户下为 obd 配置的 ob_sys_username 创建账密并授权 oceanbase 库读权限。

 create user binlog_user identified by 'aaAA11__';grant select on oceanbase.* to binlog_user;

6、在 obproxy 中配置 oblogproxy 服务地址

alter proxyconfig set enable_binlog_service='True';
alter proxyconfig set binlog_service_ip='172.24.255.96:2983';
alter proxyconfig set init_sql='set _show_ddl_in_compat_mode = 1;';

7、创建 binlog 服务

mysql -h172.24.255.96 -P 2983
CREATE BINLOG  FOR TENANT obtest.test1 WITH CLUSTER URL 
'http://172.24.255.96:8080/services?Action=ObRootServiceInfo&User_ID=alibaba&UID=ocpmaster&ObRegion=obtest';

步骤6、7中相关的命令和参数说明详见:

OceanBase分布式数据库-海量数据 笔笔算数

8、确认 binlog 服务是否正常

在创建 binlog 服务所在的用户租户下 执行:

mysql -h172.24.255.93 -P2883 -uroot@test1#obtest -pxxx -A -cMySQL [(none)]> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000001 |     1158 |              |                  | 013e0324-9fc6-11ee-8dfd-00163e0383a5:1-4 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.24 sec)

在obd 配置文件的 home_path/run 目录下会生成第7步创建binlog service对应的集群名的目录结构,在 run/{集群名}/{租户名}/data 目录下确认生成了我们熟悉的 binlog 文件。

tree -L 2 run/obtest
run/obtest
└── test1├── binlog_converter.conf├── data├── etc├── log├── run└── storage6 directories, 1 file[root@172.24.255.96 data]$pwd
/home/admin/oblogproxy/run/obtest/test1/data
[root@172.24.255.96 data]$
[root@172.24.255.96 data]$ls -lrt
总用量 8
-rw-rw-r-- 1 admin admin    0 1月   3 14:50 index.LOCK
-rw-rw-r-- 1 admin admin  116 1月   3 15:01 mysql-bin.index
-rw-rw-r-- 1 admin admin 1158 1月   3 15:01 mysql-bin.000001
[root@172.24.255.96 data]$

模拟数据

在 test1 租户下

create table t1(id int primary key,name varchar(20));
insert into t1 values(1,'a'),(2,'b'),(3,'c');
update t1 set name='aaa' where id=1;

使用 my2sql 工具

my2sql 工具的说明: GitHub - liuhr/my2sql: 解析MySQL binlog ,可以生成原始SQL、回滚SQL、去除主键的INSERT SQL等,也可以生成DML统计信息以及大事务分析信息。  

git clone https://github.com/liuhr/my2sql.git执行后会在当前目录下生成一个 my2sql 目录[root@172.24.255.96 ~]$cd my2sql/
[root@172.24.255.96 my2sql]$ls -lrt
总用量 80
-rw-r--r-- 1 root root  9662 1月   3 14:55 README.md
-rw-r--r-- 1 root root  1046 1月   3 14:55 LICENSE
drwxr-xr-x 3 root root  4096 1月   3 14:55 misc
-rw-r--r-- 1 root root  1221 1月   3 14:55 main.go
-rw-r--r-- 1 root root 12300 1月   3 14:55 go.sum
-rw-r--r-- 1 root root   838 1月   3 14:55 go.mod
drwxr-xr-x 2 root root  4096 1月   3 14:55 ehand
drwxr-xr-x 2 root root  4096 1月   3 14:55 dsql
drwxr-xr-x 2 root root  4096 1月   3 14:55 constvar
drwxr-xr-x 2 root root  4096 1月   3 14:55 base
drwxr-xr-x 3 root root  4096 1月   3 14:55 releases
drwxr-xr-x 2 root root  4096 1月   3 14:55 toolkits
drwxr-xr-x 2 root root  4096 1月   3 14:55 sqltypes
drwxr-xr-x 2 root root  4096 1月   3 14:55 sqlbuilder
drwxr-xr-x 4 root root  4096 1月   3 14:55 vendor
[root@172.24.255.96 my2sql]$cd releases/
[root@172.24.255.96 releases]$ls -lrt
总用量 4
drwxr-xr-x 2 root root 4096 1月   3 14:55 centOS_release_7.x
[root@172.24.255.96 releases]$cd centOS_release_7.x/
[root@172.24.255.96 centOS_release_7.x]$ll
总用量 7744
-rw-r--r-- 1 root root     107 1月   3 14:55 biglong_trx.txt
-rw-r--r-- 1 root root     144 1月   3 14:55 binlog_status.txt
-rwxr-xr-x 1 root root 7919430 1月   3 14:55 my2sql
[root@172.24.255.96 centOS_release_7.x]$pwd
/root/my2sql/releases/centOS_release_7.x

my2sql 查看原始sql

/root/my2sql/releases/centOS_release_7.x/my2sql \
-user root@test1#obtest -password xxx -host 172.24.255.93  -port 2883 \
-mode file -local-binlog-file /home/admin/oblogproxy/run/obtest/test1/data/mysql-bin.000001 \
-work-type 2sql  -start-file /home/admin/oblogproxy/run/obtest/test1/data/mysql-bin.000001 \
-start-datetime "2024-01-03 14:00:00" -stop-datetime "2024-01-03 16:00:00" \
-output-dir /tmp/test

1704274232

1704274337

my2sql 查看回滚sql

/root/my2sql/releases/centOS_release_7.x/my2sql \
-user root@test1#obtest -password xxx -host 172.24.255.93  -port 2883 \
-mode file -local-binlog-file /home/admin/oblogproxy/run/obtest/test1/data/mysql-bin.000001 \
-work-type rollback  -start-file /home/admin/oblogproxy/run/obtest/test1/data/mysql-bin.000001 \
-start-datetime "2024-01-03 14:00:00" -stop-datetime "2024-01-03 16:00:00" \
-output-dir /tmp/test2

1704274292

1704274382

找业务评估回滚的sql,确认没有问题后执行即可实现数据误操作后回滚。

通过上面的测试,我们可以看到 oceanbase binlog service 产生的 binlog 文件的兼容性,通过开源工具 my2sql 可以正常解析。用到的命令比较粗糙没有加过滤条件,实际在使用中可以按需根据 database_name,table_name 等条件进行过滤,使得生成的sql更加符合我们的预期。

相关文章:

用OceanBase binlog service 轻松进行数据回滚

背景 在日常的数据库运维过程中,难免会遭遇数据误操作的情形,比如因疏忽而执行了非预期的delete或update操作,这时就需要进行数据回滚。如果在OceanBase中启用了回收站功能,并设置了合适的undo_retention,那么我们可以…...

【C++】学习记录--condition_variable 的使用

condition_variable使用步骤如下&#xff1a;创建一个condition_variable对象创建一个互斥锁mutex对象&#xff0c;用来保护共享资源的访问在需要等待条件变量的地方&#xff0c;使用unique_lock<mutec>对象锁定互斥锁并调用condition_variable::wait()、condition_varia…...

Linux之时间子系统(四): tick 层模块(periodic 和dynamic )

一、时间子系统的软件架构 二、tick 层模块的文件 tick-common.c tick-oneshot.c tick-sched.c tick-broadcast.c tick-broadcast-hrtimer.c 这三个文件属于tick device layer。 tick-common.c文件是periodic tick模块&#xff0c;用于管理周期性tick事件。 tick-oneshot.c文…...

Docker Command

小试牛刀 # 查看docker版本 docker -v docker --version # 查看帮助 docker --help # 永远的Hello World docker run hello-world镜像操作 查看本地已有的镜像 docker images -a :列出本地所有的镜像&#xff08;含中间映像层&#xff09; -q :只显示镜像ID --digests :显示…...

Linux系统部署Paperless-Ngx文档管理系统结合内网穿透实现公网访问

文章目录 1. 部署Paperless-ngx2. 本地访问Paperless-ngx3. Linux安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 Paperless-ngx是一个开源的文档管理系统&#xff0c;可以将物理文档转换成可搜索的在线档案&#xff0c;从而减少纸张的使用。它内置…...

6.shell case控制语句

case控制语句 1.什么是case case条件语句相当于多分支的if/elif/else条件语句&#xff0c;主要还是用来做条件判断的,常被应用于实现系统服务启动脚本。 case语句中&#xff0c;会将case获取的变量值与表达式部分的值1、值2、值3等逐个进行比较&#xff0c;如果变量值和某个表…...

如何判断HDMI接口版本是1.4还是2.0呢?

如何判断HDMI接口版本是1.4还是2.0呢&#xff1f; HDMI是一种用于传输高质量音频和视频信号的接口标准。随着技术的不断发展&#xff0c;HDMI接口也经历了多次升级和改进。在市场上&#xff0c;常见的HDMI接口版本包括1.4和2.0。判断HDMI接口版本主要通过以下几种方法&#xff…...

【开发环境搭建篇】NodeJS的安装和配置

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…...

【Docker】docker和docker-compose一键安装脚本(linux)

一、准备和运行脚本 当前脚本下载的docker和docker-compose兼容系统架构为x64&#xff0c;可以根据自己实际系统版本更改下载链接 1. 在控制台使用vim新建: vim install-docker.sh2. 复制内容并粘贴&#xff1a; #!/usr/bin/env bash # 设置脚本在遇到错误时终止执行 set -…...

在 Windows 中安装配置并启动运行 Jenkins【图文详细教程】

安装 Jenkins 的系统要求&#xff1a; 最少 256MB 可用内存最少 1GB 可用磁盘空间JDK 8 / 11 /17&#xff08;Jenkins 是用 Java 写的&#xff0c;打包成 war 包&#xff09; 查看 JDK 的版本 Java JDK 在 Windows 中安装可以参考&#xff1a;https://www.yuque.com/u27599042/…...

C# 读取txt文本所有行

引用&#xff1a;System.IO; Path.Combine(); //将字符串组合成一个路径 Path.GetFullPath(); //返回指定路径的绝对路径 File.ReadAllLines(); //读取文本框返回一个数组 File.ReadAllText(); //读取文本框返回一个字符串 File.ReadAllBytes(); //读取文本框返回字节 …...

STM32使用常见错误合集(正在更新版)

本文章记录一些学习STM32的一些错误问题&#xff0c;师承江科大哈哈哈 一、编译、烧录类问题 1、烧录不成功&#xff0c;Keil提示RDDI-DAP Error【场景&#xff1a;PWM驱动直流电机】 解决方案&#xff1a;将电机断开再进行烧录&#xff0c;断开后就可以美美烧录不报错啦~ …...

Java Random类

一、Random类 在项目开发中&#xff0c;经常需要使用随机数值&#xff0c;例如&#xff0c;网站登录中的验证码&#xff0c;或者需要以一定概率实现的某种效果&#xff08;如游戏程序中的物品掉落等&#xff09;&#xff0c;就需要Java提供的Random类&#xff0c;该类用于生成…...

【Spring Cloud】微服务通信概述

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习技术栈 个性签名&#xff1a;人生乏味啊&#xff0c;我欲令之光怪陆离 本文封面由 凯楠&#x1f4f7; 友情赞助播出 目录 前言 1. Dubbo&#xff08;Spring Cloud Alibaba&#xff09;和 Spring Cloud 的适…...

MySQL的概述与安装

一、数据库的基本概念&#xff1a; 1.1 数据&#xff1a; 1&#xff09; 描述事物的符号记录称为数据&#xff08;Data&#xff09;。数字、文字、图形、图像、声音、档案记录等 都是数据。 2&#xff09;数据是以“记录”的形式按照统一的格式进行存储的&#xff0c;而不是…...

《被讨厌的勇气》书摘2

发生什么不重要&#xff0c;怎样看待才重要 生活的真谛就是活在当下 来自他人和社会的评价&#xff0c;造成了我们的骄傲和自卑。人们经常借“爱”之名&#xff0c;行控制之实 学会课题分离 当我们发现自己的价值的时候&#xff0c;才具备了让自己真正自由和自主的勇气 人…...

基于SpringBoot的会员制医疗预约服务管理信息系统

开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea 系统展示 系统功能模块 会员制医疗预约服务管…...

【二十三】【算法分析与设计】三柱汉诺塔详解,计算子移动次数,正常递归计算,观察数据得出数学规律,递归图得出数学规律,将递归函数转化为递推式

目录 汉诺塔递归 汉诺塔子移动次数的计算 牛牛的汉诺塔 选择正常的递归模拟计算子移动次数 根据具体数据得出数学规律 根据递归图得出数学规律 将递归函数转化为递推式 结尾 汉诺塔递归 汉诺塔是一个经典问题&#xff0c;相传在古印度圣庙中&#xff0c;有一种被称为汉…...

C# WPF编程-XAML

C# WPF编程-XAML XAML简述XAML子集XAML编译XAML基础XAML名称空间XAML中的属性和事件属性事件使用其他名称空间中的类型 加载和编译XAML XAML简述 XAML(Extensible Application Markup Language的简写&#xff0c;发音"zammel")是用于实例化.NET对象的标记语言。XAML…...

java 高级面试题(借鉴)(下)

雪花算法原理 第1位符号位固定为0&#xff0c;41位时间戳&#xff0c;10位workId&#xff0c;12位序列号&#xff0c;位数可以有不同实现。 优点&#xff1a;每个毫秒值包含的ID值很多&#xff0c;不够可以变动位数来增加&#xff0c;性能佳&#xff08;依赖workId的实现…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振...

深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学

一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件&#xff0c;其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时&#xff0c;价带电子受激发跃迁至导带&#xff0c;形成电子-空穴对&#xff0c;导致材料电导率显著提升。…...

Java中栈的多种实现类详解

Java中栈的多种实现类详解&#xff1a;Stack、LinkedList与ArrayDeque全方位对比 前言一、Stack类——Java最早的栈实现1.1 Stack类简介1.2 常用方法1.3 优缺点分析 二、LinkedList类——灵活的双端链表2.1 LinkedList类简介2.2 常用方法2.3 优缺点分析 三、ArrayDeque类——高…...