GaussDB闪回恢复机制详解
1. 闪回技术概述
闪回恢复是GaussDB数据库恢复技术的关键组成部分,它能够有选择性地高效撤销一个已提交事务的影响,将数据从人为不正确操作中进行快速恢复。在采用闪回技术之前,数据库管理员只能通过备份恢复、PITR(时间点恢复)等手段找回已提交的数据库修改,恢复时长需要数分钟甚至数小时。而采用闪回技术后,恢复已提交的数据库修改前的数据只需要秒级完成,且恢复时间与数据库大小无关。
2. 闪回技术原理与架构
2.1 核心技术基础
GaussDB的闪回功能主要基于两种核心技术机制:
- MVCC多版本控制:通过维护数据的多个历史版本,允许用户查询或恢复到指定的历史时间点或CSN(提交序列号)点的数据状态。
- 回收站机制:类似于Windows系统的回收站,当用户执行DROP或TRUNCATE操作时,相关表不会被立即删除,而是进入回收站,可以在需要时恢复。
2.2 Ustore存储引擎优势
GaussDB的Ustore存储引擎是闪回功能的理想选择,它具有以下优势:
- 原位更新机制:最新版本和历史版本分离存储,去除Astore的HOT chain,非索引列/索引列更新时,Heap可原位更新,ROWID保持不变。
- 高效的版本管理:历史版本可批量回收,空间膨胀可控,不依赖Vacuum进行旧版本清理。
- 全面的闪回支持:结合Undo回滚段技术,可以实现更高效、更全面的闪回查询和回收站机制。
下面的流程图展示了闪回查询和闪回表操作的内部处理机制:
3. 闪回功能分类与应用场景
GaussDB主要提供三类闪回功能,每种功能适用于不同的误操作场景:
R:基于角色的访问控制,角色通常是指具有某些共同特征的一组人,在系统初始时Admin根据业务需要创建多个拥有不同权限组合的不同角色,当需要赋予某个用户权限的时候,把用户归到相应角色里即可赋予符合需要的权限。
A:则是通过动态计算一个或一组属性来是否满足某种条件来进行授权判断(可以编写简单的逻辑)。属性通常来说分为四类:用户属性(如用户年龄),环境属性(如当期时间),操作属性(如读取)和对象属性(如一篇文章,又称资源属性),所以理论上能实现非常灵活的权限控制,几乎能满足所有类型的需求。权限判断需要实时执行,规则过多会导致性能问题
两者区别:R和A之间的主要区别在于R基于用户角色提供对资源或信息的访问,而A提供基于用户、环境或资源属性的访问权限
3.1 闪回查询
功能描述:闪回查询可以查询过去某个时间点表的snapshot数据,这一特性可用于查看和逻辑重建意外删除或更改的受损数据。闪回查询基于MVCC多版本机制,通过检索查询旧版本,获取指定老版本数据。
适用场景:
- 查询特定时间点的数据状态
- 确认误操作前的数据内容
- 为数据恢复提供验证手段
3.2 闪回表
功能描述:闪回表可以将表恢复至特定时间点,当逻辑损坏仅限于一个或一组表,而不是整个数据库时,此特性可以快速恢复表的数据。闪回表基于MVCC多版本机制,通过删除指定时间点和该时间点之后的增量数据,并找回指定时间点和当前时间点删除的数据,实现表级数据还原。
适用场景:
- 误UPDATE操作导致数据错误
- 误INSERT操作导致数据污染
- 误DELETE操作导致数据丢失
3.3 闪回DROP/TRUNCATE
功能描述:
- 闪回DROP:可以恢复意外删除的表,从回收站(recyclebin)中恢复被删除的表及其附属结构如索引、表约束等。
- 闪回TRUNCATE:可以恢复误操作或意外被进行truncate的表,从回收站中恢复被truncate的表及索引的物理数据。
适用场景:
- 误执行DROP TABLE语句
- 误执行TRUNCATE TABLE语句
- 意外删除重要业务表
4. 闪回功能配置与启用
函数加密:字段级,通过调用函数,如md5()等函数对传入参数进行加密,业务感知加密,不支持密文条件安全,数据在会话中临时解密,数据库无法自动解密,防止高权限账户窃取数;
透明加密:表级,数据在文件落盘时加密,对用户及上层使用SQL的应用不感知,对于需要加密的表创建时通过TDE参数指定加密算法,数据库无感知,内存明文处理,防止基于物理磁盘的数据窃取,TDE秘钥管理分为三层,分别是根秘钥,主秘钥,数据加密秘钥。
全密态:字段级,支持密态等值查询,数据库无法解密,防止运维、管理、高权限账户窃取隐私数据,在业务中仅在DDL层做了扩展,在create table或者alter table新增列时可以将列设置为加密列,给需要的列绑定列加密密钥即可,如果DML操作于其他表一致,但需要以密态方式(-C)创建客户端连接才可以,如果是非密态模式,那么查看到的数据是密文,未指定加密的列数据均已明文处理,密钥管理分为三层,分别根密钥,主密钥,列加密密钥,密钥均存储于GaussDB client,减少攻击面;
总结来说,函数加密,是用客户把密钥给到数据库,数据库在执行函数时做一个加密动作,是在数据库里加密。透明加密是在数据库自己找一个密钥,在磁盘落盘时做加密。全密态等值是客户找到密钥之后先把数据加密,再交给数据库,全生命周期都是密文的。
客户端和服务端SSL通信加密,SSL加密支持对称加密、非对称加密,对称加密算法指的是加密和解密使用相同的秘钥,特点是算法公开,加解密速度快、效率高;非对称加密算法包含两个秘钥:公钥和私钥,公钥和私钥是一对,加密和解密使用不同的秘钥,特点是算法复杂度高、安全性更强、性能较对称加密差。
常见算法为AES、DES、MD5、SM4
4.1 前期环境配置
要使用GaussDB的闪回功能,需要先进行以下参数配置:
bash
# 设置undo_zone_count参数
gs_guc set -N all -I all -c "undo_zone_count=16384"
# 启用回收站功能
gs_guc set -N all -I all -c "enable_recyclebin=on"
# 设置回收站对象保留时间(单位为秒)
gs_guc set -N all -I all -c "recyclebin_retention_time=30min"
# 重启数据库使配置生效
gs_om -t restart
关键参数说明:
- undo_zone_count:设置内存中可分配的undo zone数量,0代表禁用undo和Ustore表,建议取值为max_connections*4。
- enable_recyclebin:启用或禁用回收站功能。
- recyclebin_retention_time:设置回收站对象保留时间,超过该时间的回收站对象将被自动清理。
4.2 存储引擎选择
重要提示:GaussDB中闪回DROP/TRUNCATE功能需要表使用Ustore存储引擎。ASTORE引擎暂不支持闪回DROP/TRUNCATE。
创建支持闪回功能的表:
sql
-- 创建Ustore表
CREATE TABLE tpcds.reason_t2
(
r_reason_sk integer,
r_reason_id character(16),
r_reason_desc character(100)
) with(STORAGE_TYPE=USTORE);
5. 闪回操作实战详解
存的优点
- 存储过程极大的提高SQL语言的灵活性,可以完成复杂的运算
- 可以保障数据的安全性和完整性
- 极大的改善SQL语句的性能,在运行存储过程之前,数据库已对其进行语法和句法分析,并给出优化执行优化方案。这种已经编译好的过程极大地改善了SQL语句性能
- 可以降低网络的通信量,客户端通过调用存储过程只需要存储过程名和相关参数即可,与传输SQL语句相比自然数据量少很多
存和函的区别
- 含义不同: 存储过程是SQL语句和可控制流程语句的预编译集合;函数是有一个或多个SQL语句组成的子程序;
- 使用条件不同: 存储过程可以在单个存储过程中执行一系列SQL语句。而且可以从自己的存储过程内引入其他存储过程,这可以简化一系列复杂的语句;函数自定义函数有着诸多限制,有许多语句不能使用,例如临时表。
- 执行方式不同:存储过程:存储过程可以返回参数,如记录集,存储过程声明时不需要返回类型;函数:函数只能返回值或表对象,声明时需要描述返回类型,且函数中必须包含一个有效return语句。
存和匿名块的区别
存储过程是经过预编译并存储在数据库中的,可以重复使用;而匿名块是未存储在数据库中,从应用程序缓存区擦除后,除非应用重新输入代码,否则无法重新执行。
匿名块无需命名,存储过程必须申明名字。
5.1 闪回查询操作
语法格式:
sql
SELECT * FROM table_name TIMECAPSULE { TIMESTAMP | CSN } expression;
实际示例:
- 基于时间戳的闪回查询:
sql
SELECT * FROM t1 TIMECAPSULE TIMESTAMP to_timestamp ('2020-02-11 10:13:22.724718', 'YYYY-MM-DD HH24:MI:SS.FF');
- 基于CSN的闪回查询:
sql
SELECT * FROM t1 TIMECAPSULE CSN 9617;
5.2 闪回表操作
语法格式:
sql
TIMECAPSULE TABLE table_name TO { TIMESTAMP | CSN } expression
实际示例:
- 恢复到特定时间点:
sql
TIMECAPSULE TABLE t1 TO TIMESTAMP to_timestamp ('2020-02-11 10:13:22.724718', 'YYYY-MM-DD HH24:MI:SS.FF');
- 恢复到特定CSN点:
sql
TIMECAPSULE TABLE t1 TO CSN 9617;
5.3 闪回DROP/TRUNCATE操作
以下是闪回DROP和TRUNCATE操作的完整流程示意图:
实际示例:
- 闪回TRUNCATE操作:
sql
-- 创建测试表
CREATE TABLE tpcds.reason_t2
(
r_reason_sk integer,
r_reason_id character(16),
r_reason_desc character(100)
) with(STORAGE_TYPE=USTORE);
-- 插入测试数据
INSERT INTO tpcds.reason_t2 VALUES (1, 'AA', 'reason1'),(2, 'AB', 'reason2'),(3, 'AC', 'reason3');
-- 误执行TRUNCATE操作
TRUNCATE TABLE tpcds.reason_t2;
-- 执行闪回恢复
TIMECAPSULE TABLE tpcds.reason_t2 TO BEFORE TRUNCATE;
-- 验证数据恢复
SELECT * FROM tpcds.reason_t2;
- 闪回DROP操作:
sql
-- 误删除表
DROP TABLE tpcds.reason_t2;
-- 从回收站恢复表
TIMECAPSULE TABLE tpcds.reason_t2 TO BEFORE DROP;
-- 为恢复的表指定新名称
TIMECAPSULE TABLE tpcds.reason_t2 TO BEFORE DROP RENAME TO reason_backup;
5.4 回收站管理
GaussDB的回收站可以通过以下命令进行管理:
- 查看回收站内容:
sql
SELECT * FROM gs_recyclebin;
- 永久删除回收站对象:
sql
-- 删除特定表(不进入回收站)
DROP TABLE table_name PURGE;
-- 清理回收站中的特定对象
PURGE TABLE table_name;
PURGE TABLE "BIN$04LhcpndanfgMAAAAAANPw==$0";
-- 清空整个回收站
PURGE RECYCLEBIN;
6. 注意事项与限制
区别
- 全:在备份全部数据时,全量备份需要的时间最长,因为需要备份的数据量最大。但是这种备份方式在恢复时速度最快,只需要一个磁盘即可恢复丢失的数据。此外由于需要备份的数据量最大,全量备份可能会占用较多的存储空间。
- 差:差分备份是备份自上一次完全备份之后有变化的数据。这种备份方式相较于全量备份,备份数据量较少,因此备份所需时间较短。同时由于只需要对第一次全量备份和最后一次差异备份进行恢复,所以恢复时间也相对较快。但是差分备份的数据恢复过程相较于全量备份和增量备份较为复杂。
- 增:增量备份是备份自上一次备份(包括完全备份、差异备份、增量备份)之后有变化的数据。这种备份方式最大的优点是没有重复的备份数据,因此备份的数据量不大,备份所需的时间很短。但是增量备份的数据恢复比较麻烦,需要所有的增量备份数据才能进行恢复。
三种备份所备份的数据量不一样,所需时间也不一样,全量备份不需要依赖于其他任意备份,差分和增量备份都需要依赖于全量备份。
大小关系
- 全的数据集是最大的,是执行备份时刻的所有数据。
- 差的数据集虽然没有全量大,但相比增量更大,因此差分备份的是相较上一次全量备份有变更的数据
- 增的数据集大小是三种备份中最小的,因为增量备份只与上一次备份相比较,无论上一次备份是全量、差分还是增量都可以
所有三种备份的数据集大小排序为:全量>差分>增量
依赖哪个关键文件
将数据恢复到指定时间点需要基于PITR技术实现,主要需要依赖于全量备份文件、增量备份文件和WAL日志。
恢复时先根据指定时间点找到最近一次全量备份进行恢复,然后逐个恢复这次全量后的增量备份,直到恢复到时间点前最后一次增量备份,从最后一次增量备份到时间点这段时间的数据通过WAL日志进行恢复
6.1 通用限制条件
使用闪回功能时,需要注意以下限制:
- 不支持闪回的对象类型:系统表、列存表、DFS表、全局临时表、本地临时表、UNLOGGED表、序列表、hashbucket表、密态表。
- DDL操作限制:闪回点和当前点之间,如果执行过修改表结构或影响物理存储的语句(DDL、DCL、VACUUM FULL),闪回将失败。
- 多对象操作限制:DROP/TRUNCATE TABLE命令同时指定多个对象时,不支持闪回。
6.2 权限要求
执行闪回操作需要相应的权限:
- 闪回删除权限:用户必须具有垃圾对象所在schema的create和usage权限,并且必须是schema的所有者或者是垃圾对象的所有者。
- 闪回TRUNCATE权限:除了上述权限外,用户还必须具有垃圾对象的TRUNCATE权限。
6.3 版本兼容性
- ASTORE引擎限制:ASTORE存储引擎暂不支持闪回DROP/TRUNCATE功能。
- 备机限制:备机不支持闪回操作。
7. 故障排查与常见问题
什么是数据库事务。介绍gaussDB数据库事务管理的实现
事务是作为单个逻辑单元执行的一系列操作,这些操作作为一个整体一起向系统提交要么都执行,要么都不执行。事务是一个不可分割的工作逻辑单元,GaussDB数据库事务支持ACID特性
GaussDB基于MVCC(多版本并发控制)并结合两阶段锁的方式进行事务管理,其特点是读写之间不阻塞。select是纯读操作,update和delete是读写操作。在准备阶段就会把提交操作所需的信息和资源全部写入磁盘,进行持久化,提交阶段根据之前准备好的提交信息和资源,故障或执行失败发生在准备阶段和提交阶段之间,事务的最终状态为回滚
GaussDB基于GTM组件协助管理分布式事务,采用多版本并发控制MVCC机制。
GaussDB提供了不同的GTM模式,GTM-Lite,GTM-Free。在GTM-Lite模式下,中心事务处理节点的压力得到减轻,事务处理流程进一步优化,GTM的性能和并发瓶颈得到减轻,可实现强一致性;在GTM-Free模式下,中心事务管理节点不再参与事务管理,消除了GTM单点瓶颈,可达到更高的事务处理性能,不支持强一致性,仅支持最终一致性。
GaussDB数据有哪些事务隔离级别,并说明含义
GaussDB数据库支持的事务隔离级别有READ COMMITTED、REPEATABLE READ和SERIALIZABLE,SERIALIZABLE等价于REPEATABLE READ
READ COMMITTED:读已提交隔离级别,事务只能读到已提交的数据而不会读到未提交的数据,这是缺省值。
在读已提交模式里,每个新的命令都是从一个新的快照开始的,而这个快照包含所有到该时刻为止已提交的事务,因此同一事务中后面的命令将看到任何已提交的其它事务的效果。这里关心的问题是在单个命令里是否看到数据库里完全一致的视图。
REPEATABLE READ:事务可重复读隔离级别,事务只能读到事务开始之前已提交的数据,不能读到未提交的数据以及事务执行期间其它并发事务提交的修改(但是,查询能查看到自身所在事务中先前修改的执行结果,即使先前修改尚未提交)。这个级别和读已提交是不一样的,因为可重复读事务中的查询看到的是事务开始时的快照,不是该事务内部当前查询开始时的快照,就是说,单个事务内部的select命令总是查看到同样的数据,查看不到自身事务开始之后其他并发事务修改后提交的数据。
SERIALIZABLE:GaussDB目前功能上不支持此隔离级别,设置该隔离级别时,等价于REPEATABLE READ
7.1 常见错误及解决方案
- "ERROR: timecapsule does not support astore yet"
- 原因:尝试对ASTORE存储引擎的表执行闪回操作。
- 解决方案:创建表时指定STORAGE_TYPE=USTORE。
- "ERROR: Restore point too old"
- 原因:闪回点过旧,旧版本已被回收。
- 解决方案:调整vacuum_defer_cleanup_age和version_retention_age参数,设置更长的旧版本保留期限。
- "ERROR: The table definition of %s has been changed"
- 原因:在闪回点和当前点之间,执行过修改表结构的DDL操作。
- 解决方案:选择DDL操作之前的闪回点,或使用其他恢复方法。
7.2 最佳实践建议
- 预防性措施:
- 为重要表始终使用Ustore存储引擎
- 设置适当的回收站保留时间
- 定期检查回收站内容
- 操作建议:
- 在执行批量数据操作前记录当前CSN
- 定期测试闪回流程以确保其有效性
- 对开发团队进行闪回功能培训
- 监控与维护:
- 监控回收站空间使用情况
- 定期清理过期的回收站对象
- 记录所有闪回操作用于审计
总结
GaussDB的闪回机制提供了强大而灵活的数据恢复能力,使数据库管理员能够快速应对各种人为误操作场景。通过合理配置和使用闪回查询、闪回表以及闪回DROP/TRUNCATE功能,可以显著降低数据恢复时间,从传统的数小时缩短到秒级,大大提高数据库的可用性和可靠性。
需要注意的是,为了充分发挥闪回功能的优势,应该在数据库设计阶段就考虑使用Ustore存储引擎,并合理配置相关参数,同时结合传统备份方案形成多层次的数据保护体系。
- 点赞
- 收藏
- 关注作者
评论(0)