2014年7月3日 星期四

AUL 工具



ORACLE AUL 工具

這是一個由網路強人開發出來的軟體,可直接讀取DBF檔案內的資料,使發生狀況時把災害降到最小

網站: http://www.mydul.net/cn/index.html

是半免費軟體,沒有購買 licence 最多允許同時打開10個 DBF檔案 ,並且只能訪問前512MB 內容




我們都知道 Truncate table 並不是把資料完全刪除,而是重置了 metadata 及 Dictionary 的資訊,此時 Table 內的資料並沒有消失,只是等待被Oracle 回收利用或重新分配,就是為什麼Truncate 比 delete 還快的原因就在這了。

要做到有效的恢復,在操作人員誤執行Truncate table 後 ,必須立刻阻止對Table 任何的異動( 可以tablespace offline 或 db shutdown )


接下來示範一下如何把 Truncate 後的資料救回

AUL測試版本:6

1.truncate table

SQL> select * from vincentyuan.tw100;

NAME
-----------------------------------------------

1
1
1
1
1
1
1
2
3

9 rows selected.

SQL> truncate table vincentyuan.tw100;

Table truncated.

SQL>


2.使用AUL

先建立一個文字檔 test.cfg ,有system.dbf 與 要恢復 table 所在的dbf

0 0 D:\ORACLE\ORADATA\ORCL\SYSTEM01.DBF
0 0 D:\ORACLE\ORADATA\ORCL\TEST1.DBF

開啟AUL6.EXE,並執行 test.cfg

並讀取表結構與用戶等相關資訊
輸入
UNLOAD TABLE USER$; 
UNLOAD TABLE OBJ$; 
UNLOAD TABLE TAB$; 
UNLOAD TABLE COL$; 

查看 table 的編號


掃描一下空間分配資訊,掃描結果會存在 AULEXT.TXT 裡


在Truncate table 時重置了第一個block,下一個block 就是原本的資料,所以我們這邊選擇下一個block (原本在130),要是在找不到可以試試下下個block,成功後可以找到原來的資料編號

解析出 Table 資料


 接下來把資料儲存在  Tw100.txt 裡


就可以發現AUL目錄下有 三個檔案 TW100_sqlldr.ctl、tw100.txt、TW100_syntax.sql
DBA就可以利用sqlldr 把資料匯進去

想當然的真實情況不可能這麼簡單,肯定比範例來得複雜與棘手,例如在 Truncate 後立刻被 insert 資料進去,找不到原來的資料編碼,這種情況下作者不保證AUL能100%完全恢復

好的DBA是建立完善的備份機制與策略,不能把AUL當作第一考慮使用的工具

















2014年7月1日 星期二

Oracle 誤刪資料 ?!



有時候操作人員可能眼花了,誤刪了線上DB內的Table資料,發現事態嚴重後來求助DBA

這時DBA也別跟著慌張,先了解人員刪除資料的方式是什麼!


在Oracle 刪除資料有好多種方式
1. delete + commit
2. drop
3. truncate

以下一一操作還原示範
操作版本 :  11.2.0.1.0

1. delete + commit 
狀態:操作人員發現誤刪了Table資料並且也已經commit,並且立刻求助DBA

剛刪除的資料一定還在UNDO裡,這邊我們使用Flashback Query  技術

語法

code
--SCN
SELECT <column_name_list>
        FROM <table_name>
        AS OF <SCN>                          

--timestamp
 SELECT <column_name_list>
        FROM <table_name>
        AS OF <TIMESTAMP>                


1.1查詢一下目前有的資料、時間與SCN
SQL> select * from TW100;

NAME
-----------------------------------

1
2
3
4

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

sysdate
-------------------
2014-07-01 14:25:45

SQL> select to_char(current_scn,'99999999990') from v$database;

scn
------------
 10301120060
           

1.2 delete+commit

SQL> delete TW100;

4 rows deleted.

SQL> commit;

Commit complete.

SQL>


1.3 Flashback Query

SQL> select * from TW100 as of timestamp to_timestamp('2014-07-01 14:25:45','yyyy-mm-dd hh24:mi:ss');

NAME
------------------------------------------------
1
2
3
4

或是

SQL> select * from tw100 as of scn  10301120060;

NAME
---------------------------------------------------

1
2
3
4

1.4.insert into 
在把資料重新 insert 進去

SQL> insert into tw100 select * from tw100 as of scn 10301120060;

4 rows created.

SQL> commit;

資料就還原回來了


其實操作人員不會知道當下刪除的SCN,通常都只知道刪除的大概時間,用 timestamp 慢慢去推算時間可能會好一點。

因為這是利用 UNDO ,資料的保留時間跟 undo tablespace size 和 undo_retention參數有關
要是太久之前的資料如1天前,那就可不保證能還原回來了!!!


2. drop
狀態:操作人員發現drop 錯了 Table,過了一天後發現才來求助DBA

在Drop Table 後 Oracle 會把刪除的Table 放入類似回收筒的地方叫 Recyclebin (功能預設是開啟)

查詢功能使否開啟
SQL> show parameter recyclebin

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------
recyclebin                           string      on
SQL>

2.1 查詢 Recyclebin  內的 Table

SQL> select OBJECT_NAME,ORIGINAL_NAME,OPERATION from dba_recyclebin;

OBJECT_NAME                                                ORIGINAL_NAME              OPERATION                    DROPTIME
-------------------------------------------                         --------------------                  ---------                        ----------------------------
BIN$9x57SsRkSTOYj9JLTeq8PQ==$0                       TW100                          DROP                   2014-07-01:14:54:52

SQL>

可以看到他現在的名子叫 BINXXXXXX ,原本的名子叫TW100


2.2 還原

SQL> FLASHBACK TABLE TW100 TO BEFORE DROP;

Flashback complete.

SQL>

或者

SQL> FLASHBACK TABLE "BIN$9x57SsRkSTOYj9JLTeq8PQ==$0" TO BEFORE DROP;

Flashback complete.

SQL>

又或者還原順便替 Table 改名

SQL> FLASHBACK TABLE "BIN$9x57SsRkSTOYj9JLTeq8PQ==$0" TO BEFORE DROP RENAME TO TW101;

Flashback complete.

SQL>


成功


3. truncate
truncate 還原 相較於delete 與 drop 說是來的困難很多

第一作法 : 把先前datafile、 archive log file 備份還原到另外一台備援機上, 在expdp + impdp

第二作法 : 使用 flash database 把整個資料庫回覆到刪除前 (需要db shudown, 較適合使用再 測試機或不重要的db上)

第三作法 : Oracle 它有自己的恢復工具叫 DUL (需 Oracle Support), 網路上也有個強人開發的恢復工具叫: AUL (有限度式的免費) AUL 還原示範連結


以下是模擬第二個做法 FLASHBACK

3.1 使用  FLASHBACK database
先確定 自己的  FLASHBACK是否開啟

SQL> select flashback_on,force_logging from v$database;

FLASHBACK_ON       FOR
------------------ ---
YES                YES


3.2 查看一下 DB目前可以恢復的時間

SQL> select oldest_flashback_scn,oldest_flashback_time from v$flashback_database_log;

OLDEST_FLASHBACK_SCN               OLDEST_FLASHBACK_TI
---------------------------------                     --------------------------------
             4666749                                       2014-07-02 11:55:00

SQL> select sysdate from dual;

SYSDATE
-------------------
2014-07-02 13:12:59


3.3 模擬Table 被 truncate

SQL> truncate table tw100;

Table truncated.


3.4 進行恢復

SQL> shutdown immediate;

SQL> startup mount exclusive;

SQL> Flashback Database to timestamp(to_date('2014-07-02 13:12:59','yyyy-mm-dd hh24:mi:ss'));

Flashback complete.

SQL> alter database open read only;

Database altered.


3.5 查詢是否成功

SQL> select * from tw100;

NAME
-------------------------------------------------

1
1
1
1
1
1

6 rows selected.

SQL>

恢復成功