Oracle的回收站和闪回查询机制(二)

时间:2022-10-21 21:49:29

上一篇中讲诉了Oracle中一些闪回查询(Flashback Query),这是利用回滚段信息来恢复一个或一些表到以前的一个时间点(一个快照)。要注意的是,Flashback Query仅仅是查询以前的一个快照点而已,并不改变当前表的状态。 下面就来看看其他的闪回。

1.Flashback Table 

Oracle Flashback Table特性允许利用Flashback Table语句,确保闪回到表的前一个时间点。与Oracle 9i中的Flashback Query相似。要注意的是,Flashback Table不等于Flashback Query,Flashback Query不改变当前表的状态,而Flashback Table将改变当前表及附属对象一起回到以前的时间点。

flashback table tablename to timestamp xxx或 

flashback table tablename to scn xxx ;

需要注意的是如果需要闪回一个表,需要以下条件:

·需要有flashback any table的系统权限或者是该表的flashback对象权限; 

·需要有该表的select,insert,delete,alter权限; 

·必须保证该表row movement( alter table tablename enable row movement;)。

2.Flashback Drop 

Oracle Flashback Drop特性提供一个类似回收站的功能,用来恢复不小心被删除的表。当删除表时,Oracle 10g并不立刻释放被删除的表所占用的空间,而是将这个被删除的表进行自动重命名(为了避免同类对象名称的重复)并放进回收站中。所谓的回收站类似于Windows系统中的回收站,是一个虚拟的容器,用于存放所有被删除的对象,在回收站中被删除的对象将占用创建时的同样的空间。如果这个被删除的表需要进行恢复,就可利用Flashback
Drop功能。 

进行一个删除表后恢复的简单测试。

(1)查看是否开启回收站功能?

Oracle的回收站和闪回查询机制(二)

on:表示表空间启用的回收站功能,建议所有数据都开启这个功能,百利而无一害!

备注:该参数可以设置成session级别打开,也可以设置成system级别,不用重启就可以生效

(2)对被删除的表进行恢复

Oracle的回收站和闪回查询机制(二)

select * from recyclebin;--显示回收站信息 ,可以看到第一次回收站中是没有任何结果的,表示没有任何表在回收站中。

创建一个表,并删除,再次显示回收站信息 则有一条记录,此时可以通过此记录进行Flashback

flashback table test_drop to before drop;

flashback table "BIN$CDLY2FEzAJ7gUwr4GJgAng==$0" to before drop;

这两个语句是一样的结果,这时如果同一对像多次删除怎在recyclebin中识别具体哪条记录去还原呢?

dba_recyclebin中对每删除一个对像都会以BIN$进行命名,同时会有相应的dropscn、createtime、droptime可以跟据这些对像进行定位,然后进行恢复

(3)管理回收站

purge table hr.test_drop --清除回收站中的单个表.注意:如果此时是DBA用户操作其它用户数据,清除回收站中的表时要加上用户名,否则报表不在回收站中

purge tablespace ORAPEL   --清除指定的表空间对像

purge tablespace ORAPEL userhr--删除表空间指定用户下的所有对像

purge recyclebin --清空整个回收站

purge user_recyclebin或purge dba_recyclebin ;--清除不同的对象回收站:

如果你希望不通过回收站直接删除一个表 :

drop table test_drop purge; --删除一个表且不放到回收站中不能进行恢复,在drop语句中可以利用purge选项。

注意:此命令相当于truncate+drop操作,一般不建议这么操作!

在此需要说明一下ORACLE空间利用原则:

使用现有的表空间的未使用空间;如果没有了空闲空间,则检查回收站,对于回收站的对象按照先进先出的原则,对于最先删除的对象,oracle在空间不足之时会最先从回收站删除以满足新分配空间的需求;如果回收站也没有对象可以清理,则检查表空间是否自扩展,如果自扩展则扩展表空间,然后分配新空 间; 如果表空间非自扩展,或者已经不能自扩展(到达最大限制),则直接报表空间不足错误,程序终止

同时对于DROP掉的对像是不是都会经过回收站?

以下几种drop不会将相关对像放进回收站recyclebin中

* drop tablespace :会将recyclebin中所有属于该tablespace的对像清除

* drop user :会将recyclebin中所有属于该用户的对像清除

* drop cluster : 会将recyclebin中所有属于该cluster的成员对像清除

* drop type : 会将recyclebin中所有依赖该type对像清除

另外还需要注意一种情况,对像所在的表空间要有足够的空间,不然就算drop掉经过recyclebin由于空间不足oracle会自动删除的(切记)!

3.Flash Version Query 

Flashback Version Query在上一篇末尾已经提过了,它是利用保存的回滚信息,可以看到特定的表在时间段内的任何修改,如电影的回放一样,可以了解表在该期间的任何变化。Flashback version query一样依赖于AUM,提供了一个查看行改变的功能,能找到所有已经提交了的行的记录,分析出过去时间都执行了什么操作。Flashback version query采用VERSIONS BETWEEN语句来进行查询,常用的方法: 

·VERSIONS_SCN - 系统改变号 

·VERSIONS_TIMESTAMP - 时间 

例如:在test表中,时间1插入一条记录,时间2删除了这条记录,对于时间3执行select * from test当然查询不到这条记录,只能看到该表最后的提交记录。这时如果利用Flash Table或者是Flash Query,只能看到过去的某一时间点的一个快照,而利用Flashback Version Query,能够把时间1、时间2的操作给记录下来,并详细的查询出对表进行的任何操作。 

select versions_starttime,

       versions_endtime,

       versions_xid,

       versions_operation,

       test

  from t_flash versions between timestamp minvalue and maxvalue

 order by versions_starttime;; 

在上述查询中,列 versions_starttime、versions_endtime、versions_xid、versions_operation是伪列,还有一些伪列,如versions_startscn和versions_endscn显示了该时刻的系统更改号。列versions_xid显示了更改该行的事务标识符。 测试时出现“ORA-30052: 下限快照表达式无效”错误,原因是指定的时间范围不在 UNDO_RETENTION
的撤销范围内(比如说你指定了是2小时之前的时间,而 UNDO_RETENTION < 7200)。 这也是我为什么上篇SCN会重新取值的原因。

这时也许会有疑问versions_xid是做什么用的,这时标识一个事务操作的ID,在一个事务commit前,我们可以通过

select xid from v$transaction;

来查询此事务的ID,在提交之后如果还想知道就需要查询versions_xid。versions_xid更多的现在用于进行诊断问题、性能分析和审计事务。

Flashback Version Query说明了可以审计一段时间内表的所有改变,但是也仅仅是能发现问题,对于错误的事务,没有好的处理办法。而通过versions_xid从FLASHBACK_TRANSACTION_QUERY视图中获得事务的历史以及Undo_sql(回滚事务对应的sql语句),也就是说审计一个事务到底做了什么,甚至可以回滚一个已经提交的事务。

Oracle的回收站和闪回查询机制(二)

注意:这个UNDO_SQL语句对应的是1个update语句,如果想回滚这个事务,执行这个update语句即可。

可以看到,此时审计一个事务,并可以回滚一个已经提交的事务。如果确定出错的事务是最后一个事务,我们利用Flashback Table或者Flashback Query就可以解决问题。但是,如果执行了一个错误的事务之后,又执行了一系列正确的事务,那么上面的方法就无能为力,用这个方法就可以查看或回滚这个错误的事务。

通过versions_xid来实现的技术,现在也可以称之为Flashback Transaction Query (闪回事务查询)

4.Flashback Database 

Oracle Flashback Database特性允许通过SQL语句Flashback Database语句,让数据库前滚到当前的前一个时间点或者SCN,而不需要做时间点的恢复。闪回数据库可以迅速将数据库回到误操作或人为错误的前一个时间点,可以不利用备份就快速的实现基于时间点的恢复,这样就可以节省时间。Oracle通过创建新的Flashback Logs(闪回日志),记录数据库的闪回操作。如果希望能闪回数据库,需要设置如下参数:DB_RECOVER_FILE_DEST日志的存放位置,DB_RECOVER_FILE_DEST_SIZE恢复区的大小。在创建数据库的时候,Oracle将自动创建恢复区,但默认是关闭的,需要执行alter
database flashback on命令。 

flashback database to time to_timestamp(xxx); 

flashback database to scn xxx ;