flashback(二)

本文深入探讨了Oracle数据库中的闪回删除对象技术,包括TablespaceRecycleBin的功能、如何启用和禁用该功能、FlashbackDrop实例操作、注意事项及与SYS用户的相关性。详细介绍了如何使用SQL命令进行对象的闪回恢复,并强调了对象恢复的限制和潜在风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Flashback Drop 是从Oracle 10g 开始出现的, 用于恢复用户误删除的对象(包括表,索引等), 这个技术依赖于TablespaceRecycle Bin(表空间回收站),这个功能和windows的回收站非常类似。

这个功能和数据库闪回没有关系,和flashback参数没有关系,表也不要求row movement.

经过测试SQL> alter database flashback off 能够闪回drop掉的表.

Flashback 不支持sys用户. system表空间下的对象,也不能从回收站里拿到。故使用SYS 或者SYSTEM用户登陆时, show recyclebin 为空。

1. Tablespace Recycle Bin

从Oracle 10g 开始,每个表空间都会有一个叫作回收站的逻辑区域,当用户执行drop命令时,被删除的表和表的关联对象( 包括索引,约束,触发器,LOB段,LOB index 段) 不会被物理删除,这些对象先转移到回收站中,这就给用户提供了一个恢复的可能。

初始化参数recyclebin 用于控制是否启用recyclebin功能,缺省是ON,可以使用OFF关闭。

SQL> show parameter recycle

recyclebin                    string      on

 

禁用该功能:

SQL> alter system set recyclebin=off;

SQL> alter system set recyclebin=on;

SQL> alter session set recyclebin=off;

SQL> alter session set recyclebin=on;

禁用后删除的对象将直接删除,不会写到Recycle中,当然在删除时,指定purge 参数,表也将直接删除,不会写到recyclebin中。

 

表空间的Recycle Bin 区域只是一个逻辑区域,而不是从表空间上物理的划出一块区域固定用于回收站,因此Recycle Bin是和普通对象共用表空间的存储区域,或者说是Recycle Bin的对象要和普通对象抢夺存储空间。当发生空间不够时,Oracle会按照先入先出的顺序覆盖Recycle Bin中的对象。也可以手动的删除Recycle Bin占用的空间。

 

1). Purge tablespace tablespace_name : 用于清空表空间的RecycleBin

2). Purge tablespace tablespace_name useruser_name: 清空指定表空间的Recycle Bin中指定用户的对象

3). Purge recyclebin: 删除当前用户的RecycleBin中的对象

4). Purge dba_recyclebin: 删除所有用户的RecycleBin中的对象,该命令要sysdba权限

5). Drop table table_name purge:  删除对象并且不放在Recycle Bin中,即永久的删除,不能用Flashback恢复。

6). Purge index recycle_bin_object_name: 当想释放Recycle bin的空间,又想能恢复表时,可以通过释放该对象的index所占用的空间来缓解空间压力。因为索引是可以重建的。

 

2. Flashback Drop 实例操作

 

下面在系统参数recyclebin=on的时候操作:

1,SQL> drop table test1;

Table dropped.

 

2,查看recyclebin的信息

SQL> col origninal_name format a15;

SQL> col type format a15;

SQL> selectobject_name,original_name,type from user_recyclebin;

 

OBJECT_NAME                    ORIGINAL_NAME                    TYPE

-------------------------------------------------------------- -------

BIN$fR5G/49+SZ2oESrTX4UCHg==$0IDX_TESTID                       INDEX

BIN$x1Ey4hTFSeilywuQ7KKM+w==$0 TEST1                            TABLE

SQL> show recyclebin; --注意这是sqlplus的命令

ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME

---------------------------------------------- ------------ -------------------

TEST1            BIN$x1Ey4hTFSeilywuQ7KKM+w==$0TABLE        2012-01-13:16:35:24

 

3,将删除的表闪回

SQL> flashback table test1 to before drop;

Flashback complete.

SQL> select * from test1;

       ID NAME

---------- ----------

  3763392 A

 

如果出现这样的情况,表test1删除后,一个同名的对象test1(表或者procedure..)被创建,闪回的时候需要重新命名

flashback table test1 to before drop renameto testX

还有一种情况是;同名的表被多次drop到了recyclebin中,这时候遵循后进先出的原则.

一旦完成闪回恢复,Recycle Bin中的对象就消失了.

SQL> selectobject_name,original_name,type from user_recyclebin;

no rows selected

 

在recyclebin被设置为off后不支持flashbacktable drop.

SQL> alter system set recyclebin=off;

System altered.

SQL> drop table test1;

Table dropped.

SQL> selectobject_name,original_name,type from user_recyclebin;

no rows selected

 

Flashback Drop 需要注意的地方:

1). 只能用于非系统表空间和本地管理的表空间

2). 对象的参考约束不会被恢复,指向该对象的外键约束需要重建。

3). 对象能否恢复成功,取决与对象空间是否被覆盖重用。

4). 当删除表时,信赖于该表的物化视图也会同时删除,但是由于物化视图并不会被放入recycle bin,因此当你执行flashback table to before drop 时,也不能恢复依赖其的物化视图,需要dba手工介入重新创建。

5). 对于Recycle Bin中的对象,只支持查询.

 

                    Flashback Table

 

注意SYS用户不支持闪回,这点前面已经说明过。

Flashback Table也是使用UNDOtablespace的内容来实现对数据的回退。该命令相对简单,输入:flashback table table_name to scn(to timestamp) 即可。

注意:如果想要对表进行flashback,必须允许表的row movement.

Alter table table_name row movement;

要查看某表是否启用row movement,可以到user_tables 中查询(或all_tables,dba_tables),

例如:

SQL> select row_movement fromuser_tables where table_name='TEST1';

ROW_MOVE

--------

DISABLED

这时候为不支持行移动.

 

SQL> select current_scn from v$database;

CURRENT_SCN

-----------

   3769840

SQL> delete from test1;

1 row deleted.

SQL> commit;

Commit complete.

SQL> flashback table test1 to scn  3769840;

flashback table test1 to scn  3769840

                *

ERROR at line 1:

ORA-08189: cannot flashback the tablebecause row movement is not enabled

这时候因为不支持行移动,出现上面的错误.

SQL> alter table test1 enable rowmovement;

Table altered.

SQL> flashback table test1 to scn  3769840;

Flashback complete.

SQL> select * from test1;

       ID

----------

        1

Flashback table 命令支持同时操作多个表,表名中间以逗号分隔即可,如果你执行一条flashback table命令时同时指定了多个表,要记住单个flashback table 是在同一个事务中,因此这些表的恢复操作要么都成功,要么都失败。

如:flashback table a,b ,c to scn 1103864;

 

基于undo 的表恢复,需要注意DDL 操作的影响

比如 truncate table 后不能flashback table,会发生错误:ORA-01466:unable to read data -table definition has changed.

其他操作包括:drop/modify 列, move 表, drop 分区(如果有的话), truncate table/partition,这些操作会另undo 表空间中的撤销数据失效,对于执行过这些操作的表应用flashback query 会触发ORA-01466 错误。另外一些表结构修改语句虽然并不会影响到undo 表空间中的撤销记录,但有可能因表结构修改导致undo 中重做记录无法应用的情况,比如对于增加了约束,而flashback query 查询出的undo 记录已经不符合新建的约束条件,这个时候直接恢复显然不可能成功,你要么暂时disable 约束,要么通过适当逻辑,对要恢复的数据进行处理之后,再执行恢复。

另外,flashback query 对v$tables,x$tables 等动态性能视图无效,不过对于dba_*,all_*,user_*等数据字典是有效的。同时该特性也完全支持访问远端数据库,比如select * from tbl@dblink as of scn 360;的形式。

2. 基于undo 的表恢复,flashbacktable 实际上做的也是dml 操作(会在被操作的表上加dml 锁),因此还需要注意triggers 对其的影响,默认情况下,flashback table to scn/timestamp 在执行时会自动disable 掉与其操作表相差的triggers,如果你希望在此期间trigger能够继续发挥做用,可以在flashback table 后附加

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值