网站怎么建设以及维护,wordpress修改底部文字,苏州做网站哪家公司好,wordpress增加互动达梦数据库三种在误删除操作后的回退方案
一、闪回表 当用户操作不慎导致错误的删改数据时#xff0c;闪回方式可以恢复数据。闪回技术#xff0c;就是为了用户可以迅速处理这种 数据逻辑损坏的情况而产生的。 闪回技术主要是通过回滚段存储的 UNDO 记录来完成历史记录的还原…达梦数据库三种在误删除操作后的回退方案
一、闪回表 当用户操作不慎导致错误的删改数据时闪回方式可以恢复数据。闪回技术就是为了用户可以迅速处理这种 数据逻辑损坏的情况而产生的。 闪回技术主要是通过回滚段存储的 UNDO 记录来完成历史记录的还原。设置 ENABLE_FLASHBACK 为 1 后开启闪回功能。DM 会保留回滚段一段时间回滚段保留的时间代表着可以闪回的时间长度。 由 UNDO_RETENTION 参数指定。 开启闪回功能后DM 会在内存中记录下每个事务的起始时间和提交时间。即通过用户指定的时刻查询到该时刻的事务号结合当前记录和回滚段中的 UNDO 记录就可以还原出特定事务号的记录。即指定时刻的记录状态。从而完成闪回查询。DM8 闪回查询功能完全依赖于回滚段管理对于闪回查询的支持较好与oracle的使用方法类似。但MPP架构对于闪回查询功能不支持同时由于达梦没有回收站功能无法对drop的表进行闪回对于 DROP 等误操作不能恢复无法像Oracle进行flashback table XXX to before drop。在生产环境中当表被DROP 删除或者数据库没有开启闪回功能时则无法使用闪回来获取原有的表数据;此时需要使用基于归档日志的时间点的恢复(不完全恢复)来达到恢复数据或恢复表的目的。闪回特性可应用在以下方面1 自我维护过程中的修复当一些重要的记录被意外删除用户 可以向后移动到一个 时间点查看丢失的行并把它们重新插入现在的表内恢复 2用于分析数据变化可以对同一张表的不同闪回时刻进行链接 查询以此查看变化的数据。
1.1. 闪回表定义
--语法格式
FLASHBACK TABLE [模式名.]表名 {,[模式名.]表名} TO SCN | LSN | TIMESTAMP expr [ ENABLE|DISABLE TRIGGERS ] ;--参数说明模式名 指明该表属于哪个模式缺省为当前模式表名 指明被创建的基表名基表名最大长度 128 字节
expr 指明闪回到的 LSN 值或 TIMESTAMP 值
ENABLE|DISABLE TRIGGERS 指定是否开启触发器ENABLE 为开启触发器DISABLE 为关闭触发器不指定则默认为关闭。1.2.使用说明
使用闪回功能需要打开 dm.ini 中的 ENABLE_FLASHBACK 参数当前闪回表功能支持批量闪回多个表、触发器的禁用与启用、DMDPC 环境除使用 LOCAL 登录外、DMDSC 环境当前闪回表功能不支持在 DM MPP 环境下使用闪回表利用的是 UNDO 表空间里记录的数据被改变前的值只能闪回到 UNDO_RETENTION 指定值范围内的时间点用户必须具有 FLASHBACK ANY TABLE 系统权限或 FLASHBACK 对象权限闪回表语句是作为单个事务处理来执行。同时闪回多个表时必须成功闪回所有表否则会回退整个事务。闪回作为 DDL 语句开启自动提交时闪回成功后会自动提交必须对要执行闪回操作的表启动行移动分区表具有 MOVEMENT 功能的不能关闭否则闪回可能会报错不会闪回受影响对象的统计信息闪回会保留所有现有的索引闪回中会正常检查约束条件如果在闪回执行期间违反了任何约束条件则会回滚闪回操作闪回不能跨越修改了表结构的 DDL。比如在闪回数据之前做过删除一个字段的操作那么是无法闪回的不能对系统表、临时表、HUGE 表、内部辅助表、动态表等执行闪回表操作DMDPC 环境下由于各节点的 SCN/LSN 不同只支持闪回到时间点 TIMESTAMP限制重复闪回。闪回作为 DDL对于同一个表不允许再次闪回到上一次闪回之前的 LSN/TIMESTAMP。
注意不开启闪回不能用flashback database只能用flashback table和闪回查询但是作用比较有限。启用闪回必须开启归档
1.3.闪回前环境准备
1.3.1.开启闪回功能
默认是闪回功能为关闭状态更改参数后重启生效必须重启不然报错:[-9801]:flashback version has been out of date。
--开启闪回功能
select name,type,value from v$parameter where nameENABLE_FLASHBACK;
或
select para_value from v$dm_ini where para_nameENABLE_FLASHBACK; # 0未开启 1开启 alter system set ENABLE_FLASHBACK1 both;
或
sf_set_system_para_value(ENABLE_FLASHBACK,1,0,1);
或
或者修改参数文件dm.ini中ENABLE_FLASHBACK值为1--修改UNDO_RETENTION
SQL select name,type,value from v$parameter where name UNDO_RETENTION;LINEID NAME TYPE VALUE
---------- -------------- ---- ---------
1 UNDO_RETENTION SYS 90.000000
SQL alter system set UNDO_RETENTION3600 both;SQL select name,type,value from v$parameter where name UNDO_RETENTION;LINEID NAME TYPE VALUE
---------- -------------- ---- -----------
1 UNDO_RETENTION SYS 3600.000000--重启永久生效
[dmdbalocalhost ~]$ /dmdb8/dmdbms/bin/DmServicefuwa stop
Stopping DmServicefuwa: [ OK ]
[dmdbalocalhost ~]$ /dmdb8/dmdbms/bin/DmServicefuwa start
Starting DmServicefuwa: [ OK ]1.3.2.构建测试数据
--创建 PERSON_TYPE
create table PERSON_TYPE(PERSON_TYPEID int,NAME varchar2(100));--PERSON_TYPE中插入数据
insert into PERSON_TYPE values (1,采购经理);
insert into PERSON_TYPE values (2,采购代表);
insert into PERSON_TYPE values (3,销售经理);
insert into PERSON_TYPE values (4,销售代表);
commit;--查询PERSON_TYPE
select * from PERSON_TYPE; --4条数据1.4 闪回查询
1.4.1 闪回查询子句_支持insert或delete场景
闪回查询子句语法
闪回查询子句的语法是在数据查询语句的基础上为 FROM 子句增加了闪回查询子句。
--语法格式
闪回查询子句::WHEN TIMESTAMP time_exp | AS OF TIMESTAMP time_exp |AS OF SCN|LSN lsn--参数说明
time_exp:一个日期表达式一般用字符串方式表示
lsn:LSN 值语句功能
用户通过闪回查询子句可以得到指定表过去某时刻的结果集。指定条件可以为时刻或 LSN。
使用说明
闪回查询只支持普通表包括加密表与压缩表、水平分区表和堆表不支持临时表、列存储表、外部表与视图闪回查询中 lsn 的值可以通过查询动态视图V R L O G 或 V RLOG或V RLOG或VVLSN_TIME 来确定也可以通过闪回版本查询的伪列来确定由于视图 V$LSN_TIME 每三秒收集一次 LSN/TIME 映射关系因此基于时间进行闪回查询时可能存在三秒的误差如果需要进行精确度更高的闪回查询建议基于 LSN 进行闪回查询。
SQL SELECT CUR_LSN FROM V$RLOG;
SQL select * from v$lsn_time;当闪回表作为 DDL 时对于同一个表不允许基于对上一次闪回表的 LSN 或 TIMESTAMP 进行闪回查询。
示例
闪回查询子句_insert_指定TIMESTAMP
--查询当前时间
SQL select sysdate from dual;LINEID sysdate
---------- -------------------
1 2023-11-23 20:49:43--插入数据
INSERT INTO PERSON_TYPE(PERSON_TYPEID,NAME) VALUES(5,防损员);
INSERT INTO PERSON_TYPE(PERSON_TYPEID,NAME) VALUES(6,保洁员);
COMMIT;--查询
SELECT * FROM PERSON_TYPE; --6条数据--使用闪回查询取得2023-11-23 20:49:43时刻的数据
SELECT * FROM PERSON_TYPE WHEN TIMESTAMP 2023-11-23 20:49:43; --4条数据
或
SELECT * FROM PERSON_TYPE AS OF TIMESTAMP 2023-11-23 20:49:43; --4条数据闪回查询子句_delete_指定TIMESTAMP
--查询当前时间
SQL select sysdate from dual;LINEID sysdate
---------- -------------------
1 2023-11-23 21:34:26--删除
DELETE FROM PERSON_TYPE WHERE PERSON_TYPEID 5;
COMMIT;
SELECT * FROM PERSON_TYPE; --5条数据--使用闪回查询得到删除前的数据
SELECT * FROM PERSON_TYPE WHEN TIMESTAMP 2023-11-23 21:34:26;
或
SELECT * FROM PERSON_TYPE AS OF TIMESTAMP 2023-11-23 21:34:26;
闪回查询子句_delete_指定 LSN
--查询 PERSON_TYPE 表
SELECT * FROM PERSON_TYPE; --5条数据--查询 V$RLOG 视图的 CUR_LSN 字段来获取当前 LSN 值
SQL SELECT CUR_LSN FROM V$RLOG;LINEID CUR_LSN
---------- --------------------
1 42097--删除 PERSON_TYPE 表中的一行数据并提交
DELETE FROM PERSON_TYPE WHERE PERSON_TYPEID4;
COMMIT;
SELECT * FROM PERSON_TYPE; --4条数据--通过删除操作之前的 LSN 值进行闪回查询得到删除前的数据
SELECT * FROM PERSON_TYPE AS OF SCN 42097; --5条数据1.4.2 闪回版本查询_支持update场景
INI 参数 UNDO_RETENTION 设置了事务提交后回滚页保持时间缺省为 90 秒。因此超出 UNDO_RETENTION 时间之外的过期闪回版本无法被闪回查询到。
闪回版本查询_语法格式
--语法格式
闪回版本查询子句::VERSIONS BETWEEN 闪回版本查询条件
闪回版本查询条件::TIMESTAMP time_exp1 AND time_exp2 | SCN|LSN lsn1 AND lsn2--参数说明
1.time_exp日期表达式一般用字符串方式表示。time_exp1 表示起始时间time_exp2 表示结束时间
2.lsnLSN 值。lsn1 表示起始 LSNlsn2 表示结束 LSN 使用说明
闪回版本查询支持普通表包括加密表与压缩表、水平分区表和堆表不支持临时表、列存储表、外部表与视图支持将表 17.2.1 中的伪列作为闪回版本查询的查询项辅助获取精准的闪回查询信息。
表17.2.1 闪回版本查询支持的伪列
伪列说明VERSIONS_STARTTIME、VERSIONS_STARTSCN、VERSIONS_STARTTRXID起始时间戳、起始 LSN、起始 TRXIDVERSIONS_ENDTIME、VERSIONS_ENDSCN、VERSIONS_ENDTRXID提交时间戳、提交 LSN、提交 TRXID。如果该值为 NULL表示行版本仍然是当前版本VERSIONS_OPERATION在行上的操作。I 表示 Insert、D 表示 Delete、U 表示 Update 语句功能
用户通过闪回版本查询子句可以得到指定表过去某个时间段内事务导致记录变化的全部记录。指定条件可以为时刻或 LSN。
示例
语法
SELECT 参数,column_name,
FROM table_name VERSIONS BETWEEN TIMESTAMP 2023-11-23 22:55:12 AND SYSDATE;
示例
SELECT VERSIONS_STARTSCN, VERSIONS_ENDSCN, NAME FROM PERSON_TYPE VERSIONS BETWEEN TIMESTAMP 2023-11-23 22:55:56 AND SYSDATE;
SELECT VERSIONS_STARTTIME,VERSIONS_STARTSCN,VERSIONS_STARTTRXID,VERSIONS_ENDTIME,VERSIONS_ENDSCN,VERSIONS_ENDTRXID,VERSIONS_OPERATION,NAME FROM PERSON_TYPE VERSIONS BETWEEN TIMESTAMP 2023-11-23 22:55:12 AND SYSDATE;
name即column_name可以多个--查询PERSON_TYPE 5条数据
SQL SELECT * FROM PERSON_TYPE;LINEID PERSON_TYPEID NAME
---------- ------------- ------------
1 1 采购经理
2 2 采购代表
3 3 销售经理
4 4 销售代表
5 5 防损员--查询当前时间
SQL select sysdate from dual;LINEID sysdate
---------- -------------------
1 2023-11-23 22:55:56--修改数据并提交
UPDATE PERSON_TYPE SET NAME保安员 WHERE PERSON_TYPEID5;
COMMIT;
UPDATE PERSON_TYPE SET NAME收银员 WHERE PERSON_TYPEID5;
COMMIT;--查询修改后的表
SQL SELECT * FROM PERSON_TYPE;LINEID PERSON_TYPEID NAME
---------- ------------- ------------
1 1 采购经理
2 2 采购代表
3 3 销售经理
4 4 销售代表
5 5 收银员--进行闪回版本查询获得指定时间段内变化的记录
SQL SELECT VERSIONS_STARTSCN, VERSIONS_ENDSCN, NAME FROM PERSON_TYPE VERSIONS BETWEEN TIMESTAMP 2023-11-23 22:55:56 AND SYSDATE;
LINEID VERSIONS_STARTSCN VERSIONS_ENDSCN NAME
---------- -------------------- -------------------- ------------
1 NULL NULL 采购经理
2 NULL NULL 采购代表
3 NULL NULL 销售经理
4 NULL NULL 销售代表
5 54525 NULL 收银员
6 54522 54525 保安员
7 54519 54522 防损员--利用伪列 VERSION_STARTSCN 进行闪回查询得到修改前的数据
SQL SELECT * FROM PERSON_TYPE AS OF SCN 54519;LINEID PERSON_TYPEID NAME
---------- ------------- ------------
1 1 采购经理
2 2 采购代表
3 3 销售经理
4 4 销售代表
5 5 防损员SQL SELECT * FROM PERSON_TYPE AS OF SCN 54522;
LINEID PERSON_TYPEID NAME
---------- ------------- ------------
1 1 采购经理
2 2 采购代表
3 3 销售经理
4 4 销售代表
5 5 保安员SQL SELECT * FROM PERSON_TYPE AS OF SCN 54525;LINEID PERSON_TYPEID NAME
---------- ------------- ------------
1 1 采购经理
2 2 采购代表
3 3 销售经理
4 4 销售代表
5 5 收银员
1.4.3 闪回事务查询
闪回事务查询提供系统视图 V$FLASHBACK_TRX_INFO 供用户查看在事务级对数据库所做的更改。根据视图信息可以确定如何还原指定事务或指定时间段内的修改。
使用说明
系统视图名为 V F L A S H B A C K T R X I N F O 定义如表 17.3.1 所示。表 17.3.1 系统视图 V FLASHBACK_TRX_INFO定义如表 17.3.1 所示。 表17.3.1 系统视图V FLASHBACKTRXINFO定义如表17.3.1所示。表17.3.1系统视图VFLASHBACK_TRX_INFO定义
列名数据类型说明START_TRXIDBIGINT事务中第一个 DML 的 TRXIDSTART_TIMESTAMPTIMESTAMP事务中第一个 DML 的时间戳COMMIT_TRXIDBIGINT提交事务的 TRXIDCOMMIT_TIMESTAMPTIMESTAMP提交事务时的时间戳LOGON_USERVARCHAR(256)拥有事务的用户UNDO_CHANGE#INT记录修改顺序序号OPERATIONCHAR(1)DML 操作类型。D删除U修改I插入N更新插入专门针对 CLUSTER PRIMARY KEY 的插入 C事务提交P预提交记录OdefaultTABLE_NAMEVARCHAR(256)DML 修改的表TABLE_OWNERVARCHAR(256)DML 修改表的拥有者ROW_IDROWIDDML 修改行的 ROWIDUNDO_SQLVARCHAR(3900)撤销 DML 操作的 SQL 语句COMMIT_LSNBIGINT事务提交时的 LSN
示例
例 查询指定时间之后的事务信息可为闪回查询操作提供参考。
SELECT * FROM V$FLASHBACK_TRX_INFO WHERE COMMIT_TIMESTAMP 2023-11-23 22:55:56;示例 2 闪回查询指定 TRXID 闪回查询指定 TRXID的 PERSON_TYPE 表要获得 TRXID 信息 需要通过闪回版本查询的伪列 VERSIONS_ENDTRXID。注意只针对update 有效如果是insert则没有效果。
--查询当前时间
SQL select sysdate from dual;LINEID sysdate
---------- -------------------
1 2023-11-23 19:12:55--更新数据
UPDATE PERSON_TYPE SET role保安员 WHERE role安保;
UPDATE PERSON_TYPE SET role收银员 WHERE role会计员;
INSERT INTO PERSON_TYPE(role) VALUES(防损员);
INSERT INTO PERSON_TYPE(role) VALUES(保洁员);
COMMIT; SELECT * FROM PERSON_TYPE;--进行闪回版本查询确定 TRXID
SQL SELECT VERSIONS_ENDTRXID, ROLE FROM PERSON_TYPE VERSIONS BETWEEN TIMESTAMP 2023-11-23 19:12:55 AND SYSDATE;LINEID VERSIONS_ENDTRXID ROLE
---------- -------------------- ------------
1 NULL 采购经理
2 NULL 财务经理
3 NULL 经销商
4 NULL 收银员
5 NULL 保安员
6 NULL 司机
7 NULL 防损员
8 NULL 保洁员
9 22105 会计员
10 22105 安保--根据 TRXID 确定版本(只针对update 有效如果是insert则没有效果)
SELECT * FROM PERSON_TYPE WHEN TRXID 22105;
1 2 3 4 5 结果集如下所示
进行闪回版本查询确定 TRXID
SELECT VERSIONS_ENDTRXID, NAME FROM PERSON_TYPE VERSIONS BETWEEN TIMESTAMP ‘2012-01-01 12:24:00’ AND SYSDATE; 1 得到结果集如下所示
根据 TRXID 确定版本
SELECT * FROM PERSON_TYPE WHEN TRXID 322; 1 结果集如下所示
2.2 闪回版本查询 语法格式
闪回版本查询子句::VERSIONS BETWEEN | 1 参数 1time_exp 日期表达式一般用字符串方式表示。time_exp1 表 示起始时间time_exp2 表示结束时间 。 2trxid 指定事务 ID 号整数表示。trxid1 表示起始 trxid trxid2 表示结束 trxid 。 使用说明 1闪回版本查询支持普通表包括加密表与压缩表、临时表和 堆表不支持水平分区表、列存储表、外部表与视图 2支持如下图所示伪列作为闪回版本查询的辅助信息。 如下图所示 闪回版本查询支持的伪列
语句功能 用户通过闪回版本查询子句可以得到指定表过去某个时间段内事务导致记录变化的全部记录。指定条件可以为时刻或事务号。 举例说明 例 1 闪回版本查询指定时间段内PERSON_TYPE 表的记录变化。 在 2012-01-01 12:24:05 时刻修改数据并提交。
UPDATE PERSON_TYPE SET NAME‘保安员’ WHERE PERSON_TYPEID5; COMMIT; UPDATE PERSON_TYPE SET NAME‘收银员’ WHERE PERSON_TYPEID5; COMMIT; SELECT * FROM PERSON_TYPE; 1 2 3 4 5 结果集如下图所示
进行闪回版本查询获得指定时间段内变化的记录
SELECT VERSIONS_ENDTRXID, NAME FROM PERSON_TYPE VERSIONS BETWEEN TIMESTAMP ‘2012-01-01 12:24:00’ AND SYSDATE; 1 得到结果集如下图所示
2.3 闪回事务查询 闪回事务查询提供系统视图 V F L A S H B A C K T R X I N F O 供用户查看在事务级对数据库所做的更改。根据视图信息可以确定如何还原指定事务或指定时间段内的修改。使用说明系统视图名为 V FLASHBACK_TRX_INFO 供用户查看在事务级对数据库所做的更改。根据视图信息可以确定如何还原指定事务或指定时间段内的修改。 使用说明 系统视图名为 V FLASHBACKTRXINFO供用户查看在事务级对数据库所做的更改。根据视图信息可以确定如何还原指定事务或指定时间段内的修改。使用说明系统视图名为VFLASHBACK_TRX_INFO定义如下图所示
举例说明 例 1 查询指定时间之后的事务信息可为闪回查询操作提供参考。
SELECT * FROM V$FLASHBACK_TRX_INFO WHERE COMMIT_TIMESTAMP ‘2012-01-01 12:00:00’; 1 二、日志挖掘 1.什么是达梦数据库日志挖掘 用户可以使用 DBMS_LOGMNR 包对归档日志进行挖掘重构出 DDL 和 DML 等操作并通过获取的信息进行更深入的分析。 DM MPP 环境下不支持 DBMS_LOGMNR 包。 2.操作过程 2.1 配置归档与参数 1开启归档在 dm.ini 中修改参数 ARCH_INI1 2修改参数 RLOG_APPEND_LOGIC动态系统级为 1 或 2
sf_set_system_para_value(‘RLOG_APPEND_LOGIC’,1,0,1); 1 2.2 创建系统包
SP_CREATE_SYSTEM_PACKAGES(1,‘DBMS_LOGMNR’); 1 2.3 查询数据库当前归档日志
SELECT NAME,FIRST_TIME,NEXT_TIME,FIRST_CHANGE#,NEXT_CHANGE# FROM V$ARCHIVED_LOG; 1 2.4 添加需要分析的归档日志文件
DBMS_LOGMNR.ADD_LOGFILE(‘/data/dmdata/DAMENG/arch/ARCHIVE_LOCAL1_0x6B E5BB4B[0]_2021-01-06_09-40-28.log’); 1 注对于不在数据库默认归档路径下的归档日志可以直接指定归档日志的绝对路径添加进分析列表。 2.5 查询通过 ADD_LOGFILE 添加的归档日志文件
SELECT LOW_SCN, NEXT_SCN, LOW_TIME, HIGH_TIME, LOG_ID, FILENAME FROM V$LOGMNR_LOGS; 1 2.6 启动归档日志文件分析
DBMS_LOGMNR.START_LOGMNR(OPTIONS2128,STARTTIMETO_DATE(‘2021-1-6 15:01:12’,‘YYYY-MM-DD HH24:MI:SS’),ENDTIMETO_DATE(‘2021-1-6 16:01:12’,‘YYYY-MM-DD HH24:MI:SS’)); 1 OPTIONS: 提供如下表所列的可选模式各模式可以通过 或者按位或来进行组合。其它位的值如 1、4、8 等目前不支持配置后不会报错但是没有效果。例如组合全部模式则取值计算方法为 2166420482130那么 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’; 1 2 3 2.8 终止归档日志文件分析 2.8.1 结束分析
DBMS_LOGMNR.END_LOGMNR(); 1 2.8.2 删除系统包
SP_CREATE_SYSTEM_PACKAGES(0,‘DBMS_LOGMNR’); 1 三、数据库备份恢复 通过备份与归档日志将数据库恢复数据库到指定时间点/LSN; 1.备份与恢复 还原与恢复是备份的逆过程。 还原是将备份集中的有效数据页重新写入目标数据文件的过程。 恢复则是指通过重做归档日志将数据库状态恢复到备份结束时的状态也可以恢复到指定时间点和指定 LSN。恢复结束以后数据库中可能存在处于未提交状态的活动事务 这些活动事务在恢复结束后的第一次数据库系统启动时会由 DM 数 据库自动进行回滚。 2.操作步骤 2.1 记录时间或者 LSN
SELECT SYSDATE;–当前时间 SELECT FILE_LSN FROM V$RLOG;–此时的 LSN 1 2 2.2 关闭数据库
./DmServiceDM stop 1 2.3 打开 dmrman 并还原数据库
./dmrman RMAN RESTORE DATABASE ‘/data/dmdata/DAMENG/dm.ini’ FROM BACKUPSET ‘/data/dmdata/DAMENG/bak/DB_DAMENG_FULL_20210106_165522_978586’; 1 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; 1 2.5 数据库更新
RMAN RECOVER DATABASE ‘/data/dmdata/DAMENG/dm.ini’ UPDATE DB_MAGIC; 1 2.6 重启数据库
./DmServiceDM start 1 以上三种方式仅供大家参考~~~ ———————————————— 版权声明本文为CSDN博主「chen丨yu」的原创文章遵循CC 4.0 BY-SA版权协议转载请附上原文出处链接及本声明。 原文链接https://blog.csdn.net/chenyu940415/article/details/117354407
1.5.问题处理
flashback version has been out of date
问题描述
误操作后闪回查询到某一时间点提示:“[-9801]:flashback version has been out of date.”
SQL SELECT * FROM PERSON_TYPE WHEN TIMESTAMP 2023-11-23 18:51:41;
SELECT * FROM PERSON_TYPE WHEN TIMESTAMP 2023-11-23 18:51:41;
[-9801]:flashback version has been out of date.
used time: 0.548(ms). Execute id is 0.问题排查
可能引起该报错的原因有
UNDO_RETENTION参数
--查询UNDO_RETENTION参数
select name,type,value from v$parameter where name UNDO_RETENTION;LINEID name TYPE VALUE
---------- -------------- ---- ---------
1 UNDO_RETENTION SYS 90.000000有博主写的默认900秒15分钟但是官方文档写的是90秒。如果显示的是90说明没有更改参数过了UNDO_RETENTION则无法进行闪回查询。不重启也验证了可以闪回查询。
解决办法
--更改UNDO_RETENTION参数
alter system set UNDO_RETENTION3600 both;
select name,type,value from v$parameter where name UNDO_RETENTION;--重启生效(可选)
[dmdbalocalhost ~]$ /dmdb8/dmdbms/bin/DmServicefuwa stop
Stopping DmServicefuwa: [ OK ]
[dmdbalocalhost ~]$ /dmdb8/dmdbms/bin/DmServicefuwa start
Starting DmServicefuwa: --更改参数后未重启查看参数文件dm.ini
发现ENABLE_FLASHBACK0UNDO_RETENTION90--重启查看参数文件dm.ini
发现ENABLE_FLASHBACK1UNDO_RETENTION3600flashback function is disable
--问题描述闪回版本查询报错flashback function is disable
SQL SELECT VERSIONS_STARTSCN, VERSIONS_ENDSCN, NAME FROM PERSON_TYPE VERSIONS BETWEEN TIMESTAMP 2023-11-23 22:48:33 AND SYSDATE;
SELECT VERSIONS_STARTSCN, VERSIONS_ENDSCN, NAME FROM PERSON_TYPE VERSIONS BETWEEN TIMESTAMP 2023-11-23 22:48:33 AND SYSDATE;
[-9803]:Error in line: 1
flashback function is disable.
used time: 0.499(ms). Execute id is 0.--解决办法
--开启闪回功能
select name,type,value from v$parameter where nameENABLE_FLASHBACK;
或
select para_value from v$dm_ini where para_nameENABLE_FLASHBACK; # 0未开启 1开启alter system set ENABLE_FLASHBACK1 both;
或
sf_set_system_para_value(ENABLE_FLASHBACK,1,0,1);
或
或者修改参数文件dm.ini中ENABLE_FLASHBACK值为1--重启永久生效(可选)
[dmdbalocalhost ~]$ /dmdb8/dmdbms/bin/DmServicefuwa stop
Stopping DmServicefuwa: [ OK ]
[dmdbalocalhost ~]$ /dmdb8/dmdbms/bin/DmServicefuwa start
Starting DmServicefuwa: [ OK ]DM8_DSC场景下启动闪回失败
--问题描述
DSC场景下开启闪回失败提示不支持
[dmdbalocalhost ~]$ /dmdb8/dmdbms/bin/disql SYSDBA/SYSDBA:5236Server[LOCALHOST:5236]:mode is primary, state is open
login used time : 10.660(ms)
disql V8
SQL sf_set_system_para_value(ENABLE_FLASHBACK,1,0,1);
sf_set_system_para_value(ENABLE_FLASHBACK,1,0,1);
[-2020]:Dont support this operation in DSC.
used time: 41.153(ms). Execute id is 0.--问题原因
03134284058-20230614-193125-20046版本开始DSC开始支持闪回功能查达梦数据库版本
SQL select * from v$version;LINEID BANNER
---------- ---------------------------------
1 DM Database Server 64 V8
2 DB Version: 0x7000c
3 03134284044-20230417-187846-20040--解决办法
更改版本或升级版本参考链接http://blog.itpub.net/69985512/viewspace-2727220/#:~:text%23%23%E6%88%96%E8%80%85%E4%BF%AE%E6%94%B9%E5%8F%82%E6%95%B0,%E4%B8%BA1%EF%BC%8C%E9%87%8D%E5%90%AF%E7%94%9F%E6%95%88%E3%80%82
https://eco.dameng.com/document/dm/zh-cn/pm/flashback-query#17.2.3%20%E9%97%AA%E5%9B%9E%E4%BA%8B%E5%8A%A1%E6%9F%A5%E8%AF%A2
二、日志挖掘
什么是达梦数据库日志挖掘
用户可以使用 DBMS_LOGMNR 包对归档日志进行挖掘重构出 DDL 和 DML 等操作并通过获取的信息进行更深入的分析。 达梦DBMS_LOGMNR包用于分析归档日志所记载的DML、DDL、DCL等事务操作。通过DBMS_LOGMNR提供的日志挖掘功能可以确定数据库误操作时间点或SCN对数据库基于时间点或者SCN的不完全恢复。通过DBMS_LOGMNR可以跟踪达梦数据库的所有DML、DDL、DCL操作从而取得执行这些操作的时间顺序、执行这些操作的用户等信息在系统没有打开审计功能时对数据库进行审计或者对数据库审计结果进行进一步深入分析。 目前 DBMS_LOGMNR 只支持对归档日志进行分析配置归档后还需要将 dm.ini 中的RLOG_APPEND_LOGIC 选项置为 1 或 2。 DM MPP 环境下不支持 DBMS_LOGMNR 包。
操作过程
配置归档与参数
(1)开启归档
在 dm.ini 中修改参数 ARCH_INI1或进行以下参数修改
#查看归档模式
su - dmdba
/dmdb8/dmdbms/bin/disql sysdba/sysdba:5237
select name,status$,arch_mode from v$database;#主动刷新检查点
checkpoint(100);
alter database mount;
alter database archivelog;#设置归档位置 文件大小 上限(视情况更改值)
alter database add archivelog dest/dmdb8/dmarch,typelocal,file_size2048,space_limit3072;
alter database open;##手动切归档执行任意一条sql即可
alter database archivelog current;
alter system archive log current;
alter system switch logfile;##查询下归档日志文件信息
select t.status,t.path,t.arch_lsn,t.clsn from v$arch_file t;输出如下信息
LINEID status PATH arch_lsn clsn
---------- -------- ------------------------------------------------------------------- -------------------- --------------------
1 INACTIVE /dmdb8/dmarch/ARCHIVE_LOCAL1_0x482D9BC8_EP0_2023-10-18_08-37-26.log 1045456 1045629
ACTIVE 活跃状态说明是此文件为正在使用的归档日志文件(2)启用记录逻辑操作功能
修改参数 RLOG_APPEND_LOGIC动态系统级为 1 或 2默认0
select name,type,value from v$parameter where nameRLOG_APPEND_LOGIC;alter system set RLOG_APPEND_LOGIC1 both;
或
sf_set_system_para_value(RLOG_APPEND_LOGIC,1,0,1);
构建测试数据
--创建 PERSON_TYPE
create table PERSON_TYPE(PERSON_TYPEID int,NAME varchar2(100));--PERSON_TYPE中插入数据
insert into PERSON_TYPE values (1,采购经理);
insert into PERSON_TYPE values (2,采购代表);
insert into PERSON_TYPE values (3,销售经理);
insert into PERSON_TYPE values (4,销售代表);
commit;--查询PERSON_TYPE
select * from PERSON_TYPE; --4条数据--delete删除
delete from PERSON_TYPE where PERSON_TYPEID2;
commit;
select * from PERSON_TYPE;
commit;--归档
checkpoint(100);
alter system switch logfile;创建系统包
SP_CREATE_SYSTEM_PACKAGES(1,DBMS_LOGMNR);查询数据库当前归档日志
SELECT NAME,FIRST_TIME,NEXT_TIME,FIRST_CHANGE#,NEXT_CHANGE# FROM V$ARCHIVED_LOG;
select t.STATUS, t.PATH, t.ARCH_LSN, t.CLSN from V$ARCH_FILEt;添加需要分析的归档日志文件
通过调用DBMS_LOGMNR.ADD_LOGFILE过程来添加一个或多个归档日志文件。
DBMS_LOGMNR.ADD_LOGFILE(/dmdb8/dmarch/ARCHIVE_LOCAL1_0x482D9BC8_EP0_2023-11-28_11-30-53.log);
DBMS_LOGMNR.ADD_LOGFILE(/dmdb8/dmarch/ARCHIVE_LOCAL1_0x482D9BC8_EP0_2023-11-28_16-45-54.log);
DBMS_LOGMNR.ADD_LOGFILE(/dmdb8/dmarch/ARCHIVE_LOCAL1_0x482D9BC8_EP0_2023-11-28_17-02-18.log);
DBMS_LOGMNR.ADD_LOGFILE(/dmdb8/dmarch/ARCHIVE_LOCAL1_0x482D9BC8_EP0_2023-11-28_17-08-52.log);
DBMS_LOGMNR.ADD_LOGFILE(/dmdb8/dmarch/ARCHIVE_LOCAL1_0x482D9BC8_EP0_2023-11-28_17-12-54.log);注对于不在数据库默认归档路径下的归档日志可以直接指定归档日志的绝对路径添加进分析列表。
查询通过 ADD_LOGFILE 添加的归档日志文件
SELECT LOW_SCN , NEXT_SCN , LOW_TIME , HIGH_TIME, LOG_ID , FILENAME FROM V$LOGMNR_LOGS;启动归档日志文件分析
DBMS_LOGMNR.START_LOGMNR();
DBMS_LOGMNR.START_LOGMNR(OPTIONS2130, STARTTIMETO_DATE(2022-05-14 11:30:00, YYYY-MM-DD HH24:MI:SS),
ENDTIMETO_DATE(2022-05-14 12:30:00, YYYY-MM-DD HH24:MI:SS));OPTIONS: 提供如下表所列的可选模式各模式可以通过 或者按位或来进行组合。其它位的值如 1、4、8 等目前不支持配置后不会报错但是没有效果。例如组合全部模式则取值计算方法为 2166420482130那么 OPTIONS 值取就是 2130。
查看归档日志文件的分析结果
selectTIMESTAMP , START_TIMESTAMP ,COMMIT_TIMESTAMP, OPERATION ,OPERATION_CODE , ROLL_BACK ,TABLE_NAME , ROW_ID , USERNAME , DATA_OBJ# ,DATA_OBJV# , SQL_REDO , REDO_VALUE , UNDO_VALUE
from V$LOGMNR_CONTENTS where table_name xxx;终止归档日志文件分析
结束分析
DBMS_LOGMNR.END_LOGMNR();删除系统包
SP_CREATE_SYSTEM_PACKAGES(0,DBMS_LOGMNR);问题处理
v$logmnr_contents查询报错
--问题描述
数据库连接工具查询日志挖掘视图提示如下报错
SQL 错误 [22000]: dbms_logmnr.start_logmnr() must be invoked before selecting from v$logmnr_contents--问题处理
三、DM8基于时间点的恢复
在生产环境中当误操作删除了重要数据时可以使用闪回查询来找回原来的数据但当表被删除或者数据库没有开启闪回功能时则无法使用闪回来获取原有的表数据;此时可以使用基于归档日志的时间点的恢复(不完全恢复)来达到恢复数据或恢复表的目的。 本章介绍DM8数据库如何使用归档日志文件将数据库恢复到指定时间点的状态。
备份数据库
数据库故障还原的前提是要有备份文件这里创建一个原始的数据库备份文件可以使用DMRMAN脱机备份文件也可以是联机备份文件。这里以联机备份为例(在联机备份之前需要保证数据库已开启并配置归档)。使用SYSDBA用户登录数据库执行如下语句备份数据库
/dmdb8/dmdbms/bin/disql sysdba/sysdba:5237
SQL backup database full backupset DMfuwaFULL_ONLINE1127;默认备份目录/dmdb8/dmdata/fuwa/bak
制造数据生成归档日志
创建test用户并在test用户下创建表t_table并插入数据此过程生成归档日志。
SQL create user test IDENTIFIED by dameng123 DEFAULT TABLESPACE main;
SQL create table test.t_table as select * from SYSOBJECTS;模拟故障删除表
模拟故障删除test用户下表t_table。并记录下删除表时的系统时间。
SQL drop table test.t_table;
select sysdate;executed successfully
used time: 26.477(ms). Execute id is 705.
SQL LINEID sysdate
---------- -------------------
1 2023-11-27 19:41:58使用备份和归档日志将数据库恢复到指定时间点
t_table表被删除要想找回此表的数据只能将数据库恢复到表删除的前一刻。恢复步骤参考如下
使用备份文件还原数据库
注意如果是异机还原异机上需安装数据库软件并初始化和原实例名一样的实例(参数文件和控制文件不用管用初始化的就成会覆盖) 执行如下命令停止数据库
[dmDBAlocalhost bin]$ DmServiceDMTESTSERVER stop使用步骤1的备份文件将数据库还原到备份时状态
RMAN restore database /dmdb8/dmdata/fuwa/dm.ini from backupset /home/dmdba/DMfuwaFULL_ONLINE1127;使用归档日志将数据库恢复到指定时间点
执行如下命令指定with archivedir参数使用归档恢复并指定until time参数将数据库还原到删除表之前的时间由步骤3得知我们大概在2020-07-23 10:48:53之前的时间删除了表数据这里将数据库恢复到2020-07-23 10:48:40的时间(时间越精确越好无法精确的情况下预估)。
RMAN recover database /dmdb8/dmdata/fuwa/dm.ini with archivedir /home/dmdba/dmarch until time 2023-11-27 19:41:58;从下面的截图可以看出归档的恢复并不是100%(因为是不完全恢复并没有完全重做所有归档日志)只是恢复到93%。
更新数据库魔数
执行如下命令更新数据库魔数db_magic信息。
RMAN recover database dmdb8/dmdata/fuwa/dm.ini update db_magic;此时数据库恢复完成。 执行DmServiceDMTESTSERVER start启动数据库连接数据库查询test用户下t_table表数据可以看到t_test表已恢复。
总结
使用RECOVER命令恢复数据库时可以是基于备份集的恢复也可以是使用本地归档日志的恢复。基于时间点的恢复是使用本地归档日志恢复的方式之一。 除了指定时间点还可以通过指定LSN进行恢复。DM中每条REDO日志记录都对应一个唯一的LSN值指定LSN值以后数据库将会精准的恢复到产生这个LSN时间点的状态。基于LSN的恢复是使用UNTIL LSN 参数恢复到指定的LSN时间点的状态。 基于时间点或LSN的恢复都是不完全恢复基于归档日志恢复到最新状态为完全恢复。 在实际生产环境中如果只是删除某张表或数据建议将数据库还原到另一台机器(目标数据库)上然后拷贝生产环境归档日志将目标数据库恢复到指定的时间点以在不影响生成环境的情况下找回表数据降低对生成环境的影响。