注册
达梦DM8数据库闪回技术
专栏/培训园地/ 文章详情 /

达梦DM8数据库闪回技术

BigQ 2026/07/28 194 0 0
摘要

一 数据库闪回概述

日常运维经常遇到两类误操作:开发写错条件批量删改业务数据、运维误执行DROP/TRUNCATE清空整张业务表。传统恢复依赖 RMAN 物理备份,需要停机、恢复耗时长,还会覆盖全库数据。值得注意的是,达梦8 与 Oracle 数据库存在较大差异:回收站闪回、UNDO 闪回两项特性均需提前开启方能使用,并且 DM8 暂不支持闪回点、闪回数据库功能。

1.1 数据库闪回

闪回是达梦 8 提供的逻辑误操作快速恢复能力,依托 UNDO 回滚段或回收站隐藏对象,无需停机、精准恢复单表 / 单行数据,区别于传统 RMAN 物理备份恢复,无需停机、恢复速度快,专门解决以下人为误操作:

  1. DML 误操作:批量 DELETE/UPDATE 写错条件,丢失业务行数据;
  2. DDL 误操作:DROP TABLE 删表、TRUNCATE TABLE 清空全表;
  3. 数据溯源:查询历史数据、查看一条记录全生命周期变更记录。

1.2 闪回技术对比

达梦 8 为应对完全不同的误操作场景,提供两种闪回技术:

分类 底层载体 核心参数 支持恢复类型 核心限制
回收站闪回 原表空间 BIN$ 隐藏对象 RECYCLEBIN DROP TABLE、TRUNCATE TABLE 占用磁盘空间
UNDO 闪回 回滚表空间 UNDO 数据 ENABLE_FLASHBACK INSERT/UPDATE/DELETE 行数据 无法恢复 TRUNCATE/DROP,DDL 会阻断表闪回

二 回收站闪回

2.1 核心参数

2.1.1 RECYCLEBIN

说明:静态参数,修改后必须重启数据库

-- 查询当前回收站参数配置 SQL> select I.PARA_NAME,I.PARA_VALUE,I.DEFAULT_VALUE,I.PARA_TYPE from SYS.V$DM_INI I where i.PARA_NAME IN ('RECYCLEBIN','RECYCLEBIN_RETENTION'); 行号 PARA_NAME PARA_VALUE DEFAULT_VALUE PARA_TYPE ---------- -------------------- ---------- ------------- --------- 1 RECYCLEBIN 0 0 IN FILE 2 RECYCLEBIN_RETENTION 0 0 SYS

参数说明:

  • 0(默认关闭):DROP/TRUNCATE 直接物理删除,无回收站,无法闪回;
  • 1:仅 DROP TABLE 进入回收站,TRUNCATE 直接释放空间;
  • 2(核心业务推荐):DROP、TRUNCATE 操作均存入回收站,支持两类表恢复。

修改参数(持久化到 dm.ini,需重启实例生效):

--仅修改配置文件,重启后生效 SQL> SP_SET_PARA_VALUE(2,'RECYCLEBIN',2);

2.1.2 RECYCLEBIN_RETENTION

说明:动态参数,修改后立即生效

参数说明:

  • 单位:秒;含义:回收站 BIN$ 对象最小保留时长;
  • 超时后后台自动清理 BIN 对象,释放磁盘空间,数据无法找回;

修改参数:

-- 设置回收站保留3小时(10800秒) SP_SET_PARA_VALUE(1,'RECYCLEBIN_RETENTION',10800);

2.1.3 回收站影响

  1. 磁盘占用持续上涨:大表 DROP/TRUNCATE 后数据不会释放,长期堆积易导致磁盘空间不足;
  2. 回收站对象只读隔离:BIN$ 对象无法执行 UPDATE/ALTER/DROP 等 DDL/DML,仅支持 SELECT、FLASHBACK、PURGE;

2.2 Drop表闪回

场景模拟:多次删除 T3 表,回收站存在多条同名 BIN 对象

  1. 模拟误删除表
SQL> DROP TABLE T3;
  1. 查询回收站,定位 BIN 唯一标识
--回收站对象 SQL> select OWNER,OBJECT_NAME,ORIGINAL_NAME,OPERATION,TYPE,DROPTIME,BASE_OBJECT from DBA_RECYCLEBIN WHERE ORIGINAL_NAME='T3'; 行号 OWNER OBJECT_NAME ORIGINAL_NAME OPERATION TYPE DROPTIME BASE_OBJECT ---------- ------ ----------- ------------- --------- ----- ------------------- ----------- 1 SYSDBA BIN$1053$0 T3 DROP TABLE 2026-07-02:11:49:55 1053 2 SYSDBA BIN$1054$0 T3 DROP TABLE 2026-07-02:11:51:02 1054

关键字段解释:

  • OBJECT_NAME:BIN$xxxx$0 全局唯一标识,同名表依靠此字段精准恢复历史版本;
  • OPERATION=DROP:代表该记录由 DROP TABLE 生成;
  • DROPTIME:表删除时间,区分新旧删除记录;
  • BASE_OBJECT:删除前原始表 OBJECT_ID;
  1. DROP表,根据不同场景进行恢复

(1)被删除的表还在回收站中:

-- 方式1:无同名冲突场景,直接恢复最新删除的T3 SQL> FLASHBACK TABLE T3 TO BEFORE DROP; -- 方式2:存在多条同名时必用,指定BIN对象精准恢复早期删除的表 SQL> FLASHBACK TABLE "BIN$1053$0" TO BEFORE DROP; -- 方式3:恢复同时重命名,避免与现有业务表冲突,仅DROP闪回支持RENAME SQL> FLASHBACK TABLE "BIN$1054$0" TO BEFORE DROP RENAME TO T3_20260702_DROP;

(2)被删除的表超过回收站保留时间:

SQL> FLASHBACK TABLE T3 TO BEFORE DROP; FLASHBACK TABLE T3 TO BEFORE DROP; 第1 行附近出现错误[-9807]:对象不在回收站中
  1. 校验恢复数据
--访问恢复的表,验证恢复的数据 SQL> SELECT COUNT(*) FROM T3;

2.3 Truncate表闪回

  1. 确认当前回收站模式,RECYCLEBIN=2,否则 TRUNCATE 不会生成回收站记录,无法闪回清空前数据。
SQL> select I.PARA_NAME,I.PARA_VALUE from SYS.V$DM_INI I where i.PARA_NAME ='RECYCLEBIN'; 行号 PARA_NAME PARA_VALUE ---------- ---------- ---------- 1 RECYCLEBIN 2
  1. 查询 TRUNCATE 产生的回收站记录
SQL> select OWNER,OBJECT_NAME,ORIGINAL_NAME,OPERATION,TYPE,DROPTIME,BASE_OBJECT from DBA_RECYCLEBIN WHERE ORIGINAL_NAME='T3'; 行号 OWNER OBJECT_NAME ORIGINAL_NAME OPERATION TYPE DROPTIME BASE_OBJECT ---------- ------ ----------- ------------- --------- ----- ------------------- ------------- 1 SYSDBA BIN$1057$0 T3 TRUNCATE TABLE 2026-07-02:14:39:07 1057
  1. truncate表根据不同场景恢复

(1)表中无数据,可直接恢复:

--恢复最近truncate的表数据 SQL> FLASHBACK TABLE T3 TO BEFORE TRUNCATE; --恢复多次truncate某个版本的表数据 SQL> FLASHBACK TABLE "BIN$1059$0" TO BEFORE TRUNCATE;

(2)表中有数据,闪回会造成表中原有数据覆盖:

-- 1. 临时迁移当前业务表 SQL> ALTER TABLE T3 RENAME TO T3_TMP_CURR; -- 2. 精准闪回TRUNCATE前历史数据 sql> FLASHBACK TABLE "BIN$1059$0" TO BEFORE TRUNCATE; -- 3. 将恢复的历史表重命名备份 SQL> ALTER TABLE T3 RENAME TO T3_20260702_TRUNCATE; -- 4. 还原业务表原名 SQL> ALTER TABLE T3_TMP_CURR RENAME TO T3;

(3)被清空的表超过回收站保留时间:

SQL> FLASHBACK TABLE T3 TO BEFORE TRUNCATE; FLASHBACK TABLE T3 TO BEFORE TRUNCATE; 第1 行附近出现错误[-9807]:对象不在回收站中.

2.4 回收站空间维护

设置RECYCLEBIN_RETENTION后,超过设置的保留时间后会自动清理DROP或TRUNCATE的表。如果想手动维护回收站内容或删除表时不经过回收站,可通过以下方式进行维护。

2.4.1 手动清理回收站

-- 清空当前用户全部回收站 SQL> PURGE RECYCLEBIN; -- 单独清理指定BIN回收站对象 SQL> PURGE TABLE "BIN$1058$0"; -- SYSDBA清空全库所有用户回收站 SQL> PURGE DBA_RECYCLEBIN;

2.4.2 直接DROP/TRUNCATE表

--drop或truncate不经过回收站 SQL> DROP TABLE T3 PURGE; SQL> TRUNCATE TABLE T3 PURGE;

三 UNDO闪回

3.1 核心参数

3.1.1 ENABLE_FLASHBACK

说明:动态参数,修改后立即生效

SQL> select I.PARA_NAME,I.PARA_VALUE,I.DEFAULT_VALUE,I.PARA_TYPE from SYS.V$DM_INI I where i.PARA_NAME IN ('ENABLE_FLASHBACK','UNDO_RETENTION'); 行号 PARA_NAME PARA_VALUE DEFAULT_VALUE PARA_TYPE ---------- ---------------- ---------- ------------- --------- 1 ENABLE_FLASHBACK 0 0 SYS 2 UNDO_RETENTION 90.000000 90.000000 SYS

参数说明:

  • 0(默认关闭):闪回查询、闪回表、版本查询全部失效;
  • 1(开启):完整支持 AS OF 闪回查询、FLASHBACK TABLE TO TIMESTAMP/LSN、VERSIONS 版本查询。

修改参数:

-- 全局开启闪回 SQL> SP_SET_PARA_VALUE(1,'ENABLE_FLASHBACK',1);

3.1.2 UNDO_RETENTION

说明:动态参数,修改后立即生效

含义:事务提交后,UNDO 回滚数据最小保留时长,默认 90 秒;

参数为浮点类型,使用 SP_SET_PARA_VALUE 修改,会报 [-3503] 无效函数参数。

-- 设置UNDO快照保留1小时(3600秒) SQL> SP_SET_PARA_DOUBLE_VALUE(1,'UNDO_RETENTION',3600);

3.1.3 闪回的影响

  1. ROLL 回滚表空间占用上涨,批量 DELETE 会快速膨胀回滚段文件;
  2. UNDO 空间不足时,旧快照被覆盖,无法进行闪回;
  3. DDL操作会对 FLASHBACK TABLE / 闪回查询存在影响,对表进行DDL后无法进行闪回;

3.2 闪回表

适用场景:整个表中数据闪回到指定时间点,会造成新增数据丢失。

  1. 查看原始数据
SQL> select * from t3; 行号 ID NAME ---------- -- ---- 1 1 cs1
  1. 记录当前时间/LSN
--查询当前时间或LSN值 SQL> SELECT SYSDATE,FILE_LSN FROM V$RLOG; 行号 SYSDATE FILE_LSN ---------- ------------------- -------------------- 1 2026-07-02 15:22:06 68691
  1. 模拟新增数据
SQL> INSERT INTO T3 VALUES(2,'cs2'),(3,'cs3'),(4,'cs4'); SQL> COMMIT;
  1. 对T3表进行闪回
-- 按时间点闪回整表,撤销新增数据 SQL> FLASHBACK TABLE T3 TO TIMESTAMP TO_DATE('2026-07-02 15:22:06','YYYY-MM-DD HH24:MI:SS'); 操作已执行 --按LSN精准闪回,精度高于时间戳 SQL> FLASHBACK TABLE T3 TO LSN 64699;
  1. 校验T3表数据已回退
SQL> select * from t3; 行号 ID NAME ---------- -- ---- 1 1 cs1

3.3 闪回查询

适用场景:仅需导出历史数据,不希望直接覆盖当前业务表。

  1. 查询某个时间点的数据
--查询时间在UNDO_RETENTION保留时间内可正常查询 SQL> SELECT * FROM T3 AS OF TIMESTAMP TO_DATE('2026-07-02 15:28:54','YYYY-MM-DD HH24:MI:SS'); 行号 ID NAME ---------- -- ---- 1 1 cs1 --查询时间超过UNDO_RETENTION保留时间,报9801错误 SQL> SELECT * FROM T3 AS OF TIMESTAMP TO_DATE('2026-07-02 15:28:54','YYYY-MM-DD HH24:MI:SS'); [-9801]:闪回版本已过期.
  1. 将历史快照落地为备份表
SQL> CREATE TABLE T3_BAK_20260702 AS SELECT * FROM T3 AS OF TIMESTAMP TO_DATE('2026-07-02 15:28:54','YYYY-MM-DD HH24:MI:SS');

3.4 闪回版本查询

适用场景:读取 UNDO 中完整事务变更链,单条记录从插入、更新、删除全生命周期记录全部展示,用于定位误操作事务。

  1. 创建测试表,模拟多次变更
SQL> CREATE TABLE t4(id INT PRIMARY KEY,name VARCHAR(20)); SQL> INSERT INTO t4 VALUES(1,'张三'); SQL> COMMIT; SQL> UPDATE t4 SET name='小张' WHERE id=1; SQL> COMMIT; SQL> DELETE FROM t4 WHERE id=1; SQL> COMMIT;
  1. 查询1分钟内所有数据版本记录
SQL> SELECT VERSIONS_STARTTRXID, VERSIONS_ENDTRXID, VERSIONS_OPERATION, VERSIONS_STARTTIME, VERSIONS_ENDTIME, id, name FROM t4 VERSIONS BETWEEN TIMESTAMP SYSTIMESTAMP - INTERVAL '1' MINUTE AND SYSTIMESTAMP; 行号 VERSIONS_STARTTRXID VERSIONS_ENDTRXID VERSIONS_OPERATION VERSIONS_STARTTIME VERSIONS_ENDTIME ID NAME ---------- -------------------- -------------------- ------------------ ------------------- ------------------- ----------- ------ 1 190984 NULL D 2026-07-02 16:40:29 NULL 1 小张 2 190983 190984 U 2026-07-02 16:40:29 2026-07-02 16:40:29 1 小张 3 190976 190983 I 2026-07-02 16:40:29 2026-07-02 16:40:29 1 张三

版本伪列说明:

伪列名称 含义
VERSIONS_STARTTRXID 本次变更对应的事务 ID
VERSIONS_ENDTRXID 下一次变更事务 ID,NULL 代表当前最新数据
VERSIONS_OPERATION 操作类型:I = 插入 U = 更新 D = 删除
VERSIONS_STARTTIME 本次数据修改时间
VERSIONS_ENDTIME 下一次数据修改时间
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服