记一次在非归档模式下的Oracle数据库用闪回操作恢复表和DML语句
最近看DBA相关的书,其中有一句话说的很好:一切的备份都是为了恢复 具体测试场景:Flashback闪回table和DML语句 首先书里写了,只要查询 首先建立一张表 之后我们执行 SQL> show parameter bin NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ cursor_bind_capture_destination string memory+disk recyclebin string on 之后我们 SQL> select * from testlijian; select * from testlijian ORA-00942: 表或视图不存在 我们现在执行 SQL> select * from testlijian; select * from testlijian ORA-00942: 表或视图不存在 SQL> flashback table testlijian to before drop; Done SQL> select * from testlijian; NAME -------------------------------------------------- lijian3 wangsiqi helloworld SQL> 从这里可以验证出来,flashback闪回被drop掉的table,是不需要开启归档模式的,只跟是否开启回收站功能有关。 之后我们来验证一下DML语句是否也可以不用开启归档模式,用闪回来恢复。 select versions_xid,name from testlijian versions between scn minvalue and maxvalue; 得到刚刚提交的update操作的xid号为: 我们再执行如下命令: select operation,undo_sql from flashback_transaction_query where xid = hextoraw('0900090018740000') 我们把完整的操作记录复制出来看一下: SQL> update testlijian set name ='lijian4' where name = 'lijian3'; 1 row updated SQL> SQL> select versions_xid,name 2 from testlijian 3 versions between scn minvalue and maxvalue; VERSIONS_XID NAME ---------------- -------------------------------------------------- lijian3 wangsiqi helloworld SQL> commit; Commit complete SQL> SQL> select versions_xid,name 2 from testlijian 3 versions between scn minvalue and maxvalue; VERSIONS_XID NAME ---------------- -------------------------------------------------- 0900090018740000 lijian4 lijian3 wangsiqi helloworld SQL> SQL> select operation,undo_sql 2 from flashback_transaction_query 3 where xid = hextoraw('0900090018740000') 4 ; OPERATION UNDO_SQL -------------------------------- -------------------------------------------------------------------------------- UNKNOWN BEGIN SQL> 我们可以看到,在最后一个SQL执行完了之后,undo_sql怎么是空的呢?然后operation也是unknown,明明我执行了一个update语句呀? 关于这里,我上网查询了一下:原来在11gR2里,有一个功能默认是不开启的 我们来实验一下: SQL> alter database add supplemental log data; Database altered SQL> update testlijian set name ='lijian5' where name = 'lijian4'; 1 row updated SQL> commit; Commit complete SQL> SQL> select versions_xid,name 2 from testlijian 3 versions between scn minvalue and maxvalue; VERSIONS_XID NAME ---------------- -------------------------------------------------- 060015002A710000 lijian5 0900090018740000 lijian4 lijian3 wangsiqi helloworld SQL> SQL> select operation,undo_sql 2 from flashback_transaction_query 3 where xid = hextoraw('060015002A710000'); OPERATION UNDO_SQL -------------------------------- -------------------------------------------------------------------------------- UPDATE update "JLLT_DM"."TESTLIJIAN" set "NAME" = 'lijian4' where ROWID = 'AAAW08AAFAAK BEGIN SQL> ok,这回我们看见了undo_SQL的内容,正是我们执行的Update语句。 我们执行: select operation,start_scn from flashback_transaction_query where xid = hextoraw('060015002A710000'); 得到SCN号为: 我们先开启行迁移模式: SQL> select operation,start_scn 2 from flashback_transaction_query 3 where xid = hextoraw('060015002A710000'); OPERATION START_SCN -------------------------------- ---------- UPDATE 1559951294 BEGIN 1559951294 SQL> alter table testlijian enable row movement; Table altered SQL> flashback table testlijian to SCN 1559951294; flashback table testlijian to SCN 1559951294 ORA-08181: 指定的编号不是有效的系统更改号 SQL> flashback table testlijian to SCN 15599512948179; Done SQL> select * from testlijian; NAME -------------------------------------------------- lijian4 wangsiqi helloworld SQL> alter table testlijian disable row movement; Table altered SQL> 我们惊喜的看到,lijian5又变回了lijian4,这说明我们不开启归档模式,我们也能够通过闪回找回误操作后的数据了! SQL> select name,value 2 from v$parameter 3 where name like '%undo%'; NAME VALUE ----------------------------------------------------------------- undo_management AUTO undo_tablespace UNDOTBS1 undo_retention 900 可以看到,这里是900秒,也就是说,我们的误操作,第一要满足undo的空间足够大,能够装得下这部分数据,另外要满足15分钟这个条件,才能通过非归档模式下的flashback找回成功。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |