误删除操作是操作数据库时避免不了的,以下介绍的是达梦数据库三种在误删除操作后的回退方案。
一、闪回
1. 什么是达梦数据库的闪回?
当用户操作不慎导致错误的删改数据时,非常希望有一种简单快捷的方式可以恢复数据。闪回技术,就是为了用户可以迅速处理这种 数据逻辑损坏的情况而产生的。 闪回技术主要是通过回滚段存储的 UNDO 记录来完成历史记录的还原。
设置 ENABLE_FLASHBACK 为 1 后,开启闪回功能。DM 会保留回滚段一段时间,回滚段保留的时间代表着可以闪回的时间长度。 由 UNDO_RETENTION 参数指定。 开启闪回功能后,DM 会在内存中记录下每个事务的起始时间和提交时间。通过用户指定的时刻,查询到该时刻的事务号,结合当前记录和回滚段中的 UNDO 记录,就可以还原出特定事务号的记录。即指定时刻的记录状态。从而完成闪回查询。
闪回查询功能完全依赖于回滚段管理,对于 DROP 等误操作不能恢复。闪回特性可应用在以下 方面:
(1) 自我维护过程中的修复:当一些重要的记录被意外删除,用户 可以向后移动到一个 时间点,查看丢失的行并把它们重新插入现在的表内恢复;
(2)用于分析数据变化:可以对同一张表的不同闪回时刻进行链接 查询,以此查看变化的数据。
2. 闪回查询
当系统 INI 参数 ENABLE_FLASHBACK(动态,系统级) 置为 1 时,闪回功能开启,可以进行闪回查询。
sf_set_system_para_value('ENABLE_FLASHBACK',1,0,1);
注:MPP 环境不支持闪回查询。
2.1 闪回子查询
闪回查询子句的语法,是在数据查询语句的基础上,为 FROM 子 句增加了闪回查询子句。
语法格式:
<闪回查询子句>::=WHEN <TIMESTAMP time_exp> | <TRXID trxid>
参数:
time_exp 一个日期表达式,一般用字符串方式表示;
语句功能:
用户通过闪回查询子句,可以得到指定表过去某时刻的结果集。指定条件可以为时刻,或事务号。
使用说明:
(1)闪回查询只支持普通表(包括加密表与压缩表)、临时表和堆 表,不支持水平分区表、列存储表、外部表与视图;
(2)闪回查询中 trxid 的值,一般需要由闪回版本查询的伪列来确 定。实际使用中多采用指定时刻的方式。
例 1 :
闪回查询特定时刻的 PERSON_TYPE 表。
查询 PERSON_TYPE 表。
SELECT * FROM PERSON.PERSON_TYPE;
结果集如下所示:
在 2012-01-01 12:22:49 时刻插入数据,并提交:
INSERT INTO PERSON.PERSON_TYPE(NAME) VALUES('防损员');
INSERT INTO PERSON.PERSON_TYPE(NAME) VALUES('保洁员');
COMMIT;
SELECT * FROM PERSON.PERSON_TYPE;
结果集如下所示:
使用闪回查询取得 2012-01-01 12:22:45 时刻的数据。此时刻在插入数据的操作之前,可见此时的结果集不应该有 2012-01-01 12:22:49 时刻插入的数据。
SELECT * FROM PERSON.PERSON_TYPE WHEN TIMESTAMP '2012-01-01 12:22:45';
结果集如下所示:
在 2012-01-01 12:23:29 时刻删除数据,并提交:
DELETE FROM PERSON.PERSON_TYPE WHERE PERSON_TYPEID > 5;
COMMIT;
SELECT * FROM PERSON.PERSON_TYPE;
结果集如下所示:
使用闪回查询得到删除前的数据:
SELECT * FROM PERSON.PERSON_TYPE WHEN TIMESTAMP '2012-01-01 12:23:00';
结果集如下所示:
例 2 :
闪回查询指定 TRXID 的 PERSON_TYPE 表要获得 TRXID 信息, 需要通过闪回版本查询的伪列 VERSIONS_ENDTRXID。
在 2012-01-01 12:24:05 时刻修改数据,并提交:
UPDATE PERSON.PERSON_TYPE SET NAME='保安员' WHERE PERSON_TYPEID=5;
COMMIT;
UPDATE PERSON.PERSON_TYPE SET NAME='收银员' WHERE PERSON_TYPEID=5;
COMMIT;
SELECT * FROM PERSON.PERSON_TYPE;
结果集如下所示:
进行闪回版本查询,确定 TRXID:
SELECT VERSIONS_ENDTRXID, NAME FROM PERSON.PERSON_TYPE VERSIONS BETWEEN TIMESTAMP '2012-01-01 12:24:00' AND SYSDATE;
得到结果集如下所示:
根据 TRXID 确定版本:
SELECT * FROM PERSON.PERSON_TYPE WHEN TRXID 322;
结果集如下所示:
2.2 闪回版本查询
语法格式:
<闪回版本查询子句>::=VERSIONS BETWEEN <TIMESTAMP time_exp1 AND time_exp2> | <TRXID trxid1 AND trxid2>
参数:
(1)time_exp 日期表达式,一般用字符串方式表示。time_exp1 表 示起始时间,time_exp2 表示结束时间 。
(2)trxid 指定事务 ID 号,整数表示。trxid1 表示起始 trxid, trxid2 表示结束 trxid 。
使用说明 :
(1)闪回版本查询支持普通表(包括加密表与压缩表)、临时表和 堆表,不支持水平分区表、列存储表、外部表与视图;
(2)支持如下图所示伪列,作为闪回版本查询的辅助信息。
如下图所示: 闪回版本查询支持的伪列
语句功能:
用户通过闪回版本查询子句,可以得到指定表过去某个时间段内,事务导致记录变化的全部记录。指定条件可以为时刻,或事务号。
举例说明:
例 1 :
闪回版本查询指定时间段内,PERSON_TYPE 表的记录变化。
在 2012-01-01 12:24:05 时刻修改数据,并提交。
UPDATE PERSON.PERSON_TYPE SET NAME='保安员' WHERE PERSON_TYPEID=5;
COMMIT;
UPDATE PERSON.PERSON_TYPE SET NAME='收银员' WHERE PERSON_TYPEID=5;
COMMIT;
SELECT * FROM PERSON.PERSON_TYPE;
结果集如下图所示:
进行闪回版本查询,获得指定时间段内变化的记录:
SELECT VERSIONS_ENDTRXID, NAME FROM PERSON.PERSON_TYPE VERSIONS BETWEEN TIMESTAMP '2012-01-01 12:24:00' AND SYSDATE;
得到结果集如下图所示:
2.3 闪回事务查询
闪回事务查询提供系统视图 V$FLASHBACK_TRX_INFO
供用户查看在事务级对数据库所做的更改。根据视图信息,可以确定如何还原指定事务或指定时间段内的修改。
使用说明:
系统视图名为 V$FLASHBACK_TRX_INFO
,定义如下图所示:
举例说明:
例 1 :
查询指定时间之后的事务信息,可为闪回查询操作提供参考。
SELECT * FROM V$FLASHBACK_TRX_INFO WHERE COMMIT_TIMESTAMP > '2012-01-01 12:00:00';
二、日志挖掘
1.什么是达梦数据库日志挖掘?
用户可以使用 DBMS_LOGMNR 包对归档日志进行挖掘,重构出 DDL 和 DML 等操作,并通过获取的信息进行更深入的分析。
DM MPP 环境下不支持 DBMS_LOGMNR 包。
2.操作过程
2.1 配置归档与参数
(1)开启归档,在 dm.ini 中修改参数 ARCH_INI=1;
(2)修改参数 RLOG_APPEND_LOGIC(动态,系统级)为 1 或 2;
sf_set_system_para_value('RLOG_APPEND_LOGIC',1,0,1);
2.2 创建系统包
SP_CREATE_SYSTEM_PACKAGES(1,'DBMS_LOGMNR');
2.3 查询数据库当前归档日志
SELECT NAME,FIRST_TIME,NEXT_TIME,FIRST_CHANGE#,NEXT_CHANGE# FROM V$ARCHIVED_LOG;
2.4 添加需要分析的归档日志文件
DBMS_LOGMNR.ADD_LOGFILE('/data/dmdata/DAMENG/arch/ARCHIVE_LOCAL1_0x6B E5BB4B[0]_2021-01-06_09-40-28.log');
注:对于不在数据库默认归档路径下的归档日志,可以直接指定归档日志的绝对路径添加进分析列表。
2.5 查询通过 ADD_LOGFILE 添加的归档日志文件
SELECT LOW_SCN, NEXT_SCN, LOW_TIME, HIGH_TIME, LOG_ID, FILENAME FROM V$LOGMNR_LOGS;
2.6 启动归档日志文件分析
DBMS_LOGMNR.START_LOGMNR(OPTIONS=>2128,STARTTIME=>TO_DATE('2021-1-6 15:01:12','YYYY-MM-DD HH24:MI:SS'),ENDTIME=>TO_DATE('2021-1-6 16:01:12','YYYY-MM-DD HH24:MI:SS'));
OPTIONS:
提供如下表所列的可选模式,各模式可以通过 + 或者按位或来进行组合。其它位的值如 1、4、8 等目前不支持,配置后不会报错,但是没有效果。例如,组合全部模式,则取值计算方法为 2+16+64+2048=2130,那么 OPTIONS 值取就是 2130。
2.7 查看归档日志文件的分析结果
select TIMESTAMP,START_TIMESTAMP,COMMIT_TIMESTAMP,OPERATION,OPERATION_CODE,R OLL_BACK,TABLE_NAME,ROW_ID,USERNAME,DATA_OBJ#,DATA_OBJV#,SQL_REDO,RED O_VALUE,UNDO_VALUE
from V$LOGMNR_CONTENTS
where table_name='TEST_INSERT';
2.8 终止归档日志文件分析
2.8.1 结束分析
DBMS_LOGMNR.END_LOGMNR();
2.8.2 删除系统包
SP_CREATE_SYSTEM_PACKAGES(0,'DBMS_LOGMNR');
三、数据库备份恢复
通过备份与归档日志将数据库恢复数据库到指定时间点/LSN;
1.备份与恢复
还原与恢复是备份的逆过程。
还原是将备份集中的有效数据页重新写入目标数据文件的过程。
恢复则是指通过重做归档日志,将数据库状态恢复到备份结束时的状态;也可以恢复到指定时间点和指定 LSN。恢复结束以后,数据库中可能存在处于未提交状态的活动事务, 这些活动事务在恢复结束后的第一次数据库系统启动时,会由 DM 数 据库自动进行回滚。
2.操作步骤
2.1 记录时间或者 LSN
SELECT SYSDATE;--当前时间
SELECT FILE_LSN FROM V$RLOG;--此时的 LSN
2.2 关闭数据库
./DmServiceDM stop
2.3 打开 dmrman 并还原数据库
./dmrman RMAN> RESTORE DATABASE '/data/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/data/dmdata/DAMENG/bak/DB_DAMENG_FULL_20210106_165522_978586';
2.4 恢复数据库到指定时间点/LSN
RMAN> RECOVER DATABASE '/data/dmdata/DAMENG/dm.ini' WITH ARCHIVEDIR'/data/dmdata/DAMENG/arch' UNTIL TIME '2021-1-6 10:56:40.624931'; 或者RMAN> RECOVER DATABASE '/data/dmdata/DAMENG/dm.ini' WITH ARCHIVEDIR'/data/dmdata/DAMENG/arch' UNTIL LSN 1191826;
2.5 数据库更新
RMAN> RECOVER DATABASE '/data/dmdata/DAMENG/dm.ini' UPDATE DB_MAGIC;
2.6 重启数据库
./DmServiceDM start
以上三种方式仅供大家参考~~~