【openGauss实战13】闪回技术

news2025/2/27 21:12:06

📢📢📢📣📣📣
哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验
一位上进心十足的【大数据领域博主】!😜😜😜
中国DBA联盟(ACDU)成员,目前服务于工业互联网
擅长主流Oracle、MySQL、PG、高斯及GP 运维开发,备份恢复,安装迁移,性能优化、故障应急处理等。
✨ 如果有对【数据库】感兴趣的【小可爱】,欢迎关注【IT邦德】💞💞💞
❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️

文章目录

  • 前言
    • 📣 1.闪回概述
    • 📣 2.参数设置
    • 📣 3.回收站的恢复
      • ✨ 3.1 TRUNCATE 恢复
      • ✨ 3.2 TRUNCATE 恢复
    • 📣4.MVCC数据恢复
    • 📣 5.技能总结

前言

本篇结合企业实战介绍了openGauss闪回技术。

📣 1.闪回概述

openGauss闪回功能能够有选择性的高效撤销一个已提交事务的影响,从人为错误中恢复。
在采用闪回技术之前,只能通过备份恢复、PITR等手段找回已提交的数据库修改,恢复时长需要数分钟甚至数小时。
采用闪回技术后,恢复已提交的数据库修改前的数据,只需要秒级,而且恢复时间和数据库大小无关。

1)误删除表的场景;
2)需要将表中的数据恢复到指定时间点或者CSN

闪回支持两种恢复模式:
1.基于MVCC多版本的数据恢复:适用于误删除、误更新、误插入数据的查询和恢复,用户通过配置旧版本保留时间,
并执行相应的查询或恢复命令,查询或恢复到指定的时间点或CSN点。
2.基于类似windows系统回收站的恢复:适用于误DROP、误TRUNCATE的表的恢复。用户通过配置回收站开关,并执行相应的恢复命令,
可以将误DROP、误TRUNCATE的表找回。

📣 2.参数设置

## 参数说明:

1.启用回收站参数enable_recyclebin
2.设置回收站对象保留时间recyclebin_retention_time,超过该时间的回收站对象将被自动清理。单位为s,最小值为0,最大值为2147483647。
3.设置内存中可分配的undo zone数量undo_zone_count,0代表禁用undo和Ustore表,建议取值为max_connections*4

openGauss=# select name,setting,min_val,max_val from pg_settings where name like 'enable_recyclebin';
       name        | setting | min_val | max_val
-------------------+---------+---------+---------
 enable_recyclebin | off     |         |

openGauss=# select name,setting,min_val,max_val from pg_settings where name like 'recyclebin_retention_time';
           name            | setting | min_val |  max_val
---------------------------+---------+---------+------------
 recyclebin_retention_time | 900     | 1       | 2147483647


openGauss=# select name,setting,min_val,max_val from pg_settings where name like 'undo_zone_count';
      name       | setting | min_val | max_val
-----------------+---------+---------+---------
 undo_zone_count | 0       | 0       | 1048576


select name,setting,min_val,max_val from pg_settings where name like 'max_connections';
      name       | setting | min_val | max_val
-----------------+---------+---------+---------
 max_connections | 5000    | 10      | 262143
 
## 何设置参数
gs_guc set -N all -I all -c "undo_zone_count=20000"            
gs_guc set -N all -I all -c "enable_recyclebin=on"           
gs_guc set -N all -I all -c "recyclebin_retention_time=1440min"  
gs_om -t restart

📣 3.回收站的恢复

回收站的方式有两种:
1.闪回TRUNCATE:可以恢复误操作或意外被进行truncate的表,从回收站中恢复被truncate的表及索引的物理数据。
闪回truncate基于回收站机制,通过还原回收站中记录的表的物理文件,实现已truncate表的恢复。

2.闪回DROP:可以恢复意外删除的表,从回收站(recyclebin)中恢复被删除的表及其附属结构如索引、表约束等。
闪回drop是基于回收站机制,通过还原回收站中记录的表的物理文件,实现已drop表的恢复。

✨ 3.1 TRUNCATE 恢复

openGauss=# \c
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "postgres" as user "omm".

openGauss=# CREATE DATABASE mydb WITH ENCODING 'GBK' template = template0;
openGauss=# CREATE USER mesdb PASSWORD 'Gauss@123';
openGauss=# GRANT ALL PRIVILEGES TO mesdb;
openGauss=# \du

openGauss=# \c mydb mesdb
Password for user mesdb:
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "mydb" as user "mesdb".

密码:Gauss@123

1.建表、插入测试数据
create SCHEMA tpcds; 
DROP TABLE IF EXISTS tpcds.reason; 
 CREATE TABLE tpcds.reason
 ( 
  r_reason_sk    integer, 
  r_reason_id    character(16), 
  r_reason_desc  character(100) 
  ) with(STORAGE_TYPE=USTORE); 
  
INSERT INTO tpcds.reason VALUES (1, 'AA', 'reason1'),(2, 'AB', 'reason2'),(3, 'AC', 'reason3'); 
select * from tpcds.reason;

说明:
Ustore存储引擎将最新版本的“有效数据”和历史版本的“垃圾数据”分离存储。将最新版本的“有效数据”存储在数据页面上,并单独开辟一段UNDO空间,用于统一管理历史版本的“垃圾数据”,因此数据空间不会由于频繁更新而膨胀,“垃圾数据”集中回收效率更高。

Ustore存储引擎结合UNDO空间,可以实现更高效、更全面的闪回查询和回收站机制,能快速回退人为“误操作”,为openGauss提供了更丰富的企业级功能。
数据库启动之前,在postgresql.conf中设置“enable_default_ustore_table=on”,默认指定用户创建表时使用USTORE存储引擎。
select name,setting,min_val,max_val from pg_settings where name like 'enable_default_ustore_table';

如果有以下报错,由于openGauss建表默认为astore模式,是不支持闪回的。所以,现在需要修改建表脚本为ustore模式才可以闪回。
mydb=> TIMECAPSULE TABLE tpcds.reason1 to BEFORE TRUNCATE;
ERROR:  timecapsule does not support astore yet


2.误操作TRUNCATE
mydb=> TRUNCATE TABLE tpcds.reason;
mydb=> select * from tpcds.reason;
 r_reason_sk | r_reason_id | r_reason_desc
-------------+-------------+---------------
(0 rows)

3.闪回数据
mydb=> TIMECAPSULE TABLE tpcds.reason to BEFORE TRUNCATE;
TimeCapsule Table
mydb=> select * from tpcds.reason;
 r_reason_sk |   r_reason_id    | r_reason_desc
-------------+------------------+--------------
           1 | AA               | reason1
           2 | AB               | reason2
           3 | AC               | reason3
说明:以上数据已经被闪回了

✨ 3.2 TRUNCATE 恢复

1.误操作DROP
mydb=> DROP TABLE tpcds.reason;
mydb=> select * from tpcds.reason;
ERROR:  relation "tpcds.reason" does not exist on dn_6001_6002

2.闪回
mydb=> TIMECAPSULE TABLE tpcds.reason to BEFORE DROP; 
TimeCapsule Table
mydb=> select * from tpcds.reason;
 r_reason_sk |   r_reason_id    | r_reason_desc
-------------+------------------+--------------
           1 | AA               | reason1
           2 | AB               | reason2
           3 | AC               | reason3
说明:以上数据已经被闪回了

📣4.MVCC数据恢复

1.建表
drop table if EXISTS tpcds.time_table; 
create table tpcds.time_table(idx integer, snaptime timestamp, snapcsn bigint, timeDesc character(100)) with(STORAGE_TYPE=USTORE); 
 
INSERT INTO tpcds.time_table select 1, now(),int8in(xidout(next_csn)), 'time1' from gs_get_next_xid_csn(); 
INSERT INTO tpcds.time_table select 2, now(),int8in(xidout(next_csn)), 'time2' from gs_get_next_xid_csn(); 
--出去上个厕所再回来 
INSERT INTO tpcds.time_table select 3, now(),int8in(xidout(next_csn)), 'time3' from gs_get_next_xid_csn(); 
--去买了包烟
INSERT INTO tpcds.time_table select 4, now(),int8in(xidout(next_csn)), 'time4' from gs_get_next_xid_csn();
--刷了会视频
INSERT INTO tpcds.time_table select 5, now(),int8in(xidout(next_csn)), 'time5' from gs_get_next_xid_csn();

mydb=> select * from tpcds.time_table;
 idx |          snaptime          | snapcsn | timedesc
-----+----------------------------+---------+----------------------------------------
   1 | 2023-04-09 09:37:10.415875 |    2124 | time1
   2 | 2023-04-09 09:37:15.374307 |    2127 | time2
   3 | 2023-04-09 09:41:49.92012  |    2311 | time3
   4 | 2023-04-09 09:41:55.351731 |    2316 | time4
   5 | 2023-04-09 09:41:59.390929 |    2319 | time5


2.设置参数
mydb=> show undo_retention_time;
 undo_retention_time
---------------------
 0

undo_retention_time --参数用于设置undo旧版本的保留时间。
undo_zone_count=16384 --代表的时候undo log的一种资源个数
enable_default_ustore_table=on --默认指定用户创建表时使用USTORE存储引擎

gs_guc set -N all -I all -c "undo_retention_time=2000s"
gs_guc set -N all -I all -c "undo_retention_time=1440min"
gs_guc set -N all -I all -c "undo_zone_count=16384"
gs_guc set -N all -I all -c "enable_default_ustore_table=on"
gs_guc set -N all -I all -c "undo_retention_time=1440min"

gs_ctl reload -D /opt/openGauss/data/dn  --加载参数
   
3.误删除数据
mydb=> delete tpcds.time_table;

4.根据时间点闪回
SELECT * FROM tpcds.time_table TIMECAPSULE TIMESTAMP to_timestamp('2023-04-09 09:41:49.92012','YYYY-MM-DD HH24:MI:SS.FF');
idx |          snaptime          | snapcsn | timedesc
-----+----------------------------+---------+---------
   1 | 2023-04-09 09:37:10.415875 |    2124 | time1
   2 | 2023-04-09 09:37:15.374307 |    2127 | time2

5.基于SCN闪回
SELECT * FROM tpcds.time_table TIMECAPSULE CSN 2316;
 idx |          snaptime          | snapcsn | timedesc
-----+----------------------------+---------+---------
   1 | 2023-04-09 09:37:10.415875 |    2124 | time1
   2 | 2023-04-09 09:37:15.374307 |    2127 | time2
   3 | 2023-04-09 09:41:49.92012  |    2311 | time3

📣 5.技能总结

##清空回收站
mydb=> purge recyclebin;  

## ustore VS astore
现在反思下我遇到的两个问题,都是因为表的存储方式为astore,而闪回特性不支持该种类型导致的,建表时指定为ustore就可以解决。so,有没有办法默认建表时就是ustore存储呢?继续翻看产品文档,是有参数可以设置的。

gs_guc set -N all -I all -c "enable_default_ustore_table=on"  --设置参数
gs_ctl reload -D /opt/openGauss/data/dn  --加载参数

astore:
openGauss内核当前使用的行引擎采用的是Append Update(追加更新)模式,该模式在INSERT、DELETE、HOT UPDATE(页面内更新)的场景下有较好的表现。主要面向通用的在线交易处理类业务应用场景,适合高并发、小数据量的单点或小范围数据读、写操作。astore为行存储格式,向上提供元组形式的读、写;向下以页面为单位通过可扩展的介质管理器对存储介质进行读、写操作;并通过页面粒度的共享缓冲区来优化读、写操作的效率。
因此,astore存储格式比较适合频繁插入、少量更新的业务场景.

ustore:
ustore属于In-place Update更新模式,中文意思为:原地更新,是openGauss内核新增的一种存储模式。astore对于非HOT UPDATE场景,垃圾回收不够高效。ustore存储模式提供“原地更新”能力,主要思路是将最新版本的“有效数据”和历史版本的“垃圾数据”分离存储。将最新版本的“有效数据”存储在数据页面上,而单独开辟一段undo(回滚)空间,用于统一管理历史版本的“垃圾数据”,因此数据空间不会由于频繁更新而膨胀,垃圾回收效率更高。通过NUMA-aware的undo子系统设计,使得undo子系统在多核平台上高效扩展。同时通过对元组和数据页面结构的重新设计,减少存储空间的占用。采用多版本索引技术,解决索引膨胀问题,彻底去除autovacuum(垃圾清理线程)机制,提升存储空间的回收复用效率。当前USTORE存储引擎不支持极致RTO回放模式。对于主机,在recovery_parse_workers参数设置大于1的情况下,创建USTORE存储引擎的表将返回报错;对于备机,如果数据库中已经包含USTORE表,那么后续如果再打开极致RTO功能,可能会导致回放失败和报错,严重情况下甚至可能导致备机数据损坏(这种情况下需要执行备机重建进行修复)。

## 其他设置
mydb=> show server_version;
 server_version
----------------
 9.2.4
mydb=> \copyright
GaussDB Kernel Database Management System
Copyright (c) Huawei Technologies Co., Ltd. 2018. All rights reserved.

mydb=> \conninfo
You are connected to database "mydb" as user "mesdb" via socket in "/opt/openGauss/tmp" at port "15400".

mydb=> show AUTOCOMMIT;
 autocommit
------------
 on

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

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

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

相关文章

SolidWorks创建自定义焊件轮廓的方法

在一些特定的设计情景下,一般的国标焊件库、ISO焊件库等可能满足不了我们的设计使用需求,这时候就需要我么你自己创建一个焊件轮廓,从而应用到我们的设计中。 创建新焊件轮廓的方法如下: 1.打开SolidWorks,创建一个新…

记录--9个封装Vue组件的小技巧

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 组件是前端框架的基本构建块。把它们设计得更好会使我们的应用程序更容易改变和理解。在这节课中,分享一下在过去几年中工作中学到的 9 个技巧。 1. 你可能不需要创建一个组件 在创建一个组…

eBpf在Android上的集成和调试

eBPF(Extended Berkeley Packet Filter )是一种新兴的linux内核功能扩展技术,可以无需修改内核代码,在保证安全的前提下,灵活的动态加载程序,实现对内核功能的扩展。 Android平台上也引入了对eBpf技术的支持…

Python—实现本地音乐播放器(添加/播放/暂停/下一首/上一首/音量/打开超链接)

文章目录 1.样例2.分析2.1播放器界面2.2功能2.2.1添加音乐,选择文件夹,显示文件夹里.Mp3文件2.2.2播放音乐,开始播放第一首音乐,按钮由"播放"变为"暂停",点击"暂停",变为"播放",播放显示Playing...2.2.3下一首,…

【ElasticSearch】分词器(ElasticSearchIK分词器)

1. 分词器介绍 •IKAnalyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包•是一个基于Maven构建的项目•具有60万字/秒的高速处理能力•支持用户词典扩展定义 2. ik 分词器安装 IK 分词器安装 3. 分词器的使用 IK分词器有两种分词模式:ik…

港科夜闻|香港科大与香港科大(广州)管理层联席会议顺利召开

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大与香港科大(广州)管理层联席会议顺利召开。这是自内地和香港全面恢复通关以来,两校的高级管理团队首次举行线下的联席会议,面对面交流、讨论有关两校协同发展的重要议题。两校持续深入推进…

【零基础学web前端】走进CSS的大门,CSS引入方式,CSS基础选择器,CSS复合选择器

前言: 大家好,我是良辰丫,前面我们已经学了html的相关知识,今天我们一起去探索前端网页的css,那么css到底是什么呢?我们慢慢往下看.💞💞 🧑个人主页:良辰针不戳 📖所属专栏:零基础学web前端 🍎…

二叉树层级遍历以及相关练习

二叉树层级遍历以及相关练习 文章目录 二叉树层级遍历以及相关练习思想步骤代码实现相关练习 力扣:102. 二叉树的层序遍历 - 力扣(Leetcode) 思想 层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。 使用队列实现二叉树广度优先遍…

算法修炼之练气篇——练气二十层

博主:命运之光 专栏:算法修炼之练气篇 前言:每天练习五道题,炼气篇大概会练习200道题左右,题目有C语言网上的题,也有洛谷上面的题,题目简单适合新手入门。(代码都是命运之光自己写的…

实例演示如何结合Selenium和Requests进行自动化测试

下方查看历史精选文章 重磅发布 - 自动化框架基础指南pdfv1.1大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 Selenium和Requests是两个常用的自动化测试…

Meme和BRC-20的暴跌洗盘

* * * 原创:刘教链 * * * 5月以来的Meme(模因币,发音类似“谜姆”)狂欢,有ERC-20版本的Meme比如Pepe(青蛙佩佩),也有BRC-20版本的Meme比如ordi(序数协议本身的名字&…

IM即时通讯系统[SpringBoot+Netty]——梳理(二)

文章目录 五、IM开发核心之构建TCP网关(上)1、编写LimServer2、编写LimWebSocketServer3、使用snakeyaml动态配置文件4、大白话讲通信协议—详解主流通讯协议4.1、文本协议4.2、二进制协议4.3、xml协议4.4、可以落地使用的协议 5、私有协议编解码—设计篇…

ArcGIS栅格重采样与算法选择

本文介绍在ArcMap软件中,实现栅格图像重采样的具体操作,以及不同重采样方法的选择依据。 首先,如下图所示,是我们待重采样的栅格图像的属性界面。其中,可以看到此时栅格像元的边长为0.4867左右(由于图层是地…

“技术开发最应该做什么?”,聊聊我在服务端开发5年的理解和收获

我们新推出大淘宝技术年度特刊《长期主义,往往从一些小事开始——工程师成长总结专题》,专题收录多位工程师真诚的心路历程与经验思考,覆盖终端、服务端、数据算法、技术质量等7大技术领域,欢迎一起沟通交流。 本文为此系列第二篇…

我的.net视频课程

https://edu.csdn.net/lecturer/222?spm1002.2001.3001.4144

9.并发基础与CAS基本原理

线程的状态/线程的生命周期 初始化 Thread thread new Thread();运行 thread.start(); 运行中状态 ——> 调用yeild进入就绪状态就绪状态 ——> 通过系统调度(获取到cpu时间片),又会进入到运行中状态 等待 调用如下方法就从运行进入到等待状态: Object.wait()、Object.…

2360. 图中的最长环

方法一&#xff1a;拓扑排序加搜索 class Solution { public:bool vis[100005];vector<int>v[100005];int dfs(vector<int> &dist,int st,int step){vis[st]true; // cout<<st<<endl;int res0;for(int i0;i<v[st].size();i){int xv[st][i];if(…

Angular开发之——Angular项目介绍(03)

一 概述 Angular项目目录介绍Angular程序如何启动 二 Angular项目目录介绍 2.1 项目目录 2.2 目录结构说明 工作区配置文件 node_modules &#xff1a;第三方依赖包存放的目录src&#xff1a;应用源代码目录angular-cli.json&#xff1a; Angular命令行工具的配置文件&…

设计模式之桥接模式释义与举例剖析

文章目录 一、前言二、模式定义三、模式结构四、案例具体实现五、 模式优缺点六、 模式使用场景七、 模式总结 一、前言 开始学Java讲继承的时候&#xff0c;总喜欢用一个例子来讲解&#xff0c;那就是画图形。这里有一个画笔&#xff0c;可以画正方形、长方形、圆形。除了画出…

OpenCV-答题卡识别-四点透视变换

目录 答题卡识别图片读取四点透视变换 划出区域处理选择题区域处理准考证号区域处理科目区域得分导出结果 封装成品 答题卡识别 使用opencv技术&#xff0c;实现对答题卡的自动识别&#xff0c;并进行答题结果的统计 技术目的&#xff1a; 能够捕获答题卡中的每个填涂选项;将…