现在的位置: 首页 > 数据库 > 正文

Oracle闪回技术类型及原理

2014年11月18日 数据库 ⁄ 共 2477字 暂无评论 ⁄ 阅读 846 次
文章目录

闪回包括闪回删除表、闪回DML操作等,不同形式的闪回原理也不同。

闪回删除表

闪回已经删除的表利用的原理类似于Windows里我们删除了一个文件,然后可以从回收站中恢复它。

在Oracle中,当一个表被删除时,它并没有真正的被物理删除,而是放到了回收站(Recyclebin)里了,只要表还在回收站中就可以将其闪回回来。然而,当磁盘空间不足时回收站中磁盘空间会被使用,也就彻底丢失了删除的表。

使用Recyclebin我们可以先看下当前服务器是否开始了这个功能,使用语句:show parameter bin,若value是on则表示已经开启,否则未开启。开启回收站功能命令:alter system set recyclebin = on;。

我们可以使用select * from cat查看当前用户所有表,其中,表名前有BIN$的就是回收站中被删除的表。查看回收站可以使用语句:show recyclebin,清空回收站中某张表使用语句:purge table tb_name;,完全清空回收站使用语句:purge recyclebin;。

若想知道回收站中被删除的表名是什么,可以使用语句:select object_name,ts_name from user_recyclebin;,其中,ts_name字段为表名。

若确定某张表确实可以彻底删除而不放入回收站,可以使用语句:drop table tb_name purge;。

重点到了,现在是如何恢复已经被删除的表!

闪回恢复已经删除的表使用语句:flashback table tb_name to before drop;。

闪回技术只能保护非系统表空间中的表,而且这些表还必须存放在本地管理的表空间中。同时,恢复可能是不完全的。因为依附于表的某些无法恢复,如位图连接索引、引用完整性约束等并不受回收站保护。

闪回DML

闪回DML其实是利用UNDO(回滚段)中的数据进行反操作来实现的,当某DML操作被提交时,该操作的反操作会记录在UNDO中一段时间。这个时间由参数undo_retention,单位是秒,默认900秒(15分钟)。查看系统上该参数使用语句:show parameter undo_retention;。当然,我们也可以设定参数值,使用语句:alter system set undo_retention = value;。

需要注意的是,闪回DML并不能保证设定时间内的数据都可以恢复。因为在还原表空间不足时Oracle会使用undo_retention要求保留的磁盘空间,也就是这部分数据会被覆盖。另外,如果数据库DML操作频繁,该参数过大会消耗过多的磁盘空间,造成效率下降。

闪回DML有两种方式,一种是通过SCN闪回,一种是通过时间闪回。通常情况下,为保障数据的安全性不使用时间闪回,因为在该时间段内你无法保证其他人没有操作数据。若你使用时间闪回,则意味着其他人的数据将会丢失。

SCN闪回步骤

1)查询闪回数据行versions_xid,如修改了emp表的sal,现在想闪回,查询xid使用语句:select versions_xid,empno,ename,sal

from emp versions between scn minvalue and maxvalue

where empno = 7900;

2)查询DML的SCN,借助数据字典flash_transaction_query,使用语句:

select operation,start_scn from flash_transaction_query where xid = hextoraw(‘xid_num’);

我们甚至可以查看具体的反操作语句,使用语句:

select operation,undo_sql from flash_transaction_query where xid = hextoraw(‘xid_num’);

其中,hextoraw为十六进制转raw函数。

3)闪回SCN,使用语句:flashback table tb_name to SCN scn_num;

需要注意的是,若该表未开启行移动功能,该语句会报错。针对表启用行移动功能使用语句:alter table tb_name enable row movement;。

时间闪回步骤

时间闪回较为简单,只要将表闪回到一个指定时间即可。需要注意的是,时间必须使用timestamp格式。如,借助函数to_timestamp(),使用语句:

flashback table tb_name to timestamp to_timestamp(’17:30’,’hh24:mi’);

闪回数据库

闪回数据库的风险极大,它意味着数据库数据的丢失,尽量不要采用。

闪回数据库必须在归档模式下,查看闪回是否开启,使用语句:

select flaschback_on from v$database;

若值为YES则表示开始,NO则表示未开启。

数据库闪回语句如下:

flashback database to time to_date(xxx);

flashback database to time TO_TIMESTAMP (xxx);

flashback database to scn xxx

flashback database to sequence xxx thread 1

flashback database to timestamp(sysdate-1/24)

不闪回查询DML数据

delete数据库里的数据都删除并commit,查询过去某指定时间点数据库中的数据:

select * from emp as of timestamp to_timestamp

('2013-07-05 08:00:00','yyyy-mm-ddhh24:mi:ss');

删除表后将数据添加到原表中,使用语句

insertinto emp select * from emp

as of timestamp to_timestamp

('2013-07-05 08:00:00','yyyy-mm-ddhh24:mi:ss');

声明:该笔记转载自《Oracle DBA培训教程》,仅用于个人学习,若侵犯到您的版权敬请告知!

» 声明:本站文章源于个人经验总结或书籍、互联网转载,内容仅用于个人学习,请勿转载,否则后果自负!

给我留言

留言无头像?