一、Flashback的概念
在Oracle9i数据库中,提出了数据闪回(Flashback)的概念。使用Flashback,可以在不对数据库进行不完全恢复的情况下,对某一个指定的表进行恢复。
所谓Flashback就是使数据库中的实体显示或回到过去的某一时间点,这样可以实现对历史数据的恢复。
二、在Oracle9i中使用Flashback
Ÿ 在Oracle9i中使用包DBMS_FLASHBACK来提供闪回功能。
Ÿ 如果需要用到闪回查询,必须在init.ora或者是spfile.ora中设置以下参数undo_management = auto (默认)
Ÿ 此外,参数undo_retention =n(秒),它决定了能往前闪回的最大时间(Undo最多的保存时间),越大的值,就会需要更多的Undo空间的支持。
SQL>show parameter auto
SQL>alter system set undo_retention=1200; (Undo信息将保持1200秒=20分钟)
注意:Oracle 9i是每五分钟记录一次SCN的,并将SCN和对应时间的映射做个纪录。如果原来插入的记录到做闪回的时间在5分钟之内,用基于时间的flashback可能并查询不到记录,因为如果是基于时间点的查询,也是转化为最近的一次SCN,然后从这个SCN开始进行恢复,因此,如果需要精确的查询,我们可以采用基于SCN的flashback,它将能精确的闪回到需要恢复的时间。
Oracle 9i的Flashback有如下限制。
Ÿ 采用时间点的恢复,不能精确到最近5分钟,如果需要更精确的查询,需要采用SCN。
Ÿ 不能flashback 5天以前的数据,这个并不是undo_retention所能决定的。
Ÿ 闪回查询无法恢复到表结构改变之前,因为闪回查询使用的当前的数据字典。
Ÿ 由于受到undo_retention的影响,对于undo_retention之前的时间,flashback不保证能成功
Ÿ 对于drop,truncate等不记录回滚的操作,flashback是无能为力的。
例子:
1. 创建包DBMS_FLASHBACK
SQL> @?/rdbms/admin/dbmstran.sql
2. 以system用户连接
SQL> conn system/oracle
3. 获得当前的SCN和时间点
SQL> selectdbms_flashback.get_system_change_number() from dual;
DBMS_FLASHBACK.GET_SYSTEM_CHAN
------------------------------
2324682
SQL> selectto_char(sysdate, 'YYYY-MM-DD HH24:MI:SS') from dual;
TO_CHAR(SYSDATE,'YYYY-MM-DDHH2
------------------------------
2007-05-12 16:39:46
SQL> select *from scott.emp;
4.更新记录
SQL>update scott.emp set sal=888;
SQL> commit;
5.基于SCN和时间点查询修改前的情况
SQL>select * from scott.emp as of scn 2324682;
SQL> select *from scott.emp as of timestamp(to_timestamp('2007-05-12 16:39:46', 'yyyy-mm-ddhh24:mi:ss'));
6.使用Flashback功能取消修改
SQL>execute dbms_flashback.enable_at_system_change_number(2324682);
或者
SQL> execdbms_flashback.enable_at_time(to_date('2007-05-12 16:39:46', 'YYYY-MM-DDHH24:MI:SS')) (修改时的时间)
SQL> select *from scott.emp;
注意:现在看到的只是闪回的结果,实际上并未恢复数据。且闪回状态下不能做DML操作。
SQL> deletescott.emp where empno=7369; (出错)
SQL> executedbms_flashback.disable();
SQL> select *from scott.emp;
三、在Oracle10g中使用Flashback
Oracle 10g的Flashback:
Ÿ 可以简单的利用查询语句实现flashback query,而不再需要象9i那样需要调用DBMS_FLASHBACK包
Ÿ 在基于时间上的flashback不再有5分钟的限制了,也可以象SCN一样进行精确的flashback query
在Oracle 10g中,Flashback操作包括以下几个方面:
Ÿ Oracle Flashback Database(数据库闪回)
这个特性允许你通过SQL语句FLASHBACK DATABSE语句,让数据库前滚到当前的前一个时间点或者SCN,而不需要做时间点的恢复。
Ÿ Oracle Flashback Table(表闪回)
这个特性允许你利用SQL语句FLASHBACK TABLE语句,确保回滚到表的前一个时间点。
Ÿ Oracle Flashback Drop(删除闪回)
Oracle 10g开始提供一个类似垃圾站的功能,来恢复不小心被drop的表
Ÿ FlashbackQuery(查询闪回)
Ÿ Oracle Flashback Version Query
利用保存的回滚信息,你可以看到特定的表在时间段内的任何修改,如电影的回放一样,你将了解表在该期间的任何变化
Ÿ Oracle Flashback TransactionQuery
这个特性将确保您检查数据库的任何改变在一个事务级别。你可以利用它来诊断问题,性能分析和审计事务
1.查询闪回(Flashback Query)(10g新增)
SQL> conn scott/tiger
SQL> create table emp2 as select * fromemp;
SQL> select to_char(sysdate, 'YYYY-MM-DDHH24:MI:SS') from dual;
上面语句获取当前时间,如2007-05-12 13:22:33
SQL> select * from emp2;
SQL> delete from emp2;
SQL> commit;
SQL> select * from emp2 as of timestampto_timestamp('2007-05-12 13:22:33', 'YYYY-MM-DD HH24:MI:SS');
注意:flashback query查询以前的一个快照点,并不改变当前表的状态
2.表闪回(Flashback Table)
Oracle 10g的flashback table有如下特性:
Ÿ 在线操作
Ÿ 恢复到指定时间点或者SCN的任何数据
Ÿ 自动恢复相关属性,如索引,触发器等
Ÿ 满足分布式的一致性
Ÿ 满足数据一致性,所有相关对象将自动一致
语法为:
Ÿ flashback table employee to scn123456;
Ÿ flashback table t1 to timestampto_timestamp('2003-03-03 12:05:00', ‘YYYY-MM-DD HH24:MI:SS’) [enable trigger]s;
其中enable triggers表示触发器恢复之后为enable状态,而默认为disable状态。
注意:如果需要flashback一个表,需要保证
l 有flashback any table的系统权限或者是该表的flashback对象权限
l 有该表的SELECT,INSERT,DELETE,ALTER权限
l 必须保证该表ROW MOVEMENT
例子:
SQL> alter table emp2 enablerow movement;
SQL> flashback table emp2 totimestamp to_timestamp('2007-05-12 13:22:33', 'YYYY-MM-DD HH24:MI:SS');
SQL> flashback table emp2 to beforedrop rename to emp3;
执行delete操作的表是可以恢复的,而执行truncate操作的表是不可以恢复的,这是因为flashback table利用undo进行的
3.删除闪回(Flashback drop)
SQL> drop table emp2;
SQL> show recyclwbin
SQL> flashback table emp2 to before drop;
4.数据库闪回(Flashback Database)
闪回数据库可以迅速的使数据库回到误操作或人为错误的前一个时间点,如实际中的“撤消”操作,将可以不利用备份就快速地实现时间点的恢复。实际上,Oracle为了实现这一个功能,创建了另外一组日志,就是Flashback Logs(前滚日志),记录数据库的前滚操作。
Flashback Database的前提条件:
(1)数据库必须处于ARCHIVELOG模式
(2)数据库必须具有flash recovery area,为此需要设置如下参数:
Ÿ DB_RECOVER_FILE_DEST:确定Flashback日志的存放地点
Ÿ DB_RECOVER_FILE_DEST_SIZE:确定Flashback日志恢复区的大小
Ÿ DB_FLASHBACK_RETENTION_TARGET:设定闪回数据的保存时间,单位是分钟。默认是1440分钟(一天)
(3)对于RAC数据库,flash recovery area必须存储在集群文件系统或ASM内
常见flashback database命令
SQL> flashback databaseto timestamp to_date(xxx);
SQL> flashback database to timestampTO_TIMESTAMP (xxx);
SQL> flashback database to scnxxx;
SQL> flashback database to sequencexxx thread 1
SQL> flashback databaseto timestamp(sysdate-1/24)
例子:
(1)启用flashback log和归档模式
SQL> shutdown immediate
SQL> startup mount;
SQL> alter database archivelog
SQL> alter database flashbackon;
SQL> alter database open;
(2)获取当前的SCN
SQL> select current_scn from v$database; -- 查看当前的SCN
CURRENT_SCN
-----------
1237617
(3)模拟故障(截断scott.emp)
SQL> truncate table scott.emp;
(4)完成FLASHBACKDATABASE(必须在mount状态下)
SQL> shutdown immediate
SQL> startup mount;
SQL> flashback database to scn1237617;
(5)使用resetlogs方式打开数据库
SQL> alter database open resetlogs;
(6)测试flashbackdatabase是否成功
SQL> conn scott/tiger
SQL> select * from emp;
5.flash version query
flashbackversion query提供了一个审计行改变的功能,它能找到一段时间内(由undo_retention决定)所有已经提交了的行的记录。flashback version query一样依赖于AUM。flashbackversion query采用VERSIONSBETWEEN语句来进行查询,常用的有
·VERSIONS_SCN – 系统改变号
·VERSIONS_TIMESTAMP – 时间戳
SQL> selectversions_starttime, versions_endtime, versions_xid, versions_operation, sal fromemp2 versions between timestamp minvalue andmaxvalue order by versions_starttime;
SQL> select sal fromemp2 versions between timestamp to_date('2007-05-12 23:00:33', 'YYYY-MM-DD HH24:MI:SS') and to_date('2007-05-12 23:05:33', 'YYYY-MM-DD HH24:MI:SS');
说明1:列versions_starttime、versions_endtime、versions_xid、versions_operation 是伪列。其他伪列 — 如versions_startscn和versions_endscn — 显示了该时刻的系统更改号。列 versions_xid 显示了更改该行的事务标识符。
说明2:如果出现ORA-30052: invalid lower limit snapshotexpression,是因为超过了undo_retention的范围。如果没有修改初始是900秒。
6.flashback transactionquery
Ÿ flashback transaction query其实是flashback version query查询的一个扩充。
Ÿ flashback version query可以审计一段时间内(由undo_retention决定)表的所有改变,但是也仅仅是能发现问题,对于错误的事务,没有好的处理办法。
Ÿ 但是,flashback transaction query从视图FLASHBACK_TRANSACTION_QUERY中获得事务的历史以及Undo_sql,也就是说,可以审计一个事务到底做了什么,甚至可以回滚一个已经提交的事务。
例子:
SQL> conn scott/tiger
SQL> set time on
23:30:37 SQL>updateemp2 set sal = 1000 where empno=7369;
23:32:21 SQL> conn / as sysdba
23:33:27 SQL>selectversions_xid, versions_operation from scott.emp2 versions between timestampto_date('2007-05-12 23:30:37', 'YYYY-MM-DD HH24:MI:SS') and maxvalue whereversions_xid is not null order by versions_starttime;
VERSIONS_XID VERSIONS_OPERATION
----------------------------------
0400160030020000U
23:36:15 SQL>selectundo_sql from flashback_transaction_query where xid='0400160030020000';
如果想回滚这个事务,可以执行undo_sql字段存储的SQL语句即可。
说明:需要从FLASHBACK_TRANSACTION_QUERY获得数据,关键问题是获得事务XID。
7.显示回收站的内容(RecycleBin)
SQL> show recyclebin(显示回收站的内容)
SQL> select * fromrecyclebin; (查询回收站的详细信息)
SQL> select * from user_recyclebin;
SQL> select * from dba_recyclebin;
8.删除Recyclebin的内容
SQL> purge table t1;(删除RecycleBin中的表t1)
SQL> purgerecyclebin;