Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6271015
  • 博文数量: 2759
  • 博客积分: 1021
  • 博客等级: 中士
  • 技术积分: 4091
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-11 14:14
文章分类

全部博文(2759)

文章存档

2019年(1)

2017年(84)

2016年(196)

2015年(204)

2014年(636)

2013年(1176)

2012年(463)

分类: Oracle

2013-09-02 09:45:53

原文地址:oracle flashback学习笔记 作者:deargentle

Flashback用于恢复用户误删除的对象(包括表,索引等), 不支持sys用户. system表空间下的对象,也不能从回收站里拿到。
故使用SYS 或者SYSTEM用户登陆时, show recyclebin 为空。

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

SQL> show parameter recycle

NAME                    TYPE        VALUE

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

buffer_pool_recycle            string

db_recycle_cache_size         big integer 0

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中。

SQL> drop table name purge;


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

 

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

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

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

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

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

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

 


2. Flashback Drop 实例操作

SQL> select original_name,object_name from recyclebin;

ORIGINAL_NAME                    OBJECT_NAME

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

A                                BIN$RWXQQcTPRde0ws4h9ewJcg==$0

 

SQL> flashback table a to before drop;

闪回完成。

 

SQL> select * from a;

        ID

 

         ----------

 

         1

 

         2

 

         3

 

当我们删除表A后,在新建表A,这时在恢复的时候就会报错,此时我们在闪回时,对表重命名就可以了:

 

SQL> drop table a;

表已删除。

 

SQL> create table a

  2  (id number(1));

 

表已创建。

 

SQL> flashback table a to before drop ; 

flashback table a to before drop

 

*

 

1 行出现错误:

 

ORA-38312: 原始名称已被现有对象使用

 

SQL> flashback table a to before drop rename to B;

闪回完成。

 

SQL> select * from B;

 

        ID

 

        ----------

 

         1

 

         2

 

         3

 

当我们删除表A,在新建表A,在删除它,这是在Recycle Bin中就会有2个相同的表明,此时恢复我们就要指定object_name才行.

 

SQL> select * from B;

 

        ID

 

        ----------

 

         1

 

         2

 

         3

 

SQL> drop table B;

表已删除。

 

SQL> create table B(name varchar(20));

表已创建。

 

SQL> drop table B;

表已删除。

 

SQL> select original_name,object_name from recyclebin;

ORIGINAL_NAME                    OBJECT_NAME

 

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

 

B                                BIN$vYuv+g9fTi2exYP9X2048Q==$0

 

B                                BIN$geQ9+NekSjuRvzG+TqDVWw==$0

 

SQL> flashback table "BIN$vYuv+g9fTi2exYP9X2048Q==$0" to before drop;

闪回完成。

 

SQL> select * from B;

 

        ID

 

       ----------

 

         1

 

         2

 

         3

 

一旦完成闪回恢复,Recycle Bin中的对象就消失了. Flashback Drop 需要注意的地方:

 

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

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

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

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

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

 

在执行完flashback database 命令之后,oracle 提供了两种方式让你修复数据库:

1). 直接alter database open resetlogs 打开数据库,当然,指定scn 或者timestamp 时间点之后产生的数据统统丢失。

2). 先执行alter database open read only 命令以read-only 模式打开数据库,然后立刻通过逻辑导出的方式将误操作涉及表的数据导出,再执行recover database 命令以重新应用数据库产生的redo,将数据库修复到flashback database 操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。 

 

Oracle 在内部都是使用scn,即使你指定的是as of timestamporacle 也会将其转换成scn,系统时间标记与scn 之间存在一张表,即SYS 下的SMON_SCN_TIME

SQL> desc sys.smon_scn_time

 名称                       是否为空? 类型

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

 THREAD                               NUMBER

 TIME_MP                              NUMBER

 TIME_DP                              DATE

 SCN_WRP                             NUMBER

 SCN_BAS                              NUMBER

 NUM_MAPPINGS                       NUMBER

 TIM_SCN_MAP                         RAW(1200)

 SCN                                   NUMBER

 ORIG_THREAD                         NUMBER

每隔5 分钟,系统产生一次系统时间标记与scn 的匹配并存入sys.smon_scn_time 表,该表中记录了最近1440个系统时间标记与scn 的匹配记录,由于该表只维护了最近的1440 条记录,因此如果使用as of timestamp 的方式则只能flashback 最近5 天内的数据(假设系统是在持续不断运行并无中断或关机重启之类操作的话)。

注意理解系统时间标记与scn 的每5 分钟匹配一次这句话,举个例子,比如scn:339988,339989 分别匹配08-05-3013:52:00 2008-13:57:00,则当你通过as of timestamp 查询08-05-30 13:52:00 08-05-30 13:56:59 这段时间点内的时间时,oracle 都会将其匹配为scn:339988 undo 表空间中查找,也就说在这个时间内,不管你指定的时间点是什么,查询返回的都将是08-05-30 13:52:00 这个时刻的数据。

查看SCN timestamp 之间的对应关系:

select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss')from sys.smon_scn_time; 

 

SQL> alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss";

会话已更改。

SQL> select sysdate from dual;

SYSDATE

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

2009-10-15 21:17:47


使用dba_recyclebin和user_recyclebin分别可以看到整个数据库和当前用户对象的回收站。

undo表空间能够确保undo中的数据在undo_retention指定时间过期前一定有效,就是为undo表空间指定RetentionGuarantee,指定之后,oracle对于undo表空间中未过期的undo数据不会覆盖,例如:
SQL>Altertablespaceundotbs1retentionguarantee;
如果想禁止undo表空间retentionguarantee,如例:
SQL>Altertablespaceundotbs1retentionnoguarantee;


表被删除之后,又执行过创建同名表的操作,因此恢复的时候就会报错,怎么办呢,用renameto.....
JSSWEB>flashbacktablejss_tb3tobeforedroprenametojss_tb3_bak;
闪回完成


基于recyclebin的表恢复,被恢复的表的关联对象,比如其索引啦,约束的名称不会自动恢复成删除前的名称,而是系统自动生成的名称,如果你对表的索引约束有相关命名规范,那在恢复表之后,需要dba手工将索引约束等改名。
当删除表时,信赖于该表的物化视图也会同时删除,但是由于物化视图并不会被放入recyclebin,因此当你执行flashbacktabletobeforedrop时,也不能恢复依赖其的物化视图,需要dba手工介入重新创建

阅读(423) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~