闪回技术全了解

闪回技术:
Flashback 技术可以细分以下4种:
Flashback Database,
Flashback Drop,
Flashback Query(分Flashback Query, Flashback Version Query, Flashback Transaction Query 三种)
Flashback Table。
------------------------------------------------------------------
Flashback 技术是oracle 9i中引入的一种技术,
通过Flashback,可以查到过去某个时刻的一致性的数据。
这里的一致性,是通过我们UNDO 表空间的前镜像来实现的。
因此闪回与UNDO 表空间密切相关。
比如UNDO 表空间的大小,保留策略。
如果undo 被覆盖了就不能进行闪回查询。
show parameter undo

-------------------------------------------------------------------
在Oracle 10g中,增强了闪回查询功能,
并且提供了将整个数据库回退到过去某个时刻的能力,
这个功能是通过flashback log实现的。
flashback log有点类似redo log,只不过redo log将数据库往前滚,
flashback log则将数据库往后滚。
为了保存管理和备份恢复相关的文件,
oracle10g提供了一个叫做闪回恢复区(Flashback recovery area),
这个区域默认创建在oracle_base目录下。 可以将所有恢复相关的文件,
比如flashback log,archive log,backup set等,放到这个区域集中管理。


从Oracle 10g开始,在一些动态性能视图里面,
如 ( V$CONTROLFILE, V$LOGFILE, V$ARCHIVED_LOG, V$DATAFILE_COPY 等 )
都新增加了一列:IS_RECOVERY_DEST_FILE ,指明相关的文件是否在恢复区内。

SELECT   recid, blocks, is_recovery_dest_file  FROM   v$archived_log  WHERE   recid < 5;

--------------------------------------------------------------------
Oracle 11g,闪回又出了一个新特性:
Oracle Flashback Data Archive.
FDA通过将变化数据存储到另外创建的闪回归档区(Flashback Archive)中,
这样以和undo区别开来,这样就可以为闪回归档区单独设置存储策略,
也可以闪回到指定时间之前的旧数据而不影响undo策略,就是减少对UNDO的依赖性。
因为在一个很忙的系统,UNDO 保存的时间是有限制的。 但通过FDA,我们就要灵活很多。


设置FRA 参数
show parameter db_recover

如果启用了FRA,那么要注意FRA 空间使用率。 默认归档文件放在FRA里,
如果FRA 空间满了,就没地方归档,数据库会hang住。

alter system set db_recovery_file_dest_size=3G scope=both;


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

create user conan identified by conan;
grant dba,connect,resource to conan;

conn conan/conan;
create table conan as select * from dba_objects;
select count(*) from dba_objects;

alter sesssion set nls_date_format='yyyy-mm-dd hh24:mi:ss';
select sysdate from dual;

delete from conan where rownum<500;
commit;


恢复方法:
1、flashback
2、rman
3、logminer

select count(1) from conan as of timestamp to_timestamp('2013-12-02 16:00:00','yyyy-mm-dd hh24:mi:ss');

insert into ta select * from conan as of timestamp to_timestamp('2013-12-02 16:00:00','yyyy-mm-dd hh24:mi:ss');

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

查询闪回恢复区内容:
select file_type from v$flash_recovery_area_usage;




Flashback Database
如何启用和禁用Flashback Database
数据库的Flashback Database功能缺省是关闭的,要想启用这个功能,就需要做如下配置。
 
(1)配置Flash Recovery Area
(2)启动flashback database
默认情况数据库的flashback database是关闭,可以在mount exclusive状态下打开。在设置了闪回恢复区后,可以启动闪回数据库功能。

select flashback_on from v$database;

--数据库必须已经处于归档模式:
SQL&get; archive log list;    
SQL&get; shutdown immediate;
SQL&get; startup mount;
SQL&get; alter database flashback on;
SQL&get; alter database open;
SQL&get; select flashback_on from v$database;



SQL&get; archive log list;    
SQL&get; shutdown immediate;
SQL&get; startup mount;
SQL&get; alter database flashback on;
SQL&get; alter database open;
SQL&get; select flashback_on from v$database;

---------------------------------------------------------------------
使用Flashback Database 实现对数据库进行不完全恢复的示例

1、检查是否启动了flash recovery area
SQL&get; show parameter db_recovery_file

2、检查是否启用了归档
SQL&get; archive log list;

3、检查是否启用了flashback database
SQL&get; select flashback_on from v$database;

4、查询当前的scn
SQL&get; SELECT CURRENT_SCN FROM V$DATABASE;

select to_char(sysdate,'yy-mm-dd hh24:mi:ss') time from dual;

5、创建表

Create table dba as select * from dba_objects;

Selct count(*) from dba;

6、重启DB 到mount
shutdown immediate
startup mount

7、执行恢复:分timestamp 或者SCN两种

SQL&get; Flashback database to timestamp to_timestamp('12-10-14 14:37:05','yy-mm-dd hh24:mi:ss');
SQL&get; Flashback database to scn 947921;

8、 打开数据库
alter database open resetlogs;
Select count(*) from dba;


Flashback Database

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

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


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

注意:dba_recyclebin只保留非SYSTEM表空间下的对象,
对于SYSTEM表空间的对象,在DROP的时候,也是直接删除,不会放入回收站。
当一个对象drop后,并且开启了回收站功能.它并没有真正被删除,实际上只是修改了一下名字,
我们用select * from user_objects where type= 'TABLE'还能查到.只是它的名字有点怪.

它的命名规范是BIN$unique_id$version  其中BIN代表RecycleBin,
unique_id是数据库中该对象的唯一标志,26个字符长度 ,version表示该对象的版本号.

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

show parameter recycle

表空间的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所占用的空间来缓解空间压力。 因为索引是可以重建的。

10、查看回收站内容

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

select count(1) from dave;
drop table dave;
show recyclebin

查看recyblebin对象里的内容:
SQL&get; select * from "BIN$RWXQQcTPRde0ws4h9ewJcg==$0";

11、Flashback Drop 实例操作

SQL&get; flashback table dave to before drop;

SQL&get; flashback table a to before drop rename to B;

Flashback Drop 需要注意的地方:
1). 只能用于非系统表空间和本地管理的表空间
2). 对象的参考约束不会被恢复,指向该对象的外键约束需要重建。
3). 对象能否恢复成功,取决与对象空间是否被覆盖重用。
4). 当删除表时,信赖于该表的物化视图也会同时删除,但是由于物化视图并不会被放入recycle bin,因此当你执行flashback table to before drop 时,也不能恢复依赖其的物化视图,需要dba 手工介入重新创建。
5). 对于Recycle Bin中的对象,只支持查询.

12、 Flashback Query

Flashback Query 是利用多版本读一致性的特性从UNDO 表空间读取操作前的记录数据。
flashback query对v$tables,x$tables 等动态性能视图无效,但对于dba_*,all_*,user_*等数据字典是有效的。

13、As  of  timestamp 的示例

SQL&get;select * from A as of timestamp to_timestamp('2012-10-15 19:04:16','YYYY-MM-DD hh24:mi:ss');

查看删除之前的状态:假设当前距离删除数据已经有5 分钟左右的话:
SQL&get; select * from A as of timestamp sysdate-5/1440;

14、  As of scn 示例

SCN

查看SCN:
SQL&get;SELECT dbms_flashback.get_system_change_number FROM dual;
SQL&get;SELECT CURRENT_SCN FROM V$DATABASE;
 

 查看删除之前的状态:
SQL&get; select * from A as of scn 1095782;


用Flashback Query恢复之前的数据:
SQL&get; insert into A select * from A as of scn 1095782;

15、 Flashback Query 函数,存储过程,包,触发器等对象

Flashback Drop 可以闪回与表相关联的对象,
如果是其他的对象,比如function,procedure,trigger等。
这时候,就需要使用到ALL_SOURCE 表来进行Flashback Query。
 
查看dba_source 的所有type
SQL&get; select type from dba_source group by type;


SQL&get; CREATE OR REPLACE function getdate return date
as
v_date date;
begin
   select  sysdate into v_date from dual;
   return v_date;
end;
/


SQL&get; alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.
 
SQL&get; select getdate() from dual;


查询dba_source 表:
SQL&get; select text from dba_source where name='GETDATE' order by line;


SQL&get; drop function getdate;

使用我们的Flashback Query 查询:
SQL&get; select text from dba_source as of timestamp to_timestamp('2013-12-02 21:02:09','yyyy-mm-dd hh24:mi:ss') where name='GETDATE' order by line;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17172228/viewspace-1062184/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/17172228/viewspace-1062184/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值