达梦数据库闪回

1、闪回介绍

当出现表被误删除或者想查看表历史时间点的数据,可以开启闪回功能,将数据恢复到删除点之前的数据状态,可以不用时间点恢复操作恢复数据,比较易用方便。需要将系统 INI 参数 ENABLE_FLASHBACK 置为 1 ,才可以使用闪回表或进行闪回查询。

2、闪回表

2.1、闪回表使用的场景

当用户出现误操作删除了表数据,想恢复表数据,可以使用闪回功能。但是与传统的介质恢复相比,闪回表在易用性、可用性和还原时间方面有明显的优势。

2.2、闪回表的原理

闪回表是在数据库联机时,通过只回退对指定表及其相关对象所做的更改,将表里的数据回退到历史的某个时间点,而不需要执行传统的时间点恢复操作。比如回退到用户误删除数据之前的时间点,从而将误删除的数据恢复回来,在这个操作过程中,数据库仍然可用而且不需要额外的空间。

闪回表利用的是 UNDO 表空间里所记录的数据被改变前的值。因此,如果因保留时间超过了初始化参数 UNDO_RETENTION 所指定的值,从而导致闪回表时所需要的 UNDO 数据被其他事务覆盖的话,那么就不能将表中数据恢复到指定的时间了。

2.3、闪回表操作

语法:

FLASHBACK TABLE [<模式名>.]<表名> {,[<模式名>.]<表名>}

TO <SCN | LSN | TIMESTAMP> <expr> [ <ENABLE|DISABLE> TRIGGERS ]

说明:

(1)<expr> 指明闪回到的 LSN 值或 TIMESTAMP 值。

(2)<ENABLE|DISABLE> TRIGGERS 指定是否开启触发器,ENABLE 为开启触发器,DISABLE 为关闭触发器,不指定则默认为关闭。

(3)使用闪回功能需要打开 dm.ini 中的 ENABLE_FLASHBACK 参数值,置为1。

(4)当前闪回表功能支持:批量闪回多个表、触发器的禁用与启用、DMDPC 环境(除使用 LOCAL 登录外)、DMDSC 环境;

(5)当前闪回表功能不支持在 DM MPP 环境下使用。

(6)闪回表利用的是 UNDO 表空间里记录的数据被改变前的值,只能闪回到 UNDO_RETENTION 指定值范围内的时间点。

(7)用户必须具有 FLASHBACK ANY TABLE 系统权限或 FLASHBACK 对象权限.

(8)闪回表语句是作为单个事务处理来执行。同时闪回多个表时,必须成功闪回所有表,否则会回退整个事务。闪回作为 DDL 语句,开启自动提交时,闪回成功后会自动提交。

(9)必须对要执行闪回操作的表启动行移动(分区表具有 MOVEMENT 功能的不能关闭,否则闪回可能会报错)。

(10)不会闪回受影响对象的统计信息。

(11)闪回会保留所有现有的索引。

(12)闪回中会正常检查约束条件,如果在闪回执行期间违反了任何约束条件,则会回滚闪回操作。

(13)闪回不能跨越修改了表结构的 DDL。比如,在闪回数据之前,做过删除一个字段的操作,那么是无法闪回的。

(14)不能对系统表、临时表、HUGE 表、内部辅助表、动态表等执行闪回表操作。

(15)DMDPC 环境下由于各节点的 SCN/LSN 不同,只支持闪回到时间点 TIMESTAMP。

(16)限制重复闪回。闪回作为 DDL,对于同一个表,不允许再次闪回到上一次闪回之前的 LSN/TIMESTAMP。

案例1:闪回表emp到指定的LSN可以看到emp2表已经恢复到删除点之前的状态。

可以看到emp2表已经恢复到删除点之前的状态。

案例2:闪回到指定 TIMESTAMP

默认的保留时间是90秒。

当超过90秒后,查询会报错闪回版本已经过期。

但是此时修改UNDO_RETENTION值为300,但是只能对以后的操作有效,之前的操作是不能闪回的。

如:

再进行第二个验证:

总结:

(1)UNDO_RETENTION值默认是90秒,如果删除后超过了90秒想恢复是不能的。

(2)可以修改UNDO_RETENTION值,但是修改的值只能对后续操作有效,之前的操作不能恢复。

(3)增加UNDO_RETENTION的值,会增加undo表空间的占用资源,需要结合实际情景修改。

案例3:同时闪回多个表

案例4:带触发器的表闪回时禁用触发器的表现

3、闪回查询

闪回查询子句的语法,是在数据查询语句的基础上,为 FROM 子句增加了闪回查询子句。DM MPP 环境不支持闪回查询。数据守护环境下,备库不支持闪回查询。

语法:

<闪回查询子句>::= WHEN <TIMESTAMP time_exp> | AS OF <TIMESTAMP time_exp> | AS OF <SCN|LSN lsn>

说明:

  1. time_exp 一个日期表达式,一般用字符串方式表示,lsn 指定 LSN 值。

(2)闪回查询只支持普通表(包括加密表与压缩表)、水平分区表和堆表,不支持临时表、列存储表、外部表与视图。

(3)闪回查询中 lsn 的值,可以通过查询动态视图 V$RLOG 或 V$LSN_TIME 来确定,也可以通过闪回版本查询的伪列来确定。

(4)由于视图 V$LSN_TIME 每三秒收集一次 LSN/TIME 映射关系,因此基于时间进行闪回查询时可能存在三秒的误差,如果需要进行精确度更高的闪回查询,建议基于 LSN 进行闪回查询。

(5)当闪回表作为 DDL 时,对于同一个表,不允许基于对上一次闪回表的 LSN 或 TIMESTAMP 进行闪回查询。

案例1:闪回查询特定时间点的数据

从emp2表中删除1001编号的员工,然后闪回查询表数据

闪回查询

案例2:闪回查询指定lsn

4、闪回版本查询

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)lsn 指定 LSN 值。<lsn1> 表示起始 LSN,<lsn2> 表示结束 LSN。

(3)闪回版本查询支持普通表(包括加密表与压缩表)、水平分区表和堆表,不支持临时表、列存储表、外部表与视图。

(4)用户通过闪回版本查询子句,可以得到指定表过去某个时间段内,事务导致记录变化的全部记录。指定条件可以为时刻或 LSN。

(5)支持将表 17.2.1 中的伪列作为闪回版本查询的查询项,辅助获取精准的闪回查询信息。

伪列:

VERSIONS_STARTTIME、VERSIONS_STARTSCN、VERSIONS_STARTTRXID

起始时间戳、起始 LSN、起始 TRXID

VERSIONS_ENDTIME、VERSIONS_ENDSCN、VERSIONS_ENDTRXID

提交时间戳、提交 LSN、提交 TRXID。如果该值为 NULL,表示行版本仍然是当前版本

VERSIONS_OPERATION

在行上的操作。I 表示 Insert、D 表示 Delete、U 表示 Update

案例3:

5、闪回事务查询

闪回事务查询提供系统视图 V$FLASHBACK_TRX_INFO 供用户查看在事务级对数据库所做的更改。根据视图信息,可以确定如何还原指定事务或指定时间段内的修改。

案例:先在给定的时间点之后执行一个事务,然后查询V$FLASHBACK_TRX_INFO

社区地址: https://eco.dameng.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值