数据异常不用怕,GaiaDB有办法

news2024/11/27 1:37:21

百度智能云云数据库,开启了特惠专场!热销规格新用户免费使用,欢迎参与!

背景

在大多数业务场景中,数据库主要负责提供对当前数据的查询能力。然而,对于一些特定业务场景,如游戏运营和金融交易等,查询历史数据的能力尤为重要。例如,在游戏场景中,通过查询历史数据来追踪和定位账号装备的异常变动。在数据恢复、审计、分析等场景,闪回查询可以帮助用户了解数据的历史变化,以便进行决策支持或问题诊断。此外,在日常的运维过程中,如果发生误操作,闪回查询提供了更为灵活的时间点选择。与依赖历史备份进行日志回放相比,它能够更快实现数据恢复。

GaiaDB 的闪回查询通过一条简单的SQL语句,即可访问历史数据。无论是需要纠正刚刚发生的错误操作,还是进行长期趋势的数据分析,GaiaDB都能提供快速、准确的数据查询服务。这不仅极大地减轻了业务流程中对数据查询的需求复杂度,也提高了数据管理的效率。本文深入探讨了GaiaDB 闪回查询技术,并提供了示例演示。

使用方法

GaiaDB 引入了新的查询语法来支持闪回查询,只需要在 select 语句后添加 AS OF TIMESTAMP + 时间戳便可以查询某一历史版本的数据。语法如下:

SELECT column_name_list FROM table_name AS OF TIMESTAMP time_expr alias WHERE...;

技术方案

1、基于 undo log 的版本链

GaiaDB 的闪回查询功能利用 MVCC(多版本并发控制)特性实现。在原生的 InnoDB 引擎中,MVCC 特性的设计目的是解决只读事务和写事务之间的冲突。根据数据库不同的隔离级别的限制,写事务的修改对于读事务来说有着不同的可见性。为了实现这样的可见性需求,InnoDB 中每行数据都维护了修改自己的 undo 日志,这些 undo 记录按照从新到旧的顺序组成了本行数据的历史版本链,如下图所示。在查询时,可以通过这个版本链向前追溯历史版本,通过记录的事务号和本查询的 ReadView 进行可见性判断,从而查询出当前读事务所能读到的正确数据。出于节省空间的考虑,历史版本链不会无限增长,若某个历史版本对于所有事务都不再需要,那么便可以将该历史版本清理掉。

图片

2、GaiaDB 对于 MVCC 读取的改造

如果读事务持有某一历史时刻的 ReadView,并且此时刻的历史版本尚未被清理,那么就能很自然地获得需要的历史数据版本。因此闪回查询的实现,首先是保存历史的 ReadView 及对应的数据版本。GaiaDB 新增了一个系统表 History ReadViews,表中的每行数据为一个二元组,分别是时间戳和该时间戳对应的 ReadView 经序列化后的字符串。

如下图所示。在开启闪回查询之后,后台线程会以1秒为周期,从事务系统获取当前的 ReadView,经序列化后与当前的时间戳组成二元组,插入到系统表中。在清理历史版本链时,限制条件也发生了变化。History ReadViews 表中最早时间戳对应的 ReadView 决定了 undo 记录是否可以被清理。如下图示例中,系统表中最早的时间戳为 "2024-04-04 16:16:16",那么以此时刻的 ReadView 为标准,已经提交事务所相关的 undo 记录才能够被清理。

图片

在需要查询某一历史时刻的版本时,只需从系统表中获取到该时刻对应的 ReadView 作为本次查询的 ReadView,即可查询到特定时刻的历史数据。以下图为例,若某行数据在 T0 时刻值为“A”,在T1时刻被修改为了“B”,又在 T2 时刻被修改为了“C”。此时进行普通的查询,会首先在事务系统中获取当前时刻的 ReadView,由于之前的修改都已提交,所以该 ReadView 显示能够读取到最新版本的数据,然后从 B+ 树上查询得到数据值为“C”。

图片

若使用闪回查询,查询 T0 时刻的数据,那么首先会从 History ReadViews 系统表中查询 T0 时刻的 ReadView。由于在 T0 时刻,后续的修改还未发生,所以该 ReadView 显示只有最早的历史版本 1 对于本次查询来说是可见的。使用这个 ReadView 再去数据行的历史版本链上遍历,首先发现最新版本"C"是不可见的,继续向前追溯,直至发现可见的历史版本 1,返回结果为“A”。

图片

3、IO暴涨问题和解决方案

在 InnoDB 引擎中,二级索引不记录事务号,所以在 MVCC 中二级索引的可见性判断,需要回查主键判断。又由于每个 undo 记录可能分布在不同的数据页上,所以每个 undo 记录的访问都可能触发 IO。开启闪回查询时,历史版本的清理被推迟,历史版本链很长,这会导致 InnoDB 的性能急剧下降,极端情况会导致实例保护性自杀。

针对这个问题,GaiaDB 将历史版本清理的过程拆分为两个阶段。

  • 第一个阶段为二级索引的清理,这个过程在事务提交之后即可进行。经过这一阶段,所有对应二级索引上的 delete mark 被删除,只保留其在主键索引上的位置。
  • 第二个阶段为主键索引的清理,这一阶段的进度由系统表 History ReadViews 中最老的 ReadView限制,逐秒推进。经过这一阶段,对应的主键索引上的 delete mark 也被清除,完成最终的清理任务。这种方案舍弃了提供二级索引数据闪回查询的能力,但是很好地解决了 IO 暴涨的问题。

具体示例

下面用一个具体的使用场景说明如何用GaiaDB轻松地获取历史数据。

1、使用如下语句创建表结构并插入初始数据。

create table products (prod_id bigint(10) primary key NOT NULL,prod_name varchar(20) NOT NULL,cust_id bigint(10) NULL,createtime datetime NOT NULL DEFAULT NOW());INSERT INTO  products(prod_id,prod_name,cust_id,createtime) values (101,'Book',1,NOW()),(102,'Apple',1,NOW()),(103,'Beef',2,NOW()),(104,'Bread',3,NOW()),(105,'Cheese',4,NOW());

2、记录下当前的时间戳,2024-04-12 16:42:41。

SELECT NOW();

3、对数据进行修改,修改prod_name为Book和Apple的prod_id,由101和102分别修改为110和119

UPDATE products SET prod_id = 110, createtime = NOW() WHERE prod_name = "Book";UPDATE products SET prod_id = 119, createtime = NOW() WHERE prod_name = "Apple";

4、使用普通的查询语句可以查询到更新后的数据。

SELECT * FROM products;

+---------+-----------+---------+---------------------+| prod_id | prod_name | cust_id | createtime          |+---------+-----------+---------+---------------------+|     103 | Beef      |       2 | 2024-04-12 16:42:35 ||     104 | Bread     |       3 | 2024-04-12 16:42:35 ||     105 | Cheese    |       4 | 2024-04-12 16:42:35 ||     110 | Book      |       1 | 2024-04-12 16:42:56 ||     119 | Apple     |       1 | 2024-04-12 16:42:57 |+---------+-----------+---------+---------------------+5 rows in set (0.00 sec)

5、使用闪回查询的as of timestamp语法查询查看products表中2024-04-12 16:42:41这个历史时间点的数据。

SELECT * FROM products AS of TIMESTAMP '2024-04-12 16:42:41';

+---------+-----------+---------+---------------------+| prod_id | prod_name | cust_id | createtime          |+---------+-----------+---------+---------------------+|     101 | Book      |       1 | 2024-04-12 16:42:35 ||     102 | Apple     |       1 | 2024-04-12 16:42:35 ||     103 | Beef      |       2 | 2024-04-12 16:42:35 ||     104 | Bread     |       3 | 2024-04-12 16:42:35 ||     105 | Cheese    |       4 | 2024-04-12 16:42:35 |+---------+-----------+---------+---------------------+

可以看到 prod_name 为 Book 和 Apple 的 prod_id 为未修改前的 101 和 102。

图片

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[层次分析法+模糊综合分析] 基于matlab的XX公司发展情况的综合评价

一 背景介绍 本文分析了一个使用层次分析法(AHP)和模糊综合评价对XX公司的发展现状进行评价,得到了整体的评价结果。主要包含: 专家打分-一致性分析-权重计算-问卷调查-评价矩阵-隶属度矩阵-最终评价结果等内容 二 评价体系的建立 根据XX公司…

亿发:信息化建设or面子工程?究竟什么才是真正的信息化解决方案

在现代企业的竞争中,信息化建设扮演着越来越重要的角色。信息化技术不仅是企业提升管理效率、优化运营模式的利器,更是企业在市场竞争中脱颖而出的关键。然而,许多企业在推进信息化的过程中,往往容易陷入“面子工程”的误区。那么…

mysql8 导入导出工具类,支持windows 和linux

概述 1)导入导出工具类 支持windows 和linux,详见第3部分 2)导入、导出参数在 dbeaver 中应用,详见第4部分 整理原因: 1)中文乱码 --default-character-setutf8 2)BLOB 导出后,导入失败 --he…

利用git将Qt代码托管到U盘或者网盘

文章目录 1.前言2.解决方案3.操作步骤3.1.软件安装3.2.在U盘创建裸仓库3.3.创建Qt程序并将代码上传至U盘3.4.版本标记及切换3.4.在别的电脑上clone代码出来 4.其他5.结语 1.前言 我们在开发项目时,随着项目需求的增加以及bug的修复,肯定会涉及到版本管理…

2024年中国安防CIS市场现状及主要竞争企业分析

2024年中国安防CIS市场现状及主要竞争企业分析 CIS又名CMOS图像传感器,属于一种光学传感器,将光信号转换为电信号并通过读出电路转为数字化信号,是摄像头模组的核心元器件,可以用于手机、汽车、电脑、安防、消费等领域。不同应用领…

Pyqt5中的按钮在播放后出现大小变化应该怎么做

有的时候开发的Pyqt5程序总是会在预览后发现按钮的大小和设计的不一样大,主要原因就是因为按钮的“水平策略”和“垂直策略”的设置导致的,具体如下: 设置为fixed,就是固定的,不要设置为其他的。 fixed的功能如下 部…

短信验证码实现

一、设置AccessKey 创建用户并配置使用权限,使我们拥有调用 aliyunAPI 的权限,之后会生成 AccessKeyID 和 AccessKey密码,后面我们会使用到。需要注意的是 AccessKeyID 和 AccessKey密码生成后我们需要将他保存起来,否则后期无法查…

网站UI:我只负责漂亮,实现的事情交给前端开发。

网页UI的美观性对于用户体验和网站的成功至关重要,以下是几个原因: 吸引用户:美观的网页UI可以吸引用户的注意力,使用户对网站产生兴趣并留下深刻印象。用户更有可能在美观的界面上停留更长时间,探索网站的功能和内容…

默安逐日实验室:XDP的应用实践

1. 网络数据包是如何进入进计算机的 众所周知,网络数据包通常需要在TCP/IP协议栈中进行处理,但网络数据包并不直接进入TCP/IP协议栈;相反,他们直接进入网络接口。因此,在数据包进入 TCP/IP 堆栈之前,它们已…

【计算智能】遗传算法(二):基本遗传算法在优化问题中的应用【实验】

前言 本系列文章架构概览: 本文将介绍基本遗传算法在解决优化问题中的应用,通过实验展示其基本原理和实现过程:选取一个简单的二次函数作为优化目标,并利用基本遗传算法寻找其在指定范围内的最大值。 2. 基本遗传算法(SGA&#x…

柯桥小语种学校成人生活口语学习|西班牙语中H为什么不发音…

01 H en el alfabeto espaol 西语字母表中的h 字母H是唯一一个在标准西班牙语中不再代表任何音素的字母。尽管在它单独出现时被叫做HACHE,但在大多数单词拼写中,它只是一个没有声音对应关系的字母,因此RAE称其为“无声的H”(hac…

如何正确安装与维护电化学一氧化碳传感器?专业指南

电化学一氧化碳传感器是一种用于检测空气中一氧化碳(CO)浓度的设备,它基于电化学原理运作。这类传感器的核心组成部分包括电极、电解质和透气膜,它们共同构成一个微型的电化学电池。 电化学一氧化碳传感器的特点包括:…

滑动窗口练习3-最大连续1的个数(三)

题目链接:. - 力扣(LeetCode) 题目描述: 给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。 示例 1: 输入:nums [1,1,1,0,0,0,1…

平面设计考试题

考试题 缺省页作用:缓减缺省页带来的负面情绪,增加s用户与产品的粘度,提升产品的用户体验 网站基本类型 c端b端 c端 面向用户和消费者的 门户站 产品网站 企业网站 电商网站 专题页面 游戏网站 视频网站 h5移动端 四大门户网站:新浪&…

【Android源码】Gerrit上传Android源码

关于Gerrit的安装参考下面链接 【Android源码】Gerrit安装 要实现上传Android源码,需要经历以下几步: 下载Android代码创建源码仓库创建manifests仓库上传源码其他电脑下载源码 要证明Gerrit中的源码真实可用,肯定是以其他人能真正共享到代…

idea中maven全局配置

配置了就不需要每次创建项目都来设置maven仓库了。 1.先把项目全关了 2. 进入全局设置 3.设置maven的仓库就可以了

绝地求生PUBG都准备了但是一直不匹配怎么办

绝地求生PUBG,作为一款备受玩家喜爱的射击游戏,以其真实的战斗体验和策略性决策而著称。玩家们在游戏中需要熟悉地图、选择适合的装备和战斗方式,并与队友进行默契的团队合作,才能在战场上取得优势。最近很多玩家都开始下载游玩绝…

RedHat9 | kickstart无人值守批量安装

一、知识补充 kickstart Kickstart是一种用于Linux系统安装的自动化工具,它通过一个名为ks.cfg的配置文件来定义Linux安装过程中的各种参数和设置。 kickstart的工作原理 Kickstart的工作原理是通过记录典型的安装过程中所需人工干预填写的各种参数,…

昇思25天学习打卡营第17天|ChatGLM-6B聊天demo

一、简介: 本次实验,基于MindNLP和ChatGLM6B模型搭建一个小的聊天应用,ChatGLM6B 是基于 GLM-4 模型开发的开源对话机器人,拥有 62 亿个参数,能够进行自然流畅的语言交流。在对话中,ChatGLM6B 可以胜任文案…

实现原理:远程过程调用(RPC)

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…