OceanBase 闪回查询
前言
在OB中,drop表可以通过 回收站 或者 以往的备份恢复来还原单表。当delete数据时,由于delete操作的对象不会进入回收站,此时需要通过闪回查询功能查看delete的数据,以便后续恢复
本次实验版本为 OceanBase 4.2.1.8,MySQL租户。参考OB社区 banjin 老师文章进行测试验证
OceanBase 社区
undo_retention
该参数作用为系统应保留的多版本数据范围,单位为秒。属于租户级别变量,默认为1800秒。当出现delete误删除数据时,可以通过该参数进行闪回查询,恢复误删除数据,可以根据实际业务需求适当更改该参数值
obclient [tpcc]> ALTER SYSTEM SET undo_retention=1800; Query OK, 0 rows affected (0.129 sec)obclient [tpcc]> SHOW PARAMETERS LIKE 'undo_retention'; +-------+----------+-----------+----------+----------------+-----------+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+--------+---------+-------------------+ | zone | svr_type | svr_ip | svr_port | name | data_type | value | info | section | scope | source | edit_level | +-------+----------+-----------+----------+----------------+-----------+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+--------+---------+-------------------+ | zone3 | observer | 10.0.0.63 | 2882 | undo_retention | NULL | 1800 | the low threshold value of undo retention. The system retains undo for at least the time specified in this config when active txn protection is banned. Range: [0, 4294967295] | TENANT | TENANT | DEFAULT | DYNAMIC_EFFECTIVE | | zone2 | observer | 10.0.0.62 | 2882 | undo_retention | NULL | 1800 | the low threshold value of undo retention. The system retains undo for at least the time specified in this config when active txn protection is banned. Range: [0, 4294967295] | TENANT | TENANT | DEFAULT | DYNAMIC_EFFECTIVE | +-------+----------+-----------+----------+----------------+-----------+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+--------+---------+-------------------+ 2 rows in set (0.009 sec)
官方解释如下

DML闪回查询
准备测试数据
obclient [tpcc]> create table banjin_flash (id int ,name varchar(10),dizhi varchar(10),primary key (id)); Query OK, 0 rows affected (0.568 sec)obclient [tpcc]> insert into banjin_flash values (1,'zhangsan','北京'); Query OK, 1 row affected (0.135 sec)obclient [tpcc]> insert into banjin_flash values (2,'lisi','上海'); Query OK, 1 row affected (0.002 sec)obclient [tpcc]> insert into banjin_flash values (3,'wangwu','天津'); Query OK, 1 row affected (0.002 sec)obclient [tpcc]> insert into banjin_flash values (4,'zhaoliu','河北'); Query OK, 1 row affected (0.002 sec)obclient [tpcc]>
更改数据
记录更改数据时的时间,便于后续闪回恢复
obclient [tpcc]> select now(); +---------------------+ | now() | +---------------------+ | 2024-11-16 14:25:10 | +---------------------+ 1 row in set (0.002 sec)obclient [tpcc]> update banjin_flash set dizhi = '湖南' where name='lisi'; Query OK, 1 row affected (0.010 sec) Rows matched: 1 Changed: 1 Warnings: 0obclient [tpcc]> select now(); +---------------------+ | now() | +---------------------+ | 2024-11-16 14:25:30 | +---------------------+ 1 row in set (0.001 sec)obclient [tpcc]> delete from banjin_flash; Query OK, 4 rows affected (0.004 sec)obclient [tpcc]> select now(); +---------------------+ | now() | +---------------------+ | 2024-11-16 14:25:50 | +---------------------+ 1 row in set (0.001 sec)obclient [tpcc]>
闪回数据
1.可以看到由于之前删除了表中的数据,在当前状态查看不到表中任何数据
2.在 2024-11-16 14:25:30 时间段 dizhi 为上海的数据已经被修改为 湖南
3.在 2024-11-16 14:25:10 时间段 表中的数据为初始时候的状态
obclient [tpcc]> select * from banjin_flash;
Empty set (0.002 sec)obclient [tpcc]>
obclient [tpcc]>
---- 在 2024-11-16 14:25:30 时间段 dizhi 为上海的数据已经被修改为 湖南
obclient [tpcc]> SELECT * FROM banjin_flash AS OF SNAPSHOT time_to_usec('2024-11-16 14:25:30') * 1000;
+------+----------+--------+
| id | name | dizhi |
+------+----------+--------+
| 1 | zhangsan | 北京 |
| 2 | lisi | 湖南 |
| 3 | wangwu | 天津 |
| 4 | zhaoliu | 河北 |
+------+----------+--------+
4 rows in set (0.002 sec)
--- 在 2024-11-16 14:25:10 时间段 表中的数据为初始时候的状态
obclient [tpcc]>
obclient [tpcc]> SELECT * FROM banjin_flash AS OF SNAPSHOT time_to_usec('2024-11-16 14:25:10') * 1000;
+------+----------+--------+
| id | name | dizhi |
+------+----------+--------+
| 1 | zhangsan | 北京 |
| 2 | lisi | 上海 |
| 3 | wangwu | 天津 |
| 4 | zhaoliu | 河北 |
+------+----------+--------+
4 rows in set (0.001 sec)obclient [tpcc]>
obclient [tpcc]>
过程中有DDL的闪回
表增字段后的闪回效果
可以看到如果后续对表进行了alter操作,闪回查询时新加字段被Default 值补齐,如果没有default值会用null补齐
obclient [tpcc]> alter table banjin_flash add column dianhua decimal(11) default 1;
Query OK, 0 rows affected (0.178 sec)obclient [tpcc]>
obclient [tpcc]> SELECT * FROM banjin_flash AS OF SNAPSHOT time_to_usec('2024-11-16 14:25:30') * 1000;
+------+----------+--------+---------+
| id | name | dizhi | dianhua |
+------+----------+--------+---------+
| 1 | zhangsan | 北京 | 1 |
| 2 | lisi | 湖南 | 1 |
| 3 | wangwu | 天津 | 1 |
| 4 | zhaoliu | 河北 | 1 |
+------+----------+--------+---------+
4 rows in set (0.015 sec)obclient [tpcc]> SELECT * FROM banjin_flash AS OF SNAPSHOT time_to_usec('2024-11-16 14:25:10') * 1000;
+------+----------+--------+---------+
| id | name | dizhi | dianhua |
+------+----------+--------+---------+
| 1 | zhangsan | 北京 | 1 |
| 2 | lisi | 上海 | 1 |
| 3 | wangwu | 天津 | 1 |
| 4 | zhaoliu | 河北 | 1 |
+------+----------+--------+---------+
4 rows in set (0.001 sec)obclient [tpcc]> alter table banjin_flash add column dianhua1 decimal(11) ;
Query OK, 0 rows affected (0.083 sec)obclient [tpcc]> SELECT * FROM banjin_flash AS OF SNAPSHOT time_to_usec('2024-11-16 14:25:30') * 1000;
+------+----------+--------+---------+----------+
| id | name | dizhi | dianhua | dianhua1 |
+------+----------+--------+---------+----------+
| 1 | zhangsan | 北京 | 1 | NULL |
| 2 | lisi | 湖南 | 1 | NULL |
| 3 | wangwu | 天津 | 1 | NULL |
| 4 | zhaoliu | 河北 | 1 | NULL |
+------+----------+--------+---------+----------+
4 rows in set (0.015 sec)obclient [tpcc]> SELECT * FROM banjin_flash AS OF SNAPSHOT time_to_usec('2024-11-16 14:25:10') * 1000;
+------+----------+--------+---------+----------+
| id | name | dizhi | dianhua | dianhua1 |
+------+----------+--------+---------+----------+
| 1 | zhangsan | 北京 | 1 | NULL |
| 2 | lisi | 上海 | 1 | NULL |
| 3 | wangwu | 天津 | 1 | NULL |
| 4 | zhaoliu | 河北 | 1 | NULL |
+------+----------+--------+---------+----------+
4 rows in set (0.001 sec)obclient [tpcc]>
表删除字段后的闪回效果
可以看到如果对表进行了 alter 删除字段操作后,无法使用闪回还原数据
obclient [tpcc]> alter table banjin_flash drop column dianhua1;
Query OK, 0 rows affected (0.835 sec)obclient [tpcc]> SELECT * FROM banjin_flash AS OF SNAPSHOT time_to_usec('2024-11-16 14:25:10') * 1000;
ERROR 1412 (HY000): Unable to read data -- Table definition has changed
obclient [tpcc]>
obclient [tpcc]> SELECT * FROM banjin_flash AS OF SNAPSHOT time_to_usec('2024-11-16 14:25:30') * 1000;
ERROR 1412 (HY000): Unable to read data -- Table definition has changed
obclient [tpcc]>
obclient [tpcc]>
truncate 闪回效果
重新初始化数据,发现truncate操作后也无法进行闪回数据
obclient [tpcc]> create table banjin_flash (id int ,name varchar(10),dizhi varchar(10),primary key (id));
Query OK, 0 rows affected (0.106 sec)obclient [tpcc]> insert into banjin_flash values (1,'zhangsan','北京');
Query OK, 1 row affected (0.025 sec)obclient [tpcc]> insert into banjin_flash values (2,'lisi','上海');
Query OK, 1 row affected (0.003 sec)obclient [tpcc]> insert into banjin_flash values (3,'wangwu','天津');
Query OK, 1 row affected (0.053 sec)obclient [tpcc]> insert into banjin_flash values (4,'zhaoliu','河北');
Query OK, 1 row affected (0.002 sec)obclient [tpcc]> select now();
+---------------------+
| now() |
+---------------------+
| 2024-11-16 14:44:19 |
+---------------------+
1 row in set (0.001 sec)obclient [tpcc]> update banjin_flash set dizhi = '湖南' where name='lisi';
Query OK, 1 row affected (0.014 sec)
Rows matched: 1 Changed: 1 Warnings: 0obclient [tpcc]> select now();
+---------------------+
| now() |
+---------------------+
| 2024-11-16 14:44:37 |
+---------------------+
1 row in set (0.001 sec)obclient [tpcc]> truncate table banjin_flash;
Query OK, 0 rows affected (0.099 sec)obclient [tpcc]> SELECT * FROM banjin_flash AS OF SNAPSHOT time_to_usec('2024-11-16 14:44:19') * 1000;
ERROR 1412 (HY000): Unable to read data -- Table definition has changed
obclient [tpcc]>
obclient [tpcc]> SELECT * FROM banjin_flash AS OF SNAPSHOT time_to_usec('2024-11-16 14:44:37') * 1000;
ERROR 1412 (HY000): Unable to read data -- Table definition has changed
obclient [tpcc]>
总结
1.当出现delete操作时,可以根据 OB的undo_retention功能 进行闪回查询查看误删除的数据
2.后续过程中如果出现 删除字段 以及 truncate表操作 无法进行闪回数据
3.truncate 操作的对象既不会进入 回收站 也无法通过闪回查询,生产环境一定要谨慎操作
相关文章:
OceanBase 闪回查询
前言 在OB中,drop表可以通过 回收站 或者 以往的备份恢复来还原单表。当delete数据时,由于delete操作的对象不会进入回收站,此时需要通过闪回查询功能查看delete的数据,以便后续恢复 本次实验版本为 OceanBase 4.2.1.8࿰…...
C++析构函数详解
C析构函数详解:对象销毁与资源清理 在 C 中,析构函数是与构造函数相对应的特殊成员函数,它在对象生命周期结束时被自动调用,用于执行对象销毁之前的清理操作。析构函数主要用于释放对象占用的资源,如动态分配的内存、打…...
【网络安全 | 漏洞挖掘】未授权获取AI聊天内容
未经许可,不得转载。 文章目录 两天前,我收到了一项私人项目的邀请,内容看起来像是一个聊天机器人,类似于 Gemini 或 ChatGPT。于是我开始测试该项目的一些业务逻辑漏洞和 IDOR(不当访问控制)漏洞。尽管这个产品拥有一个强大的安全团队,网站上也部署了 WAF(Web 应用防火…...
时间序列分析——移动平均法、指数平滑法、逐步回归法、趋势外推法等(基于Python实现)
第 11章——时间序列分析和预测 【例11-1】 绘制时间序列折线图—观察成分 【代码框11-1】——绘制时间序列折线图 # 图11-2的绘制代码 import pandas as pd import matplotlib.pyplot as plt plt.rcParams[font.sans-serif]=[SimHei...
opencv(c++)----图像的读取以及显示
opencv(c)----图像的读取以及显示 imread: 作用:读取图像文件并将其加载到 Mat 对象中。参数: 第一个参数是文件路径,可以是相对路径或绝对路径。第二个参数是读取标志,比如 IMREAD_COLOR 表示以彩色模式读取图像。 返回值&#x…...
PyTorch——从入门到精通:PyTorch基础知识(张量)【PyTorch系统学习】
什么是张量(Tensor) 张量在数学中是一个代数对象,描述了与矢量空间相关的代数对象集之间的多重线性映射。张量是向量和矩阵概念的推广,可以理解为多维数组。作为数学中的一个基本概念,张量有着多种类型,…...
(笔记)ubuntu20安装jdk7,多版本管理
前往 Oracle JDK 7 下载页面(需要 Oracle 账户),下载 JDK 7 的压缩包文件(.tar.gz)。 下载完成后,将文件解压到 /opt 目录: sudo tar -xzf jdk-7u<version>-linux-x64.tar.gz -C /opt 重…...
Python系列教程
文章目录 1. Python基础2. Python基础库3. Python数据分析 1. Python基础 语句数据类型表达式输入、输出与文件读写函数模块与包类与面向对象作用域与命名空间常用技巧与操作 2. Python基础库 Typing库 3. Python数据分析...
如何恢復電腦IP地址的手動設置?
手動設置IP地址後,可能會遇到一些網路連接問題,或者需要恢復到之前的自動獲取狀態。這篇文章將詳細介紹如何恢復電腦的IP地址設置。 為什麼需要恢復IP地址設置? 網路連接問題:手動設置IP地址後,可能會導致與路由器或…...
Linux 下敏感文件路径总结
Linux 下敏感文件路径总结 在服务器运维和安全测试过程中,掌握各类服务的关键配置文件路径、日志文件位置以及重要目录的存放位置至关重要。本文整理了 Linux 系统下常见服务(如 Apache、Nginx、MySQL 等)的路径结构,以及一些敏感…...
gitlab 服务器集群配置及 存储扩展配置
配置 GitLab 服务器集群并实现存储扩展是一个复杂的任务,但可以通过以下步骤来实现。GitLab 本身支持高可用性和分布式部署,可以显著提高系统的可靠性和性能。 ### 1. 规划和准备 #### 1.1 确定服务器数量 - **1 台负载均衡器**:用于分发请…...
3D Gaussian Splatting 代码层理解之Part2
现在让我们来谈谈高斯分布。我们已经在Part1介绍了如何根据相机的位置获取 3D 点并将其转换为 2D。在本文中,我们将继续处理高斯泼溅的高斯部分。这里用到的是代码库 GitHub 中part2. 我们在这里要做的一个小改动是,我们将使用透视投影,它利用与上一篇文章中所示的不同内部…...
.length和.length()有什么区别?什么情况下使用哪个?
在编写程序的时候,我们经常发现有时候需要得到长度的时候我们使用函数.length,而有的时候用的却是.length()。 在对Java一知半解的时候,我曾产生了深深的疑惑,到底这两个有什么区别,为什么有时候要有括号,而…...
React Native 全栈开发实战班 - 网络与数据之 websock与服务端交互
1.4 使用 WebSocket 实现实时通信 除了 fetch 和 axios 这样的 HTTP 请求方式,React Native 还支持 WebSocket,用于实现客户端与服务器之间的实时双向通信。WebSocket 适用于需要实时数据推送的场景,如聊天应用、实时通知、实时数据更新等。…...
黑马智慧商城项目学习笔记
目录 智慧商城项目创建项目调整初始化目录vant组件库vant按需导入和全部导入 项目中的vw适配路由设计配置登录页静态布局图形验证码功能request模块-axios封装api模块-封装图片验证码接口 Toast轻提示(vant组件)短信验证倒计时功能登录功能响应拦截器统一…...
计算机网络WebSocket——针对实习面试
目录 计算机网络WebSocket什么是WebSocket?WebScoket和HTTP协议的区别是什么?说明WebSocket的优势和使用场景?说明WebSocket的建立连接的过程? 计算机网络WebSocket 什么是WebSocket? WebSocket是一个网络通信协议,提…...
请介绍一下Python的网络编程以及如何使用socket模块进行网络通信
1、请介绍一下Python的网络编程以及如何使用socket模块进行网络通信。 Python中的网络编程主要是通过socket模块实现的。Socket模块提供了基本的套接字接口,使得Python程序可以连接到网络上的其他设备或服务。下面是对Python网络编程和socket模块的基本介绍以及如何…...
【第三课】Rust变量与数据类型(二)
目录 前言 Vector HashMap 其他 前言 上一课介绍了rust的变量和常见的数据类型,走马观花的看了一下rust常见的变量和数据类型,这些都是rust的基本语法,整理出来只是起一个引子的效果,基本语法多练习才可以熟练。这一课继续介绍…...
vue使用List.reduce实现统计
需要对集合的某些元素的值进行计算时,可以在计算属性中使用forEach方法 1.语法:集合.reduce ( ( 定义阶段性累加后的结果 , 定义遍历的每一项 ) > 定义每一项求和逻辑执行后的返回结果 , 定义起始值 ) 2、简单使用场景:例如下面…...
Linux网络:HTTPS协议
Linux网络:HTTPS协议 加密方式对称加密非对称加密混合加密中间人攻击 证书数据签名CA认证 HTTPSSSL/TSLHTTPS 在HTTP协议中,所有的数据都采用明文的形式传输,这就会导致数据非常容易泄露,只要拿到HTTP报文,就可以窃取各…...
P1238 走迷宫【洛谷算法习题】
P1238 走迷宫 网页链接 P1238 走迷宫 题目描述 有一个 mnm\times nmn 格的迷宫(表示有 mmm 行、nnn 列),其中有可走的也有不可走的,如果用 111 表示可以走,000 表示不可以走,文件读入这 mnm\times nmn 个数据和起始点、结束点…...
2025终极指南:Cursor Free VIP破解工具如何帮你免费解锁AI编程助手所有功能
2025终极指南:Cursor Free VIP破解工具如何帮你免费解锁AI编程助手所有功能 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Yo…...
AGENT_OS:为AI智能体构建结构化外部记忆与任务操作系统
1. 项目概述:为AI智能体构建一个结构化的外部记忆与操作系统如果你正在使用Claude、GPT-4或者OpenClaw这类AI助手来帮你处理工作,你很可能已经发现了一个核心痛点:每次开启新对话,它都像一张白纸。你得花大量时间重新介绍你是谁、…...
开发者效率革命:用dotfiles打造可移植的个性化开发环境
1. 项目概述:dotfiles,开发者效率的基石 如果你在终端里敲命令时,总觉得默认的配置不够顺手,或者每次在新机器上都要花半天时间重新配置一遍开发环境,那“dotfiles”这个概念对你来说就是救星。jesuserro/dotfiles 这个…...
音乐网站与分享平台 |基于Springboot+vue的音乐网站与分享平台(源码+数据库+文档)
音乐网站与分享平台 目录 基于Springbootvue的音乐网站与分享平台 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师…...
AI研究代理基准测试工具autoresearch-adal:自动化对比AdaL与Claude Code
1. 项目概述与核心价值如果你和我一样,经常在多个AI研究工具之间切换,试图找出哪个模型在解决复杂的、需要多步推理的研究任务上更胜一筹,那么你肯定体会过那种繁琐和低效。手动设置不同的API环境、编写重复的测试脚本、整理散落在各处的输出…...
ARM架构浮点运算与FPEXC/FPSCR寄存器详解
1. ARM架构浮点运算基础在嵌入式系统和移动计算领域,ARM处理器凭借其高效的能耗比占据主导地位。浮点运算作为科学计算、图形处理和机器学习的基础,其性能直接影响着整个系统的表现。ARM架构通过专门的浮点运算单元和配套的寄存器系统,为开发…...
全球轻型巡飞弹药行业发展现状、机遇与前景分析
一、行业概述与全球市场规模轻型巡飞弹药是融合无人机技术与精确弹药技术的新型无人航空武器系统,具备轻量化、可携行、高精度、自主滞空作战的核心特性。该装备可通过单兵、车载、舰载等多平台发射,能在目标区域自主巡飞、识别跟踪目标,可灵…...
单芯片编码器技术解析与运动控制革新
1. 单芯片编码器技术解析与运动控制革新在工业自动化与精密运动控制领域,编码器如同系统的"感官神经",实时捕捉机械运动的细微变化。传统模块化编码器虽然提供了即插即用的便利性,但其固定参数和有限的可配置性往往成为性能提升的瓶…...
信息时代个人知识管理:从碎片化信息到结构化洞察的实践指南
1. 信息海洋中的航行:从碎片到洞察我们正漂浮在一片前所未有的信息海洋里。每天,无数的邮件、通知、文章、帖子像潮水般涌来,我们则像一个个拾贝者,快乐地捡拾着那些零碎的趣闻和知识的金块。这种感觉很奇妙,不是吗&am…...
