2013/12/26

Published 12月 26, 2013 by

Flashbackup/Recyclebin資料回覆

1.Flashbackup:使用DML資料誤刪
2.Recyclebin:使用Drop指令誤刪除料
3.OERR-ORA Error錯誤查詢
4.11g獨有的自動修復功能



使用flashbackup回覆資料:

一、指定單一時間點的資料
先查詢之前的狀態是否錯誤
Meth1:
select salary from hr.emp as of timestamp to_date('2013-12-19:15:54:52','YYYY-MM-DD:HH24:MI:SS') where employee_id=100;
Meth2:回到n分鐘前
select salary from hr.emp as of timestamp sysdate-5/1440 where employee_id=100;

二、指定undo資料上可回覆的資料
select versions_xid,versions_startscn,versions_endscn,versions_operation ,salary  --versions_starttime,versions_endtime
from hr.emp versions between scn minvalue and maxvalue  --{scn 10000 and 20000},{timestamp t1 and t2}
where employee_id=100;

查詢SQL語句
select start_scn,COMMIT_SCN,OPERATION,UNDO_SQL from flashback_transaction_query where xid='010015003A020000';

--如果undo_sql沒有出現,是因為並沒有啟動supplemental log(11g才需要啟動,10g不需要)
SQL> select SUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_UI from v$database;

SQL> alter database add supplemental log data; -->enable supplemental log
SQL> alter table hr.t1 enable row movement;-->enable row movement


回覆資料:
Meth1:
flashback table hr.emp to scn 1019919;
scn number:VERSIONS_STARTSCN

Meth2:
--如果現在反悔,想要取消剛剛的table flashback
SQL> flashback table hr.t1 to timestamp to_date('2011-05-25:16:14:51','YYYY-MM-DD:HH24:MI:SS');

Meth3:
--直接指定回到5分鐘之前的狀態:


SQL> flashback table hr.t1 to timestamp sysdate-5/1440;

******************************************************************
drop的回覆方式,透過Recycle bin的方式救回

查詢recyclebin裡有那一些檔案
SQL> select * from dba_recyclebin where owner='HR';
**flashback table original_name to before drop  --如果有一個以上的table有相同的original_name,則使用LIFO(Last In First Out),就是最後被droptable被救回
**flashback table "BIN$...." to before drop  --使用BIN$名字可以要求某一個table被救回

SQL> flashback table hr.emp5 to before drop;


若不是DBA想救的檔案,就要使用檔案名稱+時間點,來確認是何檔案
SQL> flashback table hr."BIN$pCUFW0TCVuzgQKjAZTgQRw==$0" to before drop;  --使用unique object name

SQL> flashback table hr."BIN$pCUFW0TEVuzgQKjAZTgQRw==$0" to before drop rename to new_emp5;  --emp5已經被使用,所以只好更名為new_emp5

補充:
Drop Table 後,沒有真正的刪除表,而是在“垃圾站”中了。可以通過下面看到。

  SQL> SHOW RECYCLEBIN

如果要徹底刪除,可以使用︰

  SQL> PURGE TABLE "BINjR8PK5HhrrgMK8KmgQ9nw==";

刪除這一個或刪除全部。

  SQL> PURGE RECYCLEBIN;



purge table test; (直接使用 table 名稱刪除存放在 recyclebin 裏的 table,如有相同的名字存在的話,會採用FIFO的方式刪除最舊的資料)

purge index id_test; (直接使用 index 名稱刪除存放在 recyclebin 裏的 index,如有相同的名字存在的話,會採用FIFO的方式刪除最舊的資料)

purge table "BIN$+7J5MgT2RbCX+tka+zjpgA==$0"; (也可指定完整名稱進行刪除)

purge recyclebin; (刪除屬於自已的全部 object )

purge dba_recyclebin; (刪除全部的 recyclebin 裏的資料,只有sysdba權限的人才能執行)

 **********************************************************************

Error查詢方式:
oerr ora 1116

11G才有的功能,自動修復錯誤
$rman target /
列出錯誤
rman> list failure;
常態的錯誤建議,不一定全部都有
rman>advise failure;
修復錯誤
rman>repair failure;