日常运维经常遇到两类误操作:开发写错条件批量删改业务数据、运维误执行DROP/TRUNCATE清空整张业务表。传统恢复依赖 RMAN 物理备份,需要停机、恢复耗时长,还会覆盖全库数据。值得注意的是,达梦8 与 Oracle 数据库存在较大差异:回收站闪回、UNDO 闪回两项特性均需提前开启方能使用,并且 DM8 暂不支持闪回点、闪回数据库功能。
闪回是达梦 8 提供的逻辑误操作快速恢复能力,依托 UNDO 回滚段或回收站隐藏对象,无需停机、精准恢复单表 / 单行数据,区别于传统 RMAN 物理备份恢复,无需停机、恢复速度快,专门解决以下人为误操作:
DROP TABLE 删表、TRUNCATE TABLE 清空全表;达梦 8 为应对完全不同的误操作场景,提供两种闪回技术:
| 分类 | 底层载体 | 核心参数 | 支持恢复类型 | 核心限制 |
|---|---|---|---|---|
| 回收站闪回 | 原表空间 BIN$ 隐藏对象 | RECYCLEBIN | DROP TABLE、TRUNCATE TABLE | 占用磁盘空间 |
| UNDO 闪回 | 回滚表空间 UNDO 数据 | ENABLE_FLASHBACK | INSERT/UPDATE/DELETE 行数据 | 无法恢复 TRUNCATE/DROP,DDL 会阻断表闪回 |
说明:静态参数,修改后必须重启数据库
-- 查询当前回收站参数配置
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);
说明:动态参数,修改后立即生效
参数说明:
修改参数:
-- 设置回收站保留3小时(10800秒)
SP_SET_PARA_VALUE(1,'RECYCLEBIN_RETENTION',10800);
场景模拟:多次删除 T3 表,回收站存在多条同名 BIN 对象
SQL> DROP TABLE T3;
--回收站对象
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
关键字段解释:
(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]:对象不在回收站中
--访问恢复的表,验证恢复的数据
SQL> SELECT COUNT(*) FROM T3;
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
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的表数据
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]:对象不在回收站中.
设置RECYCLEBIN_RETENTION后,超过设置的保留时间后会自动清理DROP或TRUNCATE的表。如果想手动维护回收站内容或删除表时不经过回收站,可通过以下方式进行维护。
-- 清空当前用户全部回收站
SQL> PURGE RECYCLEBIN;
-- 单独清理指定BIN回收站对象
SQL> PURGE TABLE "BIN$1058$0";
-- SYSDBA清空全库所有用户回收站
SQL> PURGE DBA_RECYCLEBIN;
--drop或truncate不经过回收站
SQL> DROP TABLE T3 PURGE;
SQL> TRUNCATE TABLE T3 PURGE;
说明:动态参数,修改后立即生效
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);
说明:动态参数,修改后立即生效
含义:事务提交后,UNDO 回滚数据最小保留时长,默认 90 秒;
参数为浮点类型,使用 SP_SET_PARA_VALUE 修改,会报 [-3503] 无效函数参数。
-- 设置UNDO快照保留1小时(3600秒)
SQL> SP_SET_PARA_DOUBLE_VALUE(1,'UNDO_RETENTION',3600);
适用场景:整个表中数据闪回到指定时间点,会造成新增数据丢失。
SQL> select * from t3;
行号 ID NAME
---------- -- ----
1 1 cs1
--查询当前时间或LSN值
SQL> SELECT SYSDATE,FILE_LSN FROM V$RLOG;
行号 SYSDATE FILE_LSN
---------- ------------------- --------------------
1 2026-07-02 15:22:06 68691
SQL> INSERT INTO T3 VALUES(2,'cs2'),(3,'cs3'),(4,'cs4');
SQL> COMMIT;
-- 按时间点闪回整表,撤销新增数据
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;
SQL> select * from t3;
行号 ID NAME
---------- -- ----
1 1 cs1
适用场景:仅需导出历史数据,不希望直接覆盖当前业务表。
--查询时间在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]:闪回版本已过期.
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');
适用场景:读取 UNDO 中完整事务变更链,单条记录从插入、更新、删除全生命周期记录全部展示,用于定位误操作事务。
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;
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 | 下一次数据修改时间 |
文章
阅读量
获赞
