作为一个达梦的初学者,写这篇文章的目的是为了把学到的新知识做个总结梳理,在整理中查缺补漏,也希望大家看了我的文章能有收获,如有错误的地方欢迎指出。
误删数据分为以下几种场景,针对不同场景做不同恢复操作。
误删前闪回处于开启
可以依靠回滚段进行闪回查询到被删除的数据。(truncate和drop除外)
开启闪回/设置保持时间:
SQL> alter system set 'ENABLE_FLASHBACK' = 1 both;
SQL> alter system set 'UNDO_RETENTION' = 3600 both;--(单位S)
查询是否开启闪回:
SQL> select name,value
from v$parameter
where name in ('ENABLE_FLASHBACK','UNDO_RETENTION');
开启且在保持时间内,执行查询语句:
SQL>select * from table_name when timestamp '20220426 19:00:00';
误删前有备份和开启归档
可以初始化一个新实例,将新实例恢复至删除前时间点。
- 初始化一个和故障实例参数一致的新实例
./dminit path=新实例目录
- 通过备份+归档还原
打开RMAN:
RMAN> RESTORE DATABASE '新实例DM.INI目录' FROM BACKUPSET '备份目录';
RMAN> RECOVER DATABASE '新实例DM.INI目录' with archivedir '归档目录' UNTIL time '恢复时间点';
RMAN> recover database '新实例DM.INI目录' update db_magic
若误操作数据很少,可以使用DBMS_LOGMNR对数据库归档日志进行挖掘,重构误操作,前提是开启了在日志中记录逻辑操作(1,2,3),查询语句如下。
SQL>select para_name, para_value
from v$dm_ini
where para_name in ('RLOG_APPEND_LOGIC');
参数说明:
- 查询归档信息,拿到name
SQL>select sequence# seq, name , to_char(first_time,'yyyy-mm-dd hh24:mi:ss') first_time, to_char(next_time,'yyyy-mm-dd hh24:mi:ss') next_time,
first_change# , next_change#
from v$archived_log;
若操作时间段的redo未归档,需要手动切换日志
SQL>alter system archive log current;
- 向系统包中添加日志文件(一次性可以添加多个,可以在V$LOGMNR_LOGS中查询信息)
SQL>DBMS_LOGMNR.ADD_LOGFILE('&name');
- 启动归档日志文件分析
SQL>DBMS_LOGMNR.START_LOGMNR(OPTIONS=>2128,
STARTTIME=>TO_DATE(‘2022-04-01 00:00:00’,‘YYYY-MM-DD HH24:MI:SS’),
ENDTIME=>TO_DATE(‘2022-04-01 12:00:00’,‘YYYY-MM-DD HH24:MI:SS’));--还可以指定START_SCN,END_SCN等参数
OPTIONS入参说明:
- 查看分析结果
SQL>SELECT OPERATION_CODE,OPERATION,SCN,SQL_REDO,TIMESTAMP ,SEG_OWNER, TABLE_NAME
FROM V$LOGMNR_CONTENTS
WHERE TABLE_NAME ='T_TEST3' and OPERATION='UPDATE';
- 终止归档日志文件分析
SQL>DBMS_LOGMNR.END_LOGMNR();
无备份和开启归档,未开启闪回
正常手段无法恢复。
达梦社区地址:https://eco.dameng.com