使用闪回技术
- 闪回技术概述
为了使数据库能够从任何逻辑误操作中迅速恢复,oracle推出了闪回技术。采用该技术,可以对行级和事务级的数据变化进行恢复,减少了数据恢复的时间,而且操作简单,通过sql语句就可以实现数据的恢复,大大提高了数据库恢复的效率。闪回技术是数据库恢复技术历史上一次重大的进步,从根本上改变了数据恢复。
闪回技术包括以下各项:
- 闪回查询(flashback query):查询过去某个时间点或某个SCN(system change number,系统更改号)值时表中的数据信息。
- 闪回版本查询(flashback version query):查询过去某个时间段或某个SCN段内表中数据的变化情况。
- 闪回事务查询(flashback transaction query):查看某个事务或所有事务在过去一段时间对数据进行的修改。
- 闪回数据库(flashback database):将数据库恢复到过去某个时间点或某个SCN值时的状态。
- 闪回删除(flashback drop):将已经删除的表及相关联的对象恢复到删除前的状态。
- 闪回表(flashback table):将表恢复到过去的某个时间点或某个SCN值时的状态。
SCN:scn是当Oracle数据库更新后,有dbms自动维护而累积递增的一个数字,可以通过查询数据字典V$DATABASE中的CURRENT_SCN获得当前的SCN号。
注意:
闪回数据库是基于闪回恢复区(Flash Recovery Area)特性实现的,如果要使用闪回数据库技术,还需要启用闪回恢复区
闪回删除是基于回收站(Recycle Bin)特性实现的,如果要使用闪回删除技术,还需要启用回收站
闪回查询、闪回版本查询、闪回事务查询以及闪回表主要是基于撤销表空间中的回滚信息实现的
- 闪回恢复区
- 闪回恢复区的含义
Oracle推荐指定一个闪回恢复区(flash recovery area)作为存放备份与恢复相关文件的默认位置,这样oracle就可以实现自动的基于磁盘的备份与恢复(automatic disk-based backup and recovery)。那么,什么是闪回恢复区?简单地说,闪回恢复区是一块用以存储恢复相关的文件的存储空间,允许用户集中存储所有恢复相关的文件。如下几种文件可以放到闪回恢复区中。
控制文件
归档的日志文件
闪回日志
控制文件和SPFILE自动备份
RMAN备份集
数据文件拷贝
- 闪回恢复区的优点
闪回恢复区提供了一个集中化的存储区域,很大程度上减少了管理开销,这是其最主要的优点,另外,与RMAN结合使用可以进行快速恢复。
- 设置闪回恢复区
如果使用dbca创建的数据库,在安装时可以设定闪回恢复区的位置及大小。
闪回恢复区主要通过以下3个初始化参数来设置和管理。
Db_recovery_file_dest:指定闪回恢复区的位置
Db_recovery_file_dest_size:指定闪回恢复区的可用空间大小
Db_flashback_retention_target:该参数用来控制闪回日志中数据保留的时间,或者说,希望闪回数据库能够恢复到的最早的时间点。单位为MIN,默认为1440min,也就是一天。当然,实际上可退回的时间还取决于闪回恢复区的大小,因为里面保存了回退所需要的闪回日志,所以这个参数要和db_recovery_file_dest_size配合修改。
如果要撤销闪回恢复区,把初始化参数DB_RECOVERY_FILE_DEST的值清空即可。
注意:db_recovery_file_dest_size只有在db_recovery_file_dest清空之后才可以清空。
- 设置闪回数据库
设置可闪回恢复区之后,要启用闪回数据库的功能,还需要进一步配置。数据库必须已经处于归档模式,再设置闪回数据库。
设置闪回数据库的步骤如下:
启用归档模式(闪回数据库只能处于归档模式)
数据库未设置闪回数据库
建立闪回区
设置闪回数据库的数据保留周期为一天以min为单位
启用闪回日志
查询是否成功启用闪回恢复区
- 取消闪回恢复区
将db_recovery_file_dest参数设置为空,可以停用闪回恢复区,但是,如果已经启用闪回数据库,则不能取消闪回恢复区,所以必须先禁用闪回数据库,才能取消闪回恢复区。
步骤如下:
关闭数据库
Shutdown immediate
装载数据库
Startup mount
关闭数据库闪回
Alter database flashback off;
打开数据库
Alter database open
修改闪回参数
Alter system set_recovery_file_dest=’’;
三、闪回错误操作技术
1、闪回数据库
- 闪回数据库能够使数据迅速回滚到以前的某个时间点或者某个SCN上,这对于数据库从逻辑错误中恢复特别有用,而且也是大多数发生逻辑损害时恢复数据库的最佳选择。
- 作用类似于数据库的倒带按钮。
- 可以在用户造成了逻辑数据损坏的情况下使用。
闪回数据库基本语法为
FLASHBACK DATABASE [database] TO
[SCN|TIMESTAMP expression]|
[BEFORE SCN|TIMESTAMPexpression]
参数说明
- TO SCN:将数据库恢复到指定SCN的状态
- TO TIMESTAMP:将数据库恢复到指定的时间点
- TO BEFORE SCN:将数据库恢复到指定SCN的前一个SCN状态
- TO BEFORE TIMESTAMP:将数据库恢复到指定时间点前的状态
闪回数据库操作的限制:
- 数据文件损坏或丢失等介质故障不能使用闪回数据库进行恢复。闪回数据库只能基于当前正常运行的数据文件。
- 闪回数据库功能启动后,如果发生数据库控制文件重建或利用备份恢复控制文件,则不能使用闪回数据库。
- 不能使用闪回数据库进行数据文件收缩操作。
- 不能使用闪回数据库将数据库恢复到在闪回日志中可获得最早的SCN之前的SCN,因为闪回日志文件在一定条件下被删除,而不是始终保存在闪回恢复区中。
案例:使用SCN闪回数据库
- 查询数据库当前的SCN
改变数据库的当前状态,模拟创建表bxjg,并插入一条数据。
进行闪回数据库恢复,将数据库恢复到创建表之前的状态,即SCN为1915426
用RESETLOGS选项打开数据库
验证数据库的状态(bxjg表应该不存在)
6)可以通过查询数据字典视图v$flashback_database_log来获得能够闪回的最早的scn号,及闪回时值最早不能小于该值。同理,如果通过时间点闪回,则闪回时间也不能小于查询得到的最早时间。
设置显示时间格式:
查询数据库中当前最早的闪回SCN和时间
- 按照指定时间闪回数据库
首先查询数据系统当前时间
改变数据库当前状态,模拟创建表test2,并插入一条数据
进行闪回数据库恢复,将数据库恢复到创建表之前的状态。
使用RESETLOGS打开数据库
验证数据库的状态test2表是否存在。
- 闪回表
闪回表是将表恢复到过去的某个时间点或者指定的SCN而不用恢复数据文件,为DBA提供了一种在线、快读、便捷的恢复方式,可以恢复对标进行的修改、删除、插入等错误的操作。
利用闪回表技术恢复表中数据的过程,实际上是对表进行DML操作的过程。Oracle自动维护与表相关联的索引、触发器、约束等。
为了使用数据库闪回表功能,必须满足下列条件
- 用户具有flashback any table系统权限,或者具有所操作表的flashback对象权限。
- 用户具有所操作表的select、insert、delete、alter对象权限
- 启动被操作表的row movement特性,可以采用下列方式进行。
Alter table 表名 enable row movement;
闪回表操作的基本语法为
FLASHBACK TABLE [schema.]table TO
SCN|TIMESTAMP expression
[ENABLE|DISABLE TRIGGERS]
参数说明
SCN:将表恢复到指定的SCN时状态
TIMESTAMP:将表恢复到指定的时间点
ENABLE|DISABLE TRIGGER:在恢复表中数据的过程中,表上的触发器是激活还是禁用(默认为禁用)
注意:SYS用户或以AS SYSDBA身份登录的用户不能执行闪回表操作
案例:使用SCN闪回表
- 使用scott用户登录
改变数据库的当前状态,模拟创建表test3,并插入3条数据
查询当前SCN号,如果当前用户没有权限查询v$database,则以sys用户登录,授予当前用户访问数据字典的权限。
- 更新数据(把id=1的名字改成batianhu,删除id=3的数据),并且提交。
启动test3表的ROW MOVEMENT特性
将test3表恢复到2016-12-26 15:17:50
查询
将表test3恢复到scn为1923436的状态
- 闪回删除
闪回删除可以恢复使用drop table语句删除的表,是一种对意外删除的表的恢复机制。
闪回删除功能的实现主要是通过oracle数据库中的“回收站”技术实现的。在oracle数据库中,当执行drop table 操作时,并不立即回收表及、及其关联的对象的空间,而是将它们重命名后放入一个称为“回收站”的逻辑容器中保存,直到用户决定永久删除它们或存储该表的表空间存储空间不足时,表才能真正被删除。为了使用闪回删除技术,必须开启数据库的“回收站”。
- 启动回收站,将参数recyclebin设置为ON,在默认情况下“回收站”已启动。
查看“回收站”。当执行drop table操作时,表及其关联对象被命名后保存在“回收站”中,可以通过查询user_recyclebin,dba_recyclebin视图获得被删除的表及其关联对象信息。
注意:不支持sys用户,system表空间下的对象也不能从回收站里拿到,故使用sys或者system用户登录时,查询为空。
- 如果在删除表时使用了PURGE短语,则表及其关联对象被直接释放,空间被回收,相关信息不会进入“回收站”中。
建立表,并且使用purge短语删除
查看在回收站里面没有
- 清空回收站
由于被删除表及其关联对象的信息保存在“回收站”中,其存储空间并没有释放,因此需要定期清空“回收站”,或清除“回收站”中没有用的对象(表、索引、表空间),释放其所占的磁盘空间。
语法如下:
PURGE [TABLE 表名 | INDEX index]
[RECYCLEBIN | DBA_RECYCLEBIN] | [TABLESPACE tablespace [USER user]]
参数说明:
TABLE:从回收站中清除指定的表
INDEX:从回收站中清除指定的索引,并回收其磁盘空间
RECYCLEBIN:清空用户“回收站”,并回收所有对象的磁盘空间
DBA_RECYCLEBIN:清空整个数据库系统的“回收站”,只有具有SYSDBA权限的用户才可以使用
TABLESPACE :清除“回收站”中指定额表空间,并回收磁盘空间
USER:清除回收站中指定表空间中特定用户的对象,并回收磁盘空间
- 闪回删除操作
FLASHBACK TABLE [schema.]table TO BEFORE DROP [RENAME TO table]
注意:只有本地管理的,非系统表空间中的表可以使用闪回删除操作。
案例:闪回删除示例
新建表,插入数据并提交
删除表
闪回表
或者闪回表之后重新命名
闪回查询技术
闪回查询:允许根据时间点或SCN查看旧的数据。除了可以查看旧数据,需要时可以通过检索旧数据来撤销错误的更改。
基本语法如下:
Select column_name[,...]
From table_name
[as of scn | timestamp expression]
Where condition
参数说明:
As for timestamp:基于时间的闪回查询
As of scn:基于scn的闪回查询
案例:闪回查询实例
- 使用scott用户登录,对emp表基于as of timestamp的闪回查询
更新员工号为7844的工资,更新为2000,并提交事物
第一个事务提交,自动开启第二个事物。
3)再次更新员工号为7844的工资,更新两次,提交事物。
第二个事物提交,自动开启第三个事务
4)再次更新员工号为7844的工资,更新为3500,并提交事物
执行Commit提交
第三个事务提交,自动开启第四个事务
- 查询7844号员工的当前工资
查询7844号员工前一个小时的工资
查询第一个事务提交,第二个事物还没有提交时7844号员工的工资
如果需要,可以将数据恢复到过去某个时刻的状态