1、Oracle 闪回特性(FLASHBACK DATABASE) -- Oracle 闪回特性(FLASHBACK DATABASE) --===================================== 闪回技术通常用于快速简单恢复数据库中出现的认为误操作等逻辑错误,从闪回的方式可以分为基于数据库级别闪回、表级别闪回、事务 级别闪回,根据闪回对数据的影响程度又可以分为闪回恢复,闪回查询。闪回恢复将修改数据,闪回点之后的数据将全部丢失。而闪回查询则可 以查询数据被DML的不同版本,也可以在此基础之上确定是否进行恢复等。本文主要描述flashback database的
2、使用。 一、flashback database特性 flashback data1base闪回到过去的某一时刻 闪回点之后的工作全部丢失 使用resetlogs创建新的场景并打开数据库(一旦resetlogs之后,将不能再flashback至resetlogs之前的时间点) 常用的场景:truncate table、多表发生意外错误等 使用闪回日志来实现数据库闪回,闪回点之后的数据将丢失 二、flashback database的组成 闪回缓冲区:当启用flashback database,则sga中会开辟一块新区域作为闪回缓冲区,大小由系统分配
3、 启用新的rvwr进程:rvwr进程将闪回缓冲区的内容写入到闪回日志中,注意闪回日志不同于联机重做日志,闪回日志在联机重做日志基础之 上生成,是完整数据块映像的日志。联机日志则是变化的日志。闪回日志不能复用,也不能归档。闪回日志使用循环写方式。 三、flashback database的配置 flashback database要求数据库必须处于归档模式,且闪回之后必须使用resetlogs打开数据库 a.查看数据库的归档模式及闪回是否启用 SQL> select log_mode,open_mode,flashback_on from v$databas
4、e; LOG_MODE OPEN_MODE FLASHBACK_ON ------------ ---------- ------------------ ARCHIVELOG READ WRITE NO --FLASHBACK_ON为NO,则表示闪回特性尚未启用 b.查看及设置闪回目录、闪回目录空间大小等 --下面查看恢复目录及恢复目路分配的大小 --可以使用alter system set db_recovery_file_dest 来设置新路径 --可以使用alter system set db_r
5、ecovery_file_dest_size来设定新的大小 SQL> show parameter db_recovery NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_recovery_file_dest string /u01/app/oracle/flash_recovery
6、 _area db_recovery_file_dest_size big integer 2G c.设置闪回保留目标生存期 SQL> show parameter db_flashback --缺省为分钟,即小时 NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_flas
7、hback_retention_target integer 1440 SQL> alter system set db_flashback_retention_target=30; --设定保留时间为半小时 d.在mount状态下来启用flashback,如在open状态下则出现下列错误提示 SQL> alter database flashback on; alter database flashback on * ERROR at line 1: ORA-38759: Database must be m
8、ounted by only one instance and not open. --一致性关闭数据库后,在mount状态下设置flashback SQL>startup mount exclusive; SQL> select status from v$instance; STATUS ------------ MOUNTED SQL> alter database flashback on; --开启闪回数据库功能 SQL> ho ps -ef | grep rvw
9、可以看到新增了后台进程rvwr oracle 3563 1 0 12:12 ? 00:00:00 ora_rvwr_orcl --下面查看闪回区分配的大小为大约M,闪回分钟以内的数据则需要M左右的空间 --注意列oldest_flashback_time说明了允许返回的最早的时间点 SQL> select oldest_flashback_scn old_flhbck_scn,oldest_flashback_time old_flhbck_tim, 2 retention_target rete_trgt,flash
10、back_size/1024/1024 flhbck_siz, 3 estimated_flashback_size/1024/1024 est_flhbck_size 4 from v$flashback_database_log; OLD_FLHBCK_SCN OLD_FLHBC RETE_TRGT FLHBCK_SIZ EST_FLHBCK_SIZE -------------- --------- ---------- ---------- --------------- 915137 24-OCT-10 30
11、 7.8125 11.2519531 SQL> select * from v$flashback_database_stat; --查看闪回 BEGIN_TIM END_TIME FLASHBACK_DATA DB_DATA REDO_DATA ESTIMATED_FLASHBACK_SIZE --------- --------- -------------- ---------- ---------- ------------------------ 24-OCT-10 24-OCT-10 7905280 8
12、6802432 96329728 0 SQL> select * from v$sgastat where name like 'flashback%'; --查看sga中分配的闪回空间大小 POOL NAME BYTES ------------ -------------------------- ---------- shared pool flashback generation buff 3981204
13、 shared pool flashback_marker_cache_si 9196 SQL> ho ls -hlt $ORACLE_BASE/flash_recovery_area/ORCL/flashback --查看生成的闪回日志 total 7.9M -rw-r----- 1 oracle oinstall 7.9M Oct 24 12:37 o1_mf_6d7dkogw_.flb 四、使用flashback database闪回数据库 步骤(前提归档日志可用) 关闭数据库 启动数据库到mount状态(exclusi
14、ve模式)
闪回至某个时间点,SCN或log sequence number
使用resetlogs打开数据库
1.使用sqlplus实现闪回
可以接受一个时间标记或一个系统改变号实参
sqlplus几种常用的闪回数据库方法
FLASHBACK [STANDBY] DATABASE [
15、P
16、hback database ro restore point b1_load; a.基于时间戳闪回 SQL> select count(1) from usr1.tb1; --查询用户usr1下表tb1中的记录数 COUNT(1) ---------- 404944 SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') tm from dual; --获得系统当前的时间 TM ------------------- 2010-10
17、24 13:04:30 SQL> drop user usr1 cascade; --删除帐户usr1,同时帐户usr1下的所有对象将被删除 SQL> conn scott/tiger; --使用scott 帐户登陆 SQL> create table tb_emp as select * from emp; --新创建表tb_emp SQL> shutdown immediate; --关系系统 SQL> startup mount ; --重新到mou
18、nt状态 SQL> flashback database to timestamp --实施闪回 2 to_timestamp('2010-10-24 13:04:30','yyyy-mm-dd hh24:mi:ss') ; SQL> alter database open resetlogs; SQL> select count(1) from usr1.tb1; --帐户usr1及其对象tb1被成功闪回 COUNT(1) ---------- 404944 SQ
19、L> select count(1) from scott.tb_emp; --闪回成功后,在闪回点之后修改的数据全部丢失 select count(1) from scott.tb_emp * ERROR at line 1: ORA-00942: table or view does not exist b.基于SCN号闪回 SQL> select current_scn from v$database; --获得当前的SCN号 CURRENT_SCN -----------
20、 918987 SQL> drop table usr1.tb1; --删除用户usr1下的表tb1 SQL> alter system checkpoint; --手动执行检查点 SQL> select file#,checkpoint_change# from v$datafile; FILE# CHECKPOINT_CHANGE# ---------- ------------------ 5 921478 SQL> shutdown abort
21、 SQL> startup mount; SQL> flashback database to scn 918987; SQL> select count(1) from usr1.tb1; COUNT(1) ---------- 404944 c.基于时点闪回 SQL> create table t(id int,col varchar2(20)); --创建表t SQL> insert into t values(1,'ABC'); SQL> inser
22、t into t values(2,'DEF'); SQL> commit; SQL> create restore point bef_damage; --创建闪回点 SQL> insert into t values(3,'GHI'); SQL> select ora_rowscn,id,col from t; --查看表t的记录 ORA_ROWSCN ID COL ---------- ---------- -------------------- 1874406
23、 1 ABC 1874406 2 DEF 1874406 3 GHI SQL> shutdown immediate; SQL> startup mount exclusive; SQL> flashback database to restore point bef_damage; --实施时点闪回 SQL> alter database open resetlogs; SQL> select * from t; --闪
24、回成功后,闪回点之后的数据丢失 ID COL ---------- -------------------- 1 ABC 2 DEF 2.使用RMAN进行flashback database 使用RMAN进行闪回数据库的几种常用办法 RMAN> flashback database to scn=918987; RMAN> flashback database to sequence=85 thread=1; SQL> create table scott.tb_emp as select * from sc
25、ott.emp; SQL> select count(1) from scott.tb_emp; COUNT(1) ---------- 14 SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') tm from dual; TM ------------------- 2010-10-24 13:59:38 SQL> drop table scott.tb_emp; SQL> shutdown abort; SQL> star
26、tup mount; RMAN> flashback database 2> to time="to_date('2010-10-24 13:59:00','yyyy-mm-dd hh24:mi:ss')"; SQL> select count(1) from scott.tb_emp; COUNT(1) ---------- 14 查询视图:v$recovery_file_dest将显示闪回区的使用情况 SQL> select name,space_limit/1024/1024 sp_limt 2
27、 ,space_used/1024/1024 sp_usd,space_reclaimable/1024/1024 sp_recl, 3 number_of_files num_fils from v$recovery_file_dest; NAME SP_LIMT SP_USD SP_RECL NUM_FILS --------------------------------------------- ---------- ---------- ----
28、 ---------- /u01/app/oracle/flash_recovery_area 2048 472.070313 380.671875 18 可以将某些表空间排除在闪回之外 SQL> alter tablespace users flashback off; SQL> select name,flashback_on from v$tablespace where ts#=4; NAME FLA --------------- ---
29、 USERS NO 如果需要对上述表空间启用闪回功能,则需要在mount模式下对该表空间进行开启该功能。 五、总结 闪回策略是针对Oracle撤销功能的增强,为快速恢复数据库提供了更多的便利。数据库的闪回恢复的速度要快于RMAN以及基于用户管理的备份与恢复,其主要原因是因为数据库闪回使用的是闪回日志,而闪回日志中保存的是数据块的完整镜像。其次闪回能够恢复的程度取决于闪回空间的大小以及闪回的保留策略,闪回空间大小会被循环使用,而闪回的保留策略则决定了闪回日志保留的时间长度。总之,合理的平衡恢复速度与可用空间依赖于具体服务要求. Oracle 闪回特
30、性(FLASHBACK DROP & RECYCLEBIN) -- Oracle 闪回特性(FLASHBACK DROP & RECYCLEBIN) --============================================== FLASHBACK DROP 特性允许在不丢失任何数据库的情况下将指定的表恢复至其被删除的时间点,并保持数据库为当前状态。闪回删除并不是 真正的删除表,而是把该表重命名并放入回收站,类似于Windows的回收站一样。当某个活动对象需要使用该表所占用的空间时,该表才会被真 正删除。只要空间未被复用,该表即可恢复。本文主要讲述了FLAS
31、HBACK DROP特性以及闪回特性中回收站(RECYCLEBIN)的管理。 一、FLASHBACK DROP 的功能 将先前删除的表恢复到删除之前的状态 恢复该表的索引以及触发器,授权 恢复该表的约束,包括唯一约束、主键约束、非空约束。外键约束不可恢复 可以实现基于系统和基于会话的flash drop操作 alter system set recyclebin = on | off; alter session set recyclebin = on | off; drop table(oracle 10g)命令并不真正删除表,在内部被映射为re
32、name命令,即是将其重命名之后放入回收站。 二、理解表重名的过程 scott@ORCL> create table tb_emp as select * from emp; --基于emp表来创建表tb_emp scott@ORCL> alter table tb_emp add constraint empno_pk --添加主键约束,将产生主键索引 2 primary key(empno); scott@ORCL> alter table tb_emp add constraint ename_uk --添加唯一约
33、束,将产生唯一索引 2 unique(ename); scott@ORCL> alter table tb_emp add constraint sal_ck check(sal>0); --添加check约束 scott@ORCL> alter table tb_emp modify job constraint job_nn not null; --添加非空约束 scott@ORCL> alter table tb_emp add constraint dept_fk --添加外键约束 2 f
34、oreign key(deptno) references dept(deptno) on delete cascade; scott@ORCL> select constraint_name,constraint_type --查看tb_emp表上的所有约束 2 from user_constraints where table_name='TB_EMP'; CONSTRAINT_NAME C --------------- - EMPNO_PK P ENAME_UK U SAL_CK
35、 C JOB_NN C DEPT_FK R --下面查看表tb_emp所在文件的id,块的起始id,大小,以及该对象的对象id等 sys@ORCL> select file_id,block_id,bytes from dba_extents where segment_name='TB_EMP'; FILE_ID BLOCK_ID BYTES ---------- ---------- ---------- 4 393 65536 sys@OR
36、CL> select object_name,object_id from dba_objects --查看表tb_emp的对象ID 2 where object_name = 'TB_EMP'; OBJECT_NAME OBJECT_ID -------------------- ---------- TB_EMP 54493 --对表进行重命名 scott@ORCL> alter table tb_emp rename to tb_employees; sys@ORCL>
37、select file_id,block_id,bytes from dba_extents --重命名后所在文件的id,块的起始id,大小没有发生变化 2 where segment_name='TB_EMPLOYEES'; FILE_ID BLOCK_ID BYTES ---------- ---------- ---------- 4 393 65536 sys@ORCL> select object_name,object_id from dba_objects --重命名后对象ID没有发生
38、变化 2 where object_name = 'TB_EMPLOYEES'; OBJECT_NAME OBJECT_ID -------------------- ---------- TB_EMPLOYEES 54493 scott@ORCL> select index_name,index_type --重命名后索引和约束也没有发生变化 2 from user_indexes where table_name='TB_EMPLOYEES' 3 union a
39、ll 4 select constraint_name,constraint_type 5 from user_constraints where table_name='TB_EMPLOYEES'; INDEX_NAME INDEX_TYPE ------------------------------ --------------------------- EMPNO_PK NORMAL ENAME_UK NORMAL
40、 EMPNO_PK P ENAME_UK U SAL_CK C JOB_NN C DEPT_FK R 从上面的演示可以看出对于表的重命名仅仅是修改了表名,而对于表对象的ID,以及表存放的位置,块的起始,大小等并未发生实质性的变化 三、删除表并实施闪回 1.删除表tb_employees并查看回收站的信息 scott@ORCL> d
41、rop table tb_employees; scott@ORCL> select object_name,original_name,can_undrop, 2 base_object from user_recyclebin; OBJECT_NAME ORIGINAL_NAME CAN BASE_OBJECT ------------------------------ -------------------------------- --- -----------
42、 BIN$k1zC3yEiwZvgQAB/AQBRVw==$0 TB_EMPLOYEES YES 54493 BIN$k1zC3yEhwZvgQAB/AQBRVw==$0 ENAME_UK NO 54493 BIN$k1zC3yEgwZvgQAB/AQBRVw==$0 EMPNO_PK NO 54493 scott@ORCL> select count(1) from "BIN$k1zC3yEiwZvgQAB/AQBRVw==$0"
43、 --可以使用回收站名来访问对象,但要对对象加双引号 COUNT(1) ---------- 13 2.实施闪回并查看闪回后的情况 scott@ORCL> flashback table tb_employees to before drop; --进行闪回 Flashback complete. scott@ORCL> select count(1) from tb_employees; --闪回后表存在并且可以访问 COUNT(1) ----------
44、13 scott@ORCL> select index_name,index_type --查看闪回后索引,约束的情况,发现其名称仍然为BIN$名称 2 from user_indexes where table_name='TB_EMPLOYEES' 3 union all 4 select constraint_name,constraint_type 5 from user_constraints where table_name='TB_EMPLOYEES'; INDEX_NA
45、ME INDEX_TYPE ------------------------------ --------------------------- BIN$k1zC3yEgwZvgQAB/AQBRVw==$0 NORMAL BIN$k1zC3yEhwZvgQAB/AQBRVw==$0 NORMAL BIN$k1zC3yEcwZvgQAB/AQBRVw==$0 P BIN$k1zC3yEdwZvgQAB/AQBRVw==$0 U BIN$k1zC3yEewZvgQAB/AQBRVw==$0 C BIN$k1zC3yE
46、fwZvgQAB/AQBRVw==$0 C 从上面的查询可以看出闪回之后索引约束的名字还是使用了以BIN开头,由系统生成的名字,可以将其改回,但外键约束已经不存在了。 3.尝试对表DML操作 scott@ORCL> insert into tb_employees(empno,ename,job,sal,deptno) 2 select 9999,'Robinson','DBA',3000,50 from dual; 1 row created. --可以成功插入,deptno列的外键约束已经被删除,故deptno为号成功插入
47、 scott@ORCL> alter index "BIN$k1zC3yEgwZvgQAB/AQBRVw==$0" rename to EMPNO_PK; Index altered. --将BIN开头的索引改回原来的名字,其余的约束名修改在此省略 4.下面演示表空间不足时无法闪回表删除的问题 sys@ORCL> select tablespace_name,sum(bytes/1024/1024) ||' M' 2 from dba_free_space where tablespace_name='TBS1' 3 gro
48、up by tablespace_name; --表空间tbs1的可用空间为M TABLESPACE_NAME SUM(BYTES/1024/1024)||'M' ------------------------------ --------------------------------- TBS1 .9375 M flasher@ORCL> create table tb1 tablespace tbs1 as select * from dba_objects
49、 2 where rownum < 6000; sys@ORCL> select tablespace_name,sum(bytes/1024/1024) ||' M' 2 from dba_free_space where tablespace_name='TBS1' 3 group by tablespace_name; --在该表空间创建表tb1之后,可用空间为.25M TABLESPACE_NAME SUM(BYTES/1024/1024)||'M' -------------------
50、 --------------------------------- TBS1 .25 M flasher@ORCL> drop table tb1; --将表tb1删除 flasher@ORCL> show recyclebin; --删除后的对象位于回收站中 ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME ---------------- ------------------






