达梦DM8启用闪回数据库需依次完成归档模式开启、闪回恢复区配置、ENABLE_FLASHBACK参数启用三步;归档未生效或闪回区权限不足将导致FLASHBACK DATABASE失败。
确认数据库是否已启用归档模式
闪回数据库功能依赖归档日志,没开归档,flashback database 直接报错或根本不可用。别跳这步——很多人卡在“执行成功但恢复失败”,根源就是归档没真跑起来。
- 查状态:
SELECT name, arch_mode FROM v$database;,返回ARCH_MODE为Y才算开启 - 如果为
N,必须先停库到MOUNT状态:ALTER DATABASE MOUNT;,再执行ALTER DATABASE ARCHIVELOG; - 加一条本地归档路径(例如
/dm8/arch),并手动切一次日志验证:ALTER SYSTEM ARCHIVE LOG CURRENT; - 检查
v$archived_log是否有新生成的归档记录,没记录说明归档配置未生效
设置闪回恢复区位置与大小
db_recovery_file_dest 不是可选项,是闪回日志的唯一落盘位置;不设它,FLASHBACK DATABASE 启用会失败,且后续所有闪回操作都无从谈起。
- 指定路径(需提前创建并赋权):
ALTER SYSTEM SET 'db_recovery_file_dest' = '/dm8/flashback' BOTH; - 限制空间上限(防磁盘写满):
ALTER SYSTEM SET 'db_recovery_file_dest_size' = 30G BOTH;(单位必须带G或M) - 路径权限要确保数据库实例用户(如
dmdba)有读写权限,否则启动时报ORA-19802类错误 - 该路径不能和归档路径(
DEST)混用,否则可能引发日志冲突或清理误删
启用闪回数据库并验证状态
达梦 DM8 的闪回数据库开关是 ENABLE_FLASHBACK,不是 Oracle 的 FLASHBACK ON。名字不同、语法不同,混用就白配。
- 打开开关:
ALTER SYSTEM SET 'ENABLE_FLASHBACK' = 1 BOTH;(注意单引号、等号两边无空格) - 验证是否生效:
SELECT SF_GET_PARA_VALUE(2, 'ENABLE_FLASHBACK') AS in_mem, SF_GET_PARA_VALUE(1, 'ENABLE_FLASHBACK') AS in_file FROM DUAL;,两个值都应为1 - 重启非必需,但建议执行一次
ALTER SYSTEM ARCHIVE LOG CURRENT;触发后台进程初始化闪回日志写入 - 查当前状态:
SELECT flashback_on FROM v$database;—— 达梦不返回YES/NO,而是直接显示1或0
调整 UNDO_RETENTION 以延长可恢复时间窗口
UNDO_RETENTION 决定闪回查询(AS OF TIMESTAMP)能回退多久,但它不影响 FLASHBACK DATABASE 的能力范围;后者依赖的是闪回恢复区里的物理日志,而非 UNDO 段。
- 若主要用闪回表或闪回查询,建议设为至少
1200(秒):ALTER SYSTEM SET 'undo_retention' = 1200 BOTH; - 这个值只是“建议保留时长”,实际能否查到,取决于闪回区空间是否被覆盖、UNDO 表空间是否足够、以及事务活跃度
- 设得过大(如 86400)可能造成 UNDO 表空间膨胀,尤其在高并发更新场景下,容易触发
ORA-30036错误 - 真正影响
FLASHBACK DATABASE可恢复最早时间点的,是v$flashback_database_log中的OLDEST_FLASHBACK_SCN和OLDEST_FLASHBACK_TIME,它由闪回日志自动管理,不直接受UNDO_RETENTION控制

















