oracle日志挖掘


  oracle日志挖掘是一種十分強大的數據恢復技術,只要你保障你的歸檔日志和重做日志是完整的,那么就可以將你的數據恢復到任何時刻。簡單敘述一下日志挖掘的基本原理,然后進行一個簡單的小實驗。

  日志挖掘時基於redo日志和歸檔日志的基礎之上來進行日志加載並進行恢復,挖掘,挖掘,挖的就是你的redo日志和歸檔日志,當數據庫運行過程中,你的所有數據更改操作會被記錄在redo日志中,而oracle redo日志記錄着undo日志,所以可以使用記錄在redo日志中undo日志來對你所做的操作進行回退。我們只需要確定你所做的操作被記錄在哪個時間范圍內,然后通過時間或者scn號將這個時間范圍內的操作加載到 v$logmnr_contents這個視圖中,然后找到對應的undo記錄,執行undo記錄的sql語句,就可以將你的數據恢復至更改前的狀態。

  可能說的有點難理解,我們來做一個簡單的實驗。

  首先確定數據庫運行在歸檔模式下,否則日志一旦被覆蓋,那肯定是沒辦法恢復的,當然,可以通過其他方式,如閃回方式等,但是今天僅僅只針對日志挖掘來進行描述。

1、archive log list --查看系統是否運行在歸檔模式

我的庫是在歸檔模式,如果沒有歸檔,在mount下開啟歸檔。

2、alter database add supplemental log data; --啟動最小日志,這一步是為了日志更加詳細,完整。

3、更新一條數據,將new york 更改為test。

4、這個數據更新的時間范圍大約是在17點10分之20分。

5、將這個時間段的日志加載到v$logmnr_contents這個視圖中。加載方式有很多種,我們使用在線字典自動加載,這種方式支持以時間范圍方式加載日志。調用相應的存儲過程,除了時間其他的都是固定參數。

6、到此,我們將17點10分到17點20分的redo日志加載到v$logmnr_contents視圖中,查看v$logmnr_contents視圖的undo記錄,。

注解:seg_name 是更改的表名,seg_owner是表所屬的用戶,sql_redo是redo日志記錄的sql信息,剛才是做了一個update操作,所以使用like查詢有update字段的字段。過濾條件可以自己定義,只要能確定是哪條數據就可以。查出來的sql_undo 就是你的回退sql 用這條sql就可以將數據恢復到更改前的狀態。

7、執行undo字段中的sql。

至此,數據成功恢復,但是在生產環境中需要恢復的數據往往有很多,可能幾千甚至幾萬條,可以寫一個循環來對數據進行插入,如下。

注解:利用for循環中的隱式游標存儲sql_undo字段中的數據,然后一次執行需要sql進行數據恢復。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM