利用oracle flashback技术恢复数据之
——事务级别闪回
Oracle从9i版本就将flashback技术引入到数据库中,在10g以后,闪回的性能更为完善强大,可以恢复除了文件损坏、介质错误等故障外所有的数据。
Flashback可恢复的级别有4种。分别为:事务闪回(可对具体的insert、delete、update等操作进行恢复)、行级闪回(针对错误操作,可恢复到具体的某个时间点)、表级闪回(可将错误的drop表操作进行恢复)、数据库级闪回(能将错误的导入的多个表数据恢复到某个时间点)。
下面进行实例测试:
SQL> select * from dept order by deptno;
DEPTNO DNAME LOC
---------- -------------------- --------------------
10 test guangzhou
20 a beijing
30 b shanghai
40 c shenzhen
50 d shenzhen
由上可知:目前dept部门表中有5个部门。接下来向dept表中插入新数据。
SQL> insert into dept values(60,'e','xianggang');
1 row created.
SQL> insert into dept values(70,'f','shandong');
1 row created.
接下来查看一下表中是否有新部门添加。
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------------- --------------------
60 e xianggang
20 a beijing
70 f shandong
40 c shenzhen
30 b shanghai
10 test guangzhou
50 d shenzhen
7 rows selected。
由上可看到表中已经有新部门添加。接下来查看一下是否有可恢复的数据。
SQL> set line 500;
SQL> select versions_starttime, versions_endtime, versions_xid,versions_operation from dept versions between timestamp minvalue and maxvalue;
VERSIONS_STARTTIME VERSIONS_ENDTIME VERSIONS_XID V
--------------------------------------------------------------------------- --------------------------------------------------------------------------- ---------------- -
由上可知:目前没test用户的可闪回的数据。 原因是什么呢
我们继续做一个测试。先将原本插入的数据提交。然后再查看可闪回的数据信息。
SQL> commit;
Commit complete.
SQL> select versions_starttime, versions_endtime, versions_xid,versions_operation from dept versions between timestamp minvalue and maxvalue;
VERSIONS_STARTTIME VERSIONS_ENDTIME VERSIONS_XID V
--------------------------------------------------------------------------- --------------------------------------------------------------------------- ---------------- -
27-MAR-13 09.10.55 AM 0100020052010000 I
27-MAR-13 09.10.55 AM 0100020052010000 I
由上可知:更新数据必须要commit提交之后,才能使用flashback功能。由上图可知:0100020052010000 为操作数据的xid,I为insert的意思。
接下来根据xid可以查询到可供回滚的undo sql语句。此处要注意:查询回滚语句必须在sys或者system用户下执行。
SQL> conn / as sysdba;
Connected.
SQL> select undo_sql from flashback_transaction_query where xid=hextoraw ('0100020052010000');
UNDO_SQL
----------------------------------------------------------------------------------------------------
delete from "TEST"."DEPT" where ROWID = 'AAAD9HAAEAAAAAKAAD';
delete from "TEST"."DEPT" where ROWID = 'AAAD9HAAEAAAAAKAAB';
然后执行红字部分的undo_sql语句。
SQL> delete from "TEST"."DEPT" where ROWID = 'AAAD9HAAEAAAAAKAAD';
1 row deleted.
SQL> delete from "TEST"."DEPT" where ROWID = 'AAAD9HAAEAAAAAKAAB';
1 row deleted.
SQL> select * from test.dept;
DEPTNO DNAME LOC
---------- -------------------- --------------------
20 a beijing
40 c shenzhen
30 b shanghai
10 test guangzhou
50 d Shenzhen
看一下默认可回滚的数据的时间。
SQL> conn / as sysdba;
Connected.
SQL> show parameter undo;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
由上可知默认是可回滚900秒内误操作的数据。
可回滚的时间15分钟时间太短,可根据实际需要修改时间值。
SQL> alter system set undo_retention=9000 scope=spfile;
System altered.
SQL> startup force
ORACLE instance started.
Total System Global Area 473956352 bytes
Fixed Size 1262452 bytes
Variable Size 188746892 bytes
Database Buffers 281018368 bytes
Redo Buffers 2928640 bytes
Database mounted.
Database opened.
SQL> show parameter undo_retention;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_retention integer 9000
上可知:可回滚时间已修改为150分钟。当然前提是还原表空间要足够大。如果还原表空间是自动管理配置,而且还原表空间足够大,那么undo_retention参数的值并不会影响到数据恢复,如果要恢复的数据很大,能恢复的数据会按照先入先出原则进行覆盖。
以上实验只测试了insert操作,delete,update操作回滚的操作以及原理都是一致的,就不再做测试了。