plete
SQL> update test.emp set comm=1000 where empno=60;
1 row updated
SQL> commit;
Commit complete
操作之后,数据库时间点如下:
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
? ? ? ? ? ? ? ? 1795891
数据肯定发生了变化,现在实验目标是将数据恢复回去,恢复到SCN=1795785时间点Emp数据表的状态。
3、数据恢复实验
首先,需要创建一个数据表changed_tables,记录下从Log Miner中抽取出的与数据表EMP相关的事务信息。
SQL> create table changed_tables (table_name varchar2(256), xid raw(8), scn number);
Table created
SQL> desc changed_tables;
Name? ? ? Type? ? ? ? ? Nullable Default Comments?
---------- ------------- -------- ------- --------?
TABLE_NAME VARCHAR2(256) Y? ? ? ? ? ? ? ? ? ? ? ? ?
XID? ? ? ? RAW(8)? ? ? ? Y? ? ? ? ? ? ? ? ? ? ? ? ?
SCN? ? ? ? NUMBER? ? ? ? Y? ? ? ? ? ? ? ? ? ? ? ? ?
创建一个Stored Procedure,用于从Log Miner视图中将相关事务操作保存在changed_tables中。
SQL> CREATE OR REPLACE PROCEDURE extract_txn_ids (lcrscn IN NUMBER, escn in number) AS
? 2? lname VARCHAR2(256);
? 3? vsql varchar2(2000);
? 4? BEGIN
? 5? ? ? dbms_logmnr.start_logmnr(startscn => lcrscn,
? 6? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? endscn => escn,
? 7? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG+DBMS_LOGMNR.CONTINUOUS_MINE);
? 8? ? ? insert into changed_tables
? 9? ? ? ? ? ? select distinct seg_name,xid,scn
?10? ? ? ? ? ? ? from v$logmnr_contents where seg_owner = 'TEST'
?11? ? ? ? ? ? ? ? ? ? and scn >= lcrscn
?12? ? ? ? ? ? ? ? ? ? and scn<= escn;
?13? ? ? commit;
?14? END;
?15? /
Procedure created
执行存储过程,输入起始和截止操作的SCN时间点。
SQL> exec extract_txn_ids(1795785,1795891);
PL/SQL procedure successfully completed
获取到的数据结果。
SQL> select * from changed_tables;
TABLE_NAME XID? ? ? ? ? ? ? ? ? ? SCN
---------- ---------------- ----------
EMP? ? ? ? 0200150064070000? ? 1795812
EMP? ? ? ? 06000D00E3050000? ? 1795883
EMP? ? ? ? 04000D00BC040000? ? 1795877
EMP? ? ? ? 0200150064070000? ? 1795827
EMP? ? ? ? 0200150064070000? ? 1795844
EMP? ? ? ? 0200150064070000? ? 1795835
6 rows selected
创建第二个存储过程,逐事务调用dbms_flashback.transaction_backout方法。
SQL> create or replace procedure txn_backout(sscn in number)
? 2? as
? 3? ? txn_array sys.xid_array := sys.xid_array();
? 4? ? i number;
? 5? begin
? 6? ? ? ? i := 1;
? 7? ? ? ? --initialize xid_array from changed_tables
? 8?
? 9? ? ? ? for txn in (select distinct xid from changed_tables)
?10? ? ? ? loop
?11? ? ? ? ? txn_array.extend;
?12? ? ? ? ? txn_array(i) := txn.xid;
?13? ? ? ? ? i := i + 1;
?14? ? ? ? end loop;
?15? ? ? ? i := i - 1;
?16? ? ? ? -- 3 input variables are passed to transaction_backout
?17? ? ? ? -- i number of txns
?18? ? ? ? -- txn_array array of txn ids
?19? ? ? ? -- sscn starting point to logminer
?20?
?21? ? ? ? dbms_flashback.transaction_backout (
?22? ? ? ? ? ? ? numtxns => i,
?23? ? ? ? ? ? ? xids => txn_array,
?24? ? ? ? ? ? ? options => dbms_flashback.cascade,
?25? ? ? ? ? ? ? scnhint => sscn
?26? ? ? ? ? ? );
?27?
?28? ? ? ? --issue commit as dbms_flashback.transaction_backout does not include commit and ----txn backout.
?29? ? ? ? ? commit;
?30? END;
?31? /
Procedure created
执行过程程序。
SQL> exec txn_backout(sscn => 1795785);
begin txn_backout(sscn => 1795785); end;
ORA-55510: ?? 无法启动挖掘
ORA-06512: ?? "SYS.DBMS_FLASHBACK", line 37
ORA-06512: ?? "SYS.DBMS_FLASHBACK", line 70
ORA-06512: ?? "SYS.TXN_BACKOUT", line 21
ORA-06512: ?? line 1
遇到了错误信息,检查错误代码。
[oracle@NCR-Standby-Asm ~]$ oerr ora 55510
55510, 0000, "Mining could not start"
// *Cause: Mining could not start for the following reasons.
//? ? ? ? 1. A logminer session was processing
//? ? ? ? 2. The database was not mounted or not opened for read and write
//? ? ? ? 3. Minimum supplemental logging was not enabled
//? ? ? ? 4. Archiving was not enabled
// *Action: F