1达梦闪回
1.1背景
当用户操作不慎导致错误的删改数据时,非常希望有一种简单快捷的方式可以恢复数据。闪回技术,就是为了用户可以迅速处理这种数据逻辑损坏的情况而产生的。
1.2闪回技术
闪回技术主要是通过回滚段存储的 UNDO 记录来完成历史记录的还原。设置ENABLE_FLASHBACK 为 1 后,开启闪回功能。DM 会保留回滚段一段时间,回滚段保留的时间代表着可以闪回的时间长度。由 UNDO_RETENTION 参数指定。
1.3闪回原理
开启闪回功能后,DM 会在内存中记录下每个事务的起始时间和提交时间。通过用户指定的时刻,查询到该时刻的 LSN,结合当前记录和回滚段中的UNDO 记录,就可以还原出特定 LSN 的记录。即指定时刻的记录状态。从而完成闪回查询。闪回查询功能完全依赖于回滚段管理,对于 DROP 等误操作不能恢复。
(DM8系统管理员手册中描述的DROP操作不能恢复,在目前版本中测试已经可以恢复。通过启用回收站功能进行恢复)。
1.4闪回技术应用
闪回特性可应用在以下方面:
1.自我维护过程中的修复:当一些重要的记录被意外删除,用户可以向后移动到一个时间点,查看丢失的行并把它们重新插入现在的表内恢复;
2.用于分析数据变化:可以对同一张表的不同闪回时刻进行链接查询,以此查看变化的数据。
2闪回实践
2.1查询闪回
SELECT * FROM SYS.V$PARAMETER WHERE NAME LIKE 'ENABLE_FLASHBACK%'。
0代表闪回为开启。数据库默认安装情况下闪回是不开启状态。
2.2开启闪回并确认
SP_SET_PARA_VALUE(1,'ENABLE_FLASHBACK',1)
2.3配置UNDO_RETENTION
SP_SET_PARA_DOUBLE_VALUE(1,'UNDO_RETENTION',3600)
2.4创建测试表并初始化数据
CREATE TABLE FLASH_DEMO (
ID INT PRIMARY KEY,
NAME VARCHAR(50),
UPDATE_TIME TIMESTAMP DEFAULT SYSTIMESTAMP
);
INSERT INTO FLASH_DEMO VALUES(1, '测试A',SYSTIMESTAMP);
INSERT INTO FLASH_DEMO VALUES(2, '测试B',SYSTIMESTAMP);
INSERT INTO FLASH_DEMO VALUES(3, '测试C',SYSTIMESTAMP);
2.5时间闪回查询
插入一条新数据
INSERT INTO FLASH_DEMO VALUES(4, '测试D',SYSTIMESTAMP);
记录当前时间
SELECT SYSDATE;
将ID为4的数据,测试D改为测试DD
UPDATE FLASH_DEMO SET NAME='测试DD' WHERE ID=4;
COMMIT;
通过闪回查询更新前的数据
通过自行编写脚本查询不同版本之间的数据差异
SELECT *
FROM FLASH_DEMO A
WHERE NOT EXISTS
(SELECT 1
FROM (SELECT
*
FROM FLASH_DEMO
WHEN TIMESTAMP '2025-03-30 14:30:43') B
WHERE A.NAME = B.NAME)
2.6版本闪回查询
在实际环境中,并不是在当下发现误删除数据的情况下,也可以采用版本闪回的方式进行查询与恢复。通过时间戳、TRXID、LSN以及OPERATION可以清洗的判断某笔数据不同版本间的事务变化。
SELECT
VERSIONS_STARTTIME AS "起始时间戳",
VERSIONS_ENDTIME AS "提交时间戳",
VERSIONS_STARTTRXID AS "起始 TRXID",
VERSIONS_ENDTRXID AS "提交 TRXID",
VERSIONS_STARTSCN AS "起始 LSN",
VERSIONS_ENDSCN AS "提交 LSN",
VERSIONS_OPERATION,
ID, NAME
FROM
FLASH_DEMO
VERSIONS BETWEEN TIMESTAMP
SYSTIMESTAMP - INTERVAL '30' MINUTE AND
SYSTIMESTAMP
2.7时间闪回恢复
将ID为4的数据,NAME从测试DD恢复为测试D.
FLASHBACK TABLE FLASH_DEMO TO TIMESTAMP TO_TIMESTAMP('2025-03-30 14:44:08', 'YYYY-MM-DD HH24:MI:SS');
SELECT * FROM FLASH_DEMO;
重新查询发现ID为4的数据,已经完成闪回操作
2.8SCN闪回恢复
重新插入一条数据,并删除
INSERT INTO FLASH_DEMO VALUES(5, '测试E',SYSTIMESTAMP);
DELETE FROM FLASH_DEMO WHERE ID=5;
COMMIT;
查询版本后发现。删除前的LSN为932498,删除后的LSN为932536.
因此通过LSN为932498方式恢复删除前的数据。
FLASHBACK TABLE FLASH_DEMO TO SCN 932498;
SELECT * FROM FLASH_DEMO;
重新再进行版本闪回查询:
3启用回收站功能
3.1闪回DROP表
查询回收站状态
SELECT * FROM SYS.V$PARAMETER WHERE NAME LIKE 'RECYCLEBIN%';
开启回收站并重启数据库
SP_SET_PARA_VALUE(2,'RECYCLEBIN',1)
删除表
DROP TABLE FLASH_DEMO;
在回收站中可以查找到对应删除的表。
SELECT * FROM DBA_RECYCLEBIN;
通过闪回恢复回收站中的表,并验证
FLASHBACK TABLE FLASH_DEMO TO BEFORE DROP;
SELECT * FROM FLASH_DEMO;
3.2闪回TRUNCATE表
将RECYCLEBIN参数改为2
SP_SET_PARA_VALUE(2,'RECYCLEBIN',2)
清空FLASH_DEMO表
TRUNCATE TABLE FLASH_DEMO;
SELECT * FROM FLASH_DEMO;
此时再查看回收站,发现TRUNCATE掉的表,出现在回收站中
SELECT * FROM DBA_RECYCLEBIN;
恢复后查看,数据恢复
FLASHBACK TABLE FLASH_DEMO TO BEFORE TRUNCATE;
SELECT * FROM FLASH_DEMO;
3.3验证参数RECYCLEBIN为2时,是否支持闪回drop表
删除表
DROP TABLE FLASH_DEMO;
SELECT * FROM DBA_RECYCLEBIN;
恢复表
FLASHBACK TABLE FLASH_DEMO TO BEFORE DROP;
SELECT * FROM FLASH_DEMO;
3.4验证参数RECYCLEBIN为1时,是否支持闪回TRUNCATE表
删除表
TRUNCATE TABLE FLASH_DEMO;
SELECT * FROM DBA_RECYCLEBIN;
4总结
围绕闪回技术,需结合实际业务情况,对RECYCLEBIN_RETENTION、UNDO_RETENTION两个参数进行合理的设定。闪回及回收站的保留时间,直接影响到在误操作的情况下数据是否可以进行恢复。在RECYCLEBIN参数为2时,同时支持DROP及TRUNCATE表闪回。RECYCLEBIN参数为1时仅支持DROP表闪回。
文章
阅读量
获赞