您的位置:首页 > 数据库 > Oracle

利用oracle flashback技术恢复数据之 ――事务级别闪回

2013-04-17 02:47 597 查看
 利用oracle flashback技术恢复数据之 ——事务级别闪回 Oracle从9i版本就将flashback技术引入到数据库中,在10g以后,闪回的性能更为完善强大,可以恢复除了文件损坏、介质错误等故障外所有的数据。 Flashback可恢复的级别有4种。分别为:事务闪回(可对具体的insert、delete、update等操作进行恢复)、行级闪回(针对错误操作,可恢复到具体的某个时间点) http://www.ningbo2000.com 、表级闪回(可将错误的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操作回滚的操作以及原理都是一致的,就不再做测试了。 本文出自 “greetwin” 博客,请务必保留此出处http://greetwin.blog.51cto.com/6238812/1178881 http://www.fpfuzhou.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: