[Oracle]數(shù)據(jù)庫(kù)系統(tǒng)緊急故障處理方法 (6)
發(fā)表時(shí)間:2024-01-21 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]Oracle邏輯結(jié)構(gòu)故障的處理方法: 邏輯結(jié)構(gòu)的故障一般指由于人為的誤操作而導(dǎo)致重要數(shù)據(jù)丟失的情況。在這種情況下數(shù)據(jù)庫(kù)物理結(jié)構(gòu)是完整的也是一致的。對(duì)于這種情況采取對(duì)原來(lái)數(shù)據(jù)庫(kù)的全恢復(fù)是不合適的,我們一般采用三種方法來(lái)恢復(fù)用戶數(shù)據(jù)。 采用exp/imp工具來(lái)恢復(fù)用戶數(shù)據(jù): 如果丟失...
Oracle邏輯結(jié)構(gòu)故障的處理方法:
邏輯結(jié)構(gòu)的故障一般指由于人為的誤操作而導(dǎo)致重要數(shù)據(jù)丟失的情況。在這種情況下數(shù)據(jù)庫(kù)物理結(jié)構(gòu)是完整的也是一致的。對(duì)于這種情況采取對(duì)原來(lái)數(shù)據(jù)庫(kù)的全恢復(fù)是不合適的,我們一般采用三種方法來(lái)恢復(fù)用戶數(shù)據(jù)。
采用exp/imp工具來(lái)恢復(fù)用戶數(shù)據(jù):
如果丟失的數(shù)據(jù)存在一個(gè)以前用exp命令的備份,則可以才用這種方式。
1. 在數(shù)據(jù)庫(kù)內(nèi)創(chuàng)建一個(gè)臨時(shí)用戶:
svrmgrl>create user test_user identified by test;
svrmgrl>grant connect,resource to test_user;
2. 從以前exp命令備份的文件中把丟失數(shù)據(jù)的表按照用戶方式倒入測(cè)試用戶:
$imp system/manager file=export_file_name tables=(lost_data_table_name…) fromuser=lost_data_table_owner touser=test_user constraint=n;
3. 用相應(yīng)的DML語(yǔ)句將丟失的數(shù)據(jù)從測(cè)試用戶恢復(fù)到原用戶。
4. 將測(cè)試用戶刪除:
svrmgrl>drop user test_user cascede;
采用logminer來(lái)恢復(fù)用戶數(shù)據(jù):
Logminer是oracle提供的一個(gè)日志分析工具。它可以根據(jù)數(shù)據(jù)字典對(duì)在線聯(lián)機(jī)日志、歸檔日志進(jìn)行分析,從而可以獲得數(shù)據(jù)庫(kù)的各種DML操作的歷史記錄以及各種DML操作的回退信息。根據(jù)這些用戶就可以將由于誤操作而丟失的數(shù)據(jù)重新加入數(shù)據(jù)庫(kù)內(nèi)。
1. 確認(rèn)數(shù)據(jù)庫(kù)的utl_file_dir參數(shù)已經(jīng)設(shè)置,如果沒有則需要把這個(gè)參數(shù)加入oracle的初始化參數(shù)文件,然后重新啟動(dòng)數(shù)據(jù)庫(kù)。下面例子中假設(shè)utl_file_dir=’/opt/oracle/db01’;
2. 創(chuàng)建logminer所需要的數(shù)據(jù)字典信息,假設(shè)生成的數(shù)據(jù)字典文本文件為dict.ora:
svrmgrl>execute dbms_logmnr_d.build(dictionary_filename=>'dict.ora', dictionary_location=>'/opt/oracle/db01’);
3. 確定所需要分析的日志或者歸檔日志的范圍。這可以根據(jù)用戶誤操作的時(shí)間來(lái)確定大概的日志范圍。假設(shè)用戶誤操作時(shí)可能的日志文件為/opt/oracle/db02/oradata/ORCL/redo3.log和歸檔日志’/opt/oracle/arch/orcl/orclarc_1_113.ora’。
4. 創(chuàng)建要分析的日志文件列表,按日志文件的先后順序依次加入:
svrmgrl>execute dbms_logmnr.add_logfile(logfilename=>’/opt/oracle/arch/orcl/orclarc_1_113.ora’,options=>dbms_logmnr.NEW);
svrmgrl> execute dbms_logmnr.add_logfile(logfilename=>’ /opt/oracle/db02/oradata/ORCL/redo3.log’,options=>dbms_logmnr.ADDFILE);
5. 開始日志分析,假設(shè)需要分析的時(shí)間在’2003-06-28 12:00:00’和’2003-06-28 13:00:00’之間:
svrmgrl>execute dbms_logmnr.start_logmnr(dictfilename=>’ /opt/oracle/db01/dict.ora’,starttime=>to_date(’ 2003-06-28 12:00:00’,’YYYY-MM-DD HH:MI:SS’),endtime=>to_date(to_date(‘2003-06-28 13:00:00’,’YYYY-MM-DD HH:MI:SS’));
6. 獲取分析結(jié)果:
svrmgrl>select operation,sql_redo,sql_undo from v$logmnr_contents;
7. 根據(jù)分析結(jié)果修復(fù)數(shù)據(jù)。
8.結(jié)束logmnr:
svrmgrl>dbms_logmnr.end_logmnr;
9. 用適當(dāng)?shù)姆椒▽?duì)原數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)庫(kù)全備份。利用備份恢復(fù)用戶數(shù)據(jù):
采用這種方法時(shí)并不是在原數(shù)據(jù)庫(kù)進(jìn)行恢復(fù),而是利用數(shù)據(jù)庫(kù)備份在新的機(jī)器上重新建立一個(gè)新的數(shù)據(jù)庫(kù)。通過備份恢復(fù)在新機(jī)器上將數(shù)據(jù)庫(kù)恢復(fù)到用戶誤操作前,這樣就可以獲得丟失的數(shù)據(jù)將其恢復(fù)到原數(shù)據(jù)庫(kù)。
1. 在新的機(jī)器上安裝數(shù)據(jù)庫(kù)軟件。
2. 對(duì)于采用帶庫(kù)備份的現(xiàn)場(chǎng),需要在新的數(shù)據(jù)庫(kù)服務(wù)器上安裝調(diào)試相應(yīng)的備份管軟件。
3. 根據(jù)用戶誤操作的時(shí)間點(diǎn)進(jìn)行基于時(shí)間點(diǎn)的數(shù)據(jù)庫(kù)恢復(fù)操作。對(duì)于沒有采用帶庫(kù)備份的現(xiàn)場(chǎng),可以選取用戶誤操作前最近的備份磁帶進(jìn)行恢復(fù);對(duì)于才用帶庫(kù)備份的點(diǎn)可以通過基于時(shí)間恢復(fù)點(diǎn)恢復(fù)的rman腳本來(lái)進(jìn)行恢復(fù)。
4.重新打開數(shù)據(jù)庫(kù):
svrmgrl>alter database open resetlogs;
5. 從新的數(shù)據(jù)庫(kù)中獲取丟失的用戶數(shù)據(jù),通過DML操作將其恢復(fù)到原數(shù)據(jù)庫(kù)中。
6. 用適當(dāng)?shù)姆椒▽?duì)原數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)庫(kù)全備份。