使用 DBMS_FLASHBACK 包,可以查询在指定时间或 LSN 时刻的数据库版本。
提供兼容 ORACLE 的 DBMS_FLASHBACK 包中四种方法。
关闭会话闪回模式。
语法如下:
PROCEDURE DISABLE;
以指定 LSN 打开会话闪回模式。
语法如下:
PROCEDURE ENABLE_AT_SYSTEM_CHANGE_NUMBER(QUERY_SCN IN BIGINT);
参数详解
QUERY_SCN 输入参数,指定闪回时刻 LSN。
以指定时间打开会话闪回模式。
语法如下:
PROCEDURE ENABLE_AT_TIME(QUERY_TIME IN TIMESTAMP);
参数详解
QUERY_TIME 输入参数, 指定闪回时间。
获取系统当前 LSN 值。
语法如下:
FUNCTION GET_SYSTEM_CHANGE_NUMBER RETURN BIGINT;
返回值
返回系统当前 LSN
1.使用 DBMS_FLASHBACK 包,需要打开闪回 INI 参数 ENABLE_FLASHBACK。
2.打开会话闪回模式下不能执行 DML 和 DDL 操作,需要先调用包中方法 DISABLE 关闭闪回模式才能正常执行。
3.会话闪回模式下可以执行带闪回查询子句的语句,也可以执行不带闪回查询子句的语句;如果指定闪回查询子句中的 LSN/TIME 和会话闪回模式中的 LSN/TIME 相同,则查询结果一致,若不同则以指定的闪回查询子句为主。
4.在数据守护环境下,备库不支持使用 DBMS_FLASHBACK 包。
5.DM MPP 环境下不支持 DBMS_FLASHBACK 包。
语法格式:
FLASHBACK TABLE [<模式名>.]<表名> {,[<模式名>.]<表名>} TO <SCN | LSN | TIMESTAMP> <expr> [ <ENABLE|DISABLE> TRIGGERS ] ;
参数
1.< 模式名 > 指明该表属于哪个模式,缺省为当前模式;
2.< 表名 > 指明被创建的基表名,基表名最大长度 128 字节;
3.<expr> 指明闪回到的 LSN 值或 TIMESTAMP 值;
4.<ENABLE|DISABLE> TRIGGERS 指定是否开启触发器,ENABLE 为开启触发器,DISABLE 为关闭触发器,不指定则默认为关闭。
1.使用闪回功能需要打开 dm.ini 中的 ENABLE_FLASHBACK 参数;
2.当前闪回表功能支持:批量闪回多个表、触发器的禁用与启用、DMDPC 环境(除使用 LOCAL 登录外)、DMDSC 环境;
3.当前闪回表功能不支持在 DM MPP 环境下使用;
4.闪回表利用的是 UNDO 表空间里记录的数据被改变前的值,只能闪回到 UNDO_RETENTION 指定值范围内的时间点;
5.用户必须具有 FLASHBACK ANY TABLE 系统权限或 FLASHBACK 对象权限
6.闪回表语句是作为单个事务处理来执行。同时闪回多个表时,必须成功闪回所有表,否则会回退整个事务。闪回作为 DDL 语句,开启自动提交时,闪回成功后会自动提交;
7.必须对要执行闪回操作的表启动行移动(分区表具有 MOVEMENT 功能的不能关闭,否则闪回可能会报错);
8.不会闪回受影响对象的统计信息;
9.闪回会保留所有现有的索引;
10.闪回中会正常检查约束条件,如果在闪回执行期间违反了任何约束条件,则会回滚闪回操作;
11.闪回不能跨越修改了表结构的 DDL。比如,在闪回数据之前,做过删除一个字段的操作,那么是无法闪回的;
12.不能对系统表、临时表、HUGE 表、内部辅助表、动态表等执行闪回表操作;
13.DMDPC 环境下由于各节点的 SCN/LSN 不同,只支持闪回到时间点 TIMESTAMP;
14.限制重复闪回。闪回作为 DDL,对于同一个表,不允许再次闪回到上一次闪回之前的 LSN/TIMESTAMP。
1.打开ENABLE_FLASHBACK参数
#查看参数
select * from v$dm_ini t where t.PARA_NAME='ENABLE_FLASHBACK';
#如果没有打开的话 需要打开
SP_SET_PARA_VALUE (1, 'ENABLE_FLASHBACK', 1)
2.创建dbms_flashback包
select DISTINCT T.OBJECT_NAME from SYS.DBA_PROCEDURES t where t.OBJECT_NAME = 'DBMS_FLASHBACK';
使用包内的过程和函数之前,如果还未创建过系统包。请先调用系统过程创建系统包,默认已经创建。
如果不存在就需要创建
SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_FLASHBACK');
以指定 LSN 为例使用闪回包进行查询。
最后关闭
DBMS_FLASHBACK.DISABLE;
说明:
1.这个包是在session级别的
2.如果执行完DBMS_FLASHBACK.DISABLE;之后 就不能再查之前的版本了
使用说明
1.闪回查询只支持普通表(包括加密表与压缩表)、水平分区表和堆表,不支持临时表、列存储表、外部表与视图;
2.闪回查询中 lsn 的值,可以通过查询动态视图 VRLOG 或 VLSN_TIME 来确定,也可以通过闪回版本查询(见下节)的伪列来确定;
3.由于视图 V$LSN_TIME 每三秒收集一次 LSN/TIME 映射关系,因此基于时间进行闪回查询时可能存在三秒的误差,如果需要进行精确度更高的闪回查询,建议基于 LSN 进行闪回查询。
4.当闪回表作为 DDL 时,对于同一个表,不允许基于对上一次闪回表的 LSN 或 TIMESTAMP 进行闪回查询。
总结语句:
SELECT * FROM PERSON.PERSON_TYPE WHEN TIMESTAMP 'XXX';
SELECT * FROM PERSON.PERSON_TYPE AS OF SCN XXX;
用scn更好一些
语法格式
<闪回版本查询子句>::=VERSIONS BETWEEN <闪回版本查询条件>
<闪回版本查询条件>::=TIMESTAMP <time_exp1> AND <time_exp2> |
SCN|LSN <lsn1> AND <lsn2>
参数
1.time_exp 日期表达式,一般用字符串方式表示。<time_exp1> 表示起始时间,<time_exp2> 表示结束时间
2.lsn 指定 LSN 值。<lsn1> 表示起始 LSN,<lsn2> 表示结束 LSN
使用说明
1.闪回版本查询支持普通表(包括加密表与压缩表)、水平分区表和堆表,不支持临时表、列存储表、外部表与视图;
2.支持将表 中的伪列作为闪回版本查询的查询项,辅助获取精准的闪回查询信息。
闪回版本查询
NULL 表示该行的版本仍然是当前版本。 就可以根据结果判断改变的是哪些值 然后找回我们想要的值。
闪回事务查询提供系统视图 VFLASHBACK_TRX_INFO 供用户查看在事务级对数据库所做的更改。根据视图信息,可以确定如何还原指定事务或指定时间段内的修改。 使用说明 系统视图名为 VFLASHBACK_TRX_INFO,
举例说明
例 查询指定时间之后的事务信息,可为闪回查询操作提供参考。
SELECT * FROM V$FLASHBACK_TRX_INFO WHERE COMMIT_TIMESTAMP > ‘XXX’;
可以通过里面undo_sql 进行反向操作将数据找回来
1.UNDO_RETENTION 设置了事务提交后回滚页保持时间,缺省为 90 秒。因此,超出 UNDO_RETENTION 时间之外的过期闪回版本,无法被闪回查询到。
2.由于回滚段默认每秒种都会自动清理,所以需要延长回滚记录的保留时间,单位是秒。
3.建议还是用scn 来判断
4.默认的undo_retention时间为60秒所以做实验的话建议调大这个值不然很容易就会报错
[执行语句1]:
FLASHBACK TABLE T TO LSN 12938860;
执行失败(语句1)
-9801: 闪回版本已过期
1条语句执行失败
上传到网页中图片不是很清楚清楚的可以看附件
https://eco.dameng.com/
文章
阅读量
获赞