达梦数据闪回查询-快速恢复表
Time:2025/08/12
Author:skatexg
一、环境说明
DM数据库:DM8.0及以上版本
二、适用场景
研发在误操作或变更数据后,想马上恢复表到某个时间点,可以通过闪回查询功能快速实现(通过全量备份恢复时间长,成本高)
三、说明
- 闪回查询只支持普通表(包括加密表与压缩表)、水平分区表和堆表,不支持临时表、列存储表、外部表与视图;
- 闪回查询利用的是 UNDO 表空间里所记录的数据被改变前的值。因此,如果因保留时间超过了初始化参数 UNDO_RETENTION 所指定的值,从而导致闪回查询时所需要的 UNDO 数据被其他事务覆盖的话,那么就不能将表中数据恢复到指定的时间了
- 数据守护环境下,备库不支持闪回查询
四、闪回查询开启与关闭
查询闪回功能状态,数据库默认关闭 (0-关闭,1-打开),通过如下语句查询开启状态
SELECT name,
TYPE,
VALUE,
sys_value,
file_value
FROM v$parameter
WHERE name LIKE '%FLASHBACK%';
输出结果:
开启闪回查询
SP_SET_PARA_VALUE (1, 'ENABLE_FLASHBACK', 1);--无需重启服务器
--scope 为 1 表示 dm.ini 文件和内存参数都修改,不需要重启服务器;--scope 为 2 表示只修改 dm.ini 文件,服务器重启后生效。
--value: 设置的值。
关闭闪回查询
SP_SET_PARA_VALUE (1, 'ENABLE_FLASHBACK', 0);----无需重启服务器
配置可闪回数据保留时间
由于回滚段默认每秒种都会自动清理,所以需要延长回滚记录的保留时间,单位是秒。回滚段参数太大容易引发回滚段膨胀,这里设置为 3600s。示例语句如下所示:
ALTER SYSTEM SET 'undo_retention'=3600 BOTH;
SELECT name,
TYPE,
VALUE,
sys_value,
file_value
FROM v$parameter
WHERE name = 'UNDO_RETENTION';
输出结果:
五、数据闪回查询
通过指定一个时间(timestamp 类型),用一个日期时间字符串表达。使用 test_zxg 模式下的 tab_1 表。测试如下:
-1)切换schema
set schema "test_zxg"
2)查询 tab_1 表中的信息
SELECT * FROM tab_1 where id =1;
3)更新 id = 1,更新时间为 '2025-08-12 16:42:00'
UPDATE tab_1 set name='cccccc' where id =1;
4)再次查询 id = 1 时表中的信息
SELECT * FROM tab_1 where id =1;
4)闪回查询 update 操作前表中的信息
SELECT * FROM tab_1 WHEN TIMESTAMP '2025-08-12 16:40:00' where id =1
六、数据恢复
为安全起见,先把闪回查询的数据保存到临时表,后续在根据业务逻辑,研发按需恢复
CREATE table tab_bak20208121650 as SELECT * FROM tab_1 WHEN TIMESTAMP '2025-08-12 15:40:00'
另:数据变更前的备份方法
1、在dml某表数据前,如果表行数不多(10万以内)可以先备份表,然后再做表变更
CREATE table tab_bak20208121650 as SELECT * FROM tab_1 where id
注意:数据闪回功能达梦工程师建议生产环境关闭闪回,可能影响性能
----end----