【openGauss实战13】闪回技术
📢📢📢📣📣📣
哈喽!大家好,我是【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*4openGauss=# 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 | 2147483647openGauss=# 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 | 1048576select 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=# \duopenGauss=# \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@1231.建表、插入测试数据
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 yet2.误操作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 | reason12 | AB | reason23 | 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_60022.闪回
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 | reason12 | AB | reason23 | 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 | time12 | 2023-04-09 09:37:15.374307 | 2127 | time23 | 2023-04-09 09:41:49.92012 | 2311 | time34 | 2023-04-09 09:41:55.351731 | 2316 | time45 | 2023-04-09 09:41:59.390929 | 2319 | time52.设置参数
mydb=> show undo_retention_time;undo_retention_time
---------------------0undo_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 | time12 | 2023-04-09 09:37:15.374307 | 2127 | time25.基于SCN闪回
SELECT * FROM tpcds.time_table TIMECAPSULE CSN 2316;idx | snaptime | snapcsn | timedesc
-----+----------------------------+---------+---------1 | 2023-04-09 09:37:10.415875 | 2124 | time12 | 2023-04-09 09:37:15.374307 | 2127 | time23 | 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


相关文章:
【openGauss实战13】闪回技术
📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…...
Top大学教授:青年学者,请避免这些写作问题→
在科研初期,很多作者由于缺乏经验和指导,糊里糊涂地发了一些质量较低的论文。 为了帮助青年科学家提高写作能力,比利时鲁汶大学的Blocken教授(同时也是Building & Environment、Journal of Wind Engineering & Industrial…...
使用midjourney搞出一套三国人物画像!
当下已进入如火如荼的全民AI时代,最近体验了下midjourney,使用它的以图生图功能生成出来一套三国人物画像,和大家分享下使用心得。 使用midjourney的准备工作 下载工具 使用midjourney生产图片依赖的工具和流程,大致如下&#x…...
ELK日志分析系统
ELK日志分析系统 日志主要包括系统日志/var/log 应用日志 安全日志secure, rsyslog远程传输日志进行汇总集中化管理,日志统计和检索又成为一件比较麻烦的事情,、 1、完整日志系统基本特征 收集:能够采集多种来源的日志数据 …...
整型在内存中的存储
目录 一、为什么内存中存储补码? 二、大小端概念 百度笔试试题: 几道小题: 一、为什么内存中存储补码? 上一节我们了解了原码,反码,补码的概念(http://t.csdn.cn/N0grg)ÿ…...
子集-回溯算法
1题目 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入:nums [1,2,3] 输出:[[],[1],[2],[1…...
公司study three
ctrlwind:新建桌面 ctrlwin 箭头 切换桌面 WIN CTRL F4 删除桌面 stream foreach遍历 instFormModifytracesList.stream().forEach(s->{ s.setModifyUser(sysUserTemplate.getNameById(s.getModifyUser()));});拼接 String collect2 peopleList.stream()…...
【运维】speedtest测试
目录 docker 布署 布署云端 docker布署 云端放置于已有容器里 librespeed/speedtest: Self-hosted Speedtest for HTML5 and more. Easy setup, examples, configurable, mobile friendly. Supports PHP, Node, Multiple servers, and more (github.com) docker 布署 获取…...
CycloneDDS开源代码在Linux系统上编译生成可执行文件的详细步骤
cyclonedds开源代码在Linux系统上编译生成可执行文件的详细步骤 1 远程仓库CycloneDDS源码下载2 创建build目录3 进入build目录4 指定安装路径前缀5 编译 cmake --build6 编译完成后进行安装7 版本构建并编译7.1 虚拟机网络桥接7.2 镜像源添加7.3 CUnit单元测试工具安装7.4 编译…...
PLL锁相环的一部分--鉴频鉴相器
鉴频鉴相器作为锁相环的一部分也是有相对应的独立芯片. 鉴频鉴相器芯片主要有以下几种: LM565/LM565C 鉴频鉴相器芯片XR2211CP 鉴频鉴相器芯片NE567 比较器、鉴频、鉴相 ICMC1496/LM1496 综合运算放大器与调制/解调器 ICLM567 比较器、鉴频、鉴相 ICMC100EP2100 高…...
CSS实现磨砂玻璃(毛玻璃)效果样式
要实现磨砂玻璃背景,可以使用 CSS3 中的 ::before 伪元素和 backdrop-filter 属性,结合 opacity 属性和 blur() 函数来实现。 具体实现步骤如下: 创建一个具有背景的元素,例如一个 div 元素。 div {background-image: url(&quo…...
Solidity拓展:数学运算过程中数据长度溢出的问题
在数学运算过程中假如超过了长度则值会变成该类型的最小值,如果小于了该长度则变成最大值 数据上溢 uint8 numA 255; numA;uint8的定义域为[0,255],现在numA已经到顶了,numA会使num变成0(由于256已经超过定义域,它会越过256&…...
【C语言】经典题目(一)
【C语言】字符串刷题篇在这里哦! 【C语言】字符串—刷题篇 【C】语言经典题目,五个摘录为一篇,将会持续更新啦!💞 C语言经典题目 三位数水仙花数完数求利润三个数数字排序 三位数 💫题目 已知有1、2、3、4…...
Linux 设备树文件手动编译的 shell 脚本
前言 前面通过 Makefile 实现手动编译 Linux 设备树 dts 源文件及其 设备树依赖 dtsi、.h 头文件,如何写成一个 shell 脚本,直接编译呢? 其实就是 把 Makefile 重新编写为 shell 脚本即可 编译设备树 shell 脚本 脚本内容如下:…...
C++核心编程——初识STL——STL的基本概念和六大组件
文章目录💬 一.前言二.STL基本概念和组成①容器②算法③迭代器④空间配置器⑤适配器⑥仿函数 三.STL工作机制 一.前言 长久以来,软件界一直希望建立一种可重复利用的东西,以及一种得以制造出“可重复运用的东西”的方法,让程序员的心血不止于…...
5.2图的BFS与DFS遍历
一.BFS遍历 1.图的广度优先遍历代码实现 说明: 1.广度优先遍历,类比树的层次遍历(树属于特殊的图) 2.对应算法想象图的物理结构存储: 邻接矩阵表示唯一时间复杂度:O(|V|^2); 邻接表不唯一:O(|V|2|E|)&…...
JSP+SQL网上选课系统(源代码+论文+答辩PPT)
随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。学生选课系统作为一种现代化的教学技术,以越来越受到人民的重视,是一个学校不可缺少的部分, 学生选课系统就是为了管理好选课信息而设计的。学…...
C语言数据结构——树、堆(堆排序)、TOPK问题
🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,数据结构 🔥座右铭:“不要等到什么都没…...
springboot+vue 刘老师
课程内容 前端:vue elementui 后端:springboot mybatisplus 公共云部署 ------boot-------- 热部署 不用devtools,交给jrebel工具 RequestMapping 参数 value 路径 method 方法consumes 请求媒体类型 如 application/jsonproduces …...
学生网上考试报名系统的设计与实现
技术栈: MySQL、Maven、SpringBoot、Spring、SpringMVC、MyBatis、HikariCP、fastjson、slf4j系统功能:用户角色: (1)登录:用户在登录界面输入正确的账户名和密码,点击登录,系统将与…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
