時間: 2005-4-15 4PM
地點: 項目開發中心
1601: 程序員A驚呼: 我寫的procedure變成舊版本了!
1602: 程序員B: 我的也是
1603: 數據庫維護員C (紅着臉跑來):
剛纔我把一期的數據庫建立文本跑了一遍,想裝在本機的,結果沒想到直接在開發服務器上運行了....
1610: 開發經理: 經過檢查,程序員的機器沒有備份程序 ( what a terriable management !)
1618: 開發停止,檢查損失:共有9個Package被誤編譯,從4月7日開發的新版本Package舊版本覆蓋
大致損失10個工作日的程序量
1630: 開發經理和超人X緊急磋商解決方案.期間超人X通過專家Y諮詢,得到兩套方案
解決方案1: recovery in time
解決方案2: logminer
1640: 方案確定: logminer . 由於數據庫是運行在noarchivelog 模式,並且沒有任何備份,recovery in time 方案過於複雜,不可實施.
1645: 超人X開始實施解決方案1
a. 鑑定當前active的redo log . 通過數據字典
b. 得到此redo log的log switch時間點t1.
c. 和開發經理確認所有的的Package新的編譯時間t2.
d. t2在t1之後,很幸運,只要通過active redo log 就應該能夠得到package的編碼.
e. 停止所有程序員的數據庫聯接
f. telnet聯上數據庫服務器進行操作
g. 生成數據字典文件,是通過dbms_logmnr_d.build()來完成。
(由於utl_file_dir= '* ',所以設置這個參數的步驟可以省略)
SQL> BEGIN
2 dbms_logmnr_d.build(
3 dictionary_filename => 'logminer.dat ',
4 dictionary_location => '/oradata/home '
5 );
6 END;
7 /
h. 建立一個日誌分析表
a、建立日誌分析表數據庫必須在mount或nomount狀態,啓動數據庫到mount狀態。
sql> shutdown immediate
sql> starup mount
b、建立日誌分析表,使用dbms_logmnr.add_logfile()
SQL> BEGIN
2 dbms_logmnr.add_logfile(
3 options => dbms_logmnr.new,
4 logfilename => '/oradata/home/redo2 ' --active的redolog
5 );
6 END;
7 /
i.啓動LogMiner進行分析。
SQL> BEGIN
2 dbms_logmnr.start_logmnr(
3 dictfilename => '/u01/arch/logminer_dict.dat ',
4 starttime => to_date( '20050408 01:00:00 ', 'yyyymmdd hh24:mi:ss '), --小於t1
5 endtime => to_date( '20050413 23:00:30 ', 'yyyymmdd hh24:mi:ss ') --大於t2
6 );
7 END;
8 /
j.查看日誌分析的結果,通過查詢v$logmnr_contents可以查詢到
set heading off
spool packagename.txt
SELECT sql_redo
FROM V$logmnr_contents
WHERE seg_name = 'PACKAGENAME ';
/
spool off
重複j的過程爲每個package都生成output文件
每個文件中最後的package應該爲最新的source
k.結束LogMiner的分析。
SQL> BEGIN
2 dbms_logmnr.end_logmnr;
3 end;
4 /
1930: 整個操作結束,所有package得到恢復!整個團隊對超人X表示感謝 :)
結論: a.source備份的重要性
b.數據庫備份的重要性
c.logminer的神奇功效
logminer實戰記錄
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.