Oracle物理結(jié)構(gòu)故障的處理方法_第1頁
Oracle物理結(jié)構(gòu)故障的處理方法_第2頁
Oracle物理結(jié)構(gòu)故障的處理方法_第3頁
Oracle物理結(jié)構(gòu)故障的處理方法_第4頁
Oracle物理結(jié)構(gòu)故障的處理方法_第5頁
已閱讀5頁,還剩29頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、Oracle快速刪除重復(fù)的記錄做項(xiàng)目的時(shí)候,一位同事導(dǎo)數(shù)據(jù)的時(shí)候,不小心把一個(gè)表中的數(shù)據(jù)全都搞重了,也就是說,這個(gè)表里所有的記錄都有一條重復(fù)的。這個(gè)表的數(shù)據(jù)是千萬級的,而且是生產(chǎn)系統(tǒng)。也就是說,不能把所有的記錄都刪除,而且必須快速的把重復(fù)記錄刪掉。對此,總結(jié)了一下刪除重復(fù)記錄的方法,以及每種方法的優(yōu)缺點(diǎn)。為了陳訴方便,假假設(shè)表名為TTbl,表中中有三列cool1,cool2,cool3,其中中col1,ccol2是主主鍵,并且,ccol1,ccol2上加加了索引。1、通過創(chuàng)建臨臨時(shí)表可以把數(shù)據(jù)先導(dǎo)導(dǎo)入到一個(gè)臨臨時(shí)表中,然然后刪除原表表的數(shù)據(jù),再再把數(shù)據(jù)導(dǎo)回回原表,SQQL語句如下下:creat

2、e tablee tbl_tmp (selecct disstinctt * froom tbll);truncatte tabble tbbl;/清清空表記錄insert into tbl sselectt * frrom tbbl_tmpp;/將臨臨時(shí)表中的數(shù)數(shù)據(jù)插回來。這種方法可以實(shí)實(shí)現(xiàn)需求,但但是很明顯,對對于一個(gè)千萬萬級記錄的表表,這種方法法很慢,在生生產(chǎn)系統(tǒng)中,這這會給系統(tǒng)帶帶來很大的開開銷,不可行行。2、利用rowwid在Oraclee中,每一條條記錄都有一一個(gè)rowiid,rowwid在整個(gè)個(gè)數(shù)據(jù)庫中是是唯一的,rrowid確確定了每條記記錄是Oraacle中的的哪一個(gè)數(shù)據(jù)據(jù)文

3、件、塊、行行上。在重復(fù)復(fù)的記錄中,可可能所有列的的內(nèi)容都相同同,但rowwid不會相相同。SQLL語句如下:delete from tbl wwhere rowidd in (selecct a.rrowid from tbl aa, tbll b whhere aa.rowiidb.rrowid and aa.col11=b.cool1 annd a.ccol2 = b.cool2)如果已經(jīng)知道每每條記錄只有有一條重復(fù)的的,這個(gè)sqql語句適用用。但是如果果每條記錄的的重復(fù)記錄有有N條,這個(gè)個(gè)N是未知的的,就要考慮慮適用下面這這種方法了。3、利用maxx或min函函數(shù)這里也要使用rrowid

4、,與與上面不同的的是結(jié)合maax或minn函數(shù)來實(shí)現(xiàn)現(xiàn)。SQL語語句如下delete from tbl aawherre rowwid noot in (seleect maax(b.rrowid) fromm tbl b wheere a.col1=b.coll1 andd a.cool2 = b.coll2);/這里maxx使用minn也可以或者用下面的語語句delete from tbl aawherre rowwid(seleect maax(b.rrowid) fromm tbl b wheere a.col1=b.coll1 andd a.cool2 = b.coll2);/這里如

5、果把把max換成成min的話話,前面的wwhere子子句中需要把把跟上面的方法思思路基本是一一樣的,不過過使用了grroup by,減少少了顯性的比比較條件,提提高效率。SSQL語句如如下:deletefrom tbl wwhere rowidd not in (sselectt max(rowidd) froom tbll tgrroup bby t.ccol1, t.coll2);delete from tbl wwhere (col11, coll2) inn (sellect ccol1,ccol2 ffrom ttblgrroup bbycoll1,coll2havvingcount

6、t(*) 1)aand roowidnotiin(seelectmin(roowid)fromtblggroup bycool1,cool2haavingcounnt(*) 1)還有一種方法,對對于表中有重重復(fù)記錄的記記錄比較少的的,并且有索索引的情況,比比較適用。假假定col11,col22上有索引,并并且tbl表表中有重復(fù)記記錄的記錄比比較少,SQQL語句如下下4、利用ggroup by,提高高效率Oracle物物理結(jié)構(gòu)故障障的處理方法法:Oracle物物理結(jié)構(gòu)故障障是指構(gòu)成數(shù)數(shù)據(jù)庫的各個(gè)個(gè)物理文件損損壞而導(dǎo)致的的各種數(shù)據(jù)庫庫故障。這些些故障可能是是由于硬件故故障造成的,也也可能是人為為誤

7、操作而引引起。所以我我們首先要判判斷問題的起起因,如果是是硬件故障則則首先要解決決硬件問題。在在無硬件問題題的前提下我我們才能按照照下面的處理理方發(fā)來進(jìn)一一步處理??乜刂莆募p壞壞:控制文件件記錄了關(guān)于于Oraclle的重要配配置信息,如如數(shù)據(jù)庫名、字字符集名字、各各個(gè)數(shù)據(jù)文件件、日志文件件的位置等等等信息??刂浦莆募膿p壞壞,會導(dǎo)致數(shù)數(shù)據(jù)庫異常關(guān)關(guān)閉。一旦缺缺少控制文件件,數(shù)據(jù)庫也也無法啟動,這這是一種比較較嚴(yán)重的錯(cuò)誤誤??梢酝ㄟ^過查詢數(shù)據(jù)庫庫的日志文件件來定位損壞壞了的控制文文件。日志文文件位于$OORACLEE_BASEE/admiin/bduump/allert_OORCL.oora.

8、損壞壞單個(gè)控制文文件:1. 確保數(shù)據(jù)庫庫已經(jīng)關(guān)閉,如如果沒有用下下面的命令來來關(guān)閉數(shù)據(jù)庫庫:svrmmgrlsshutdoown immmediaate;2. 查看初始始化文件$OORACLEE_BASEE/admiin/pfiile/innitORCCL.oraa,確定所有有控制文件的的路徑。3. 用操作系系統(tǒng)命令將其其它正確的控控制文件覆蓋蓋錯(cuò)誤的控制制文件。4. 用下面的的命令重新啟啟動數(shù)據(jù)庫ssvrmgrrlstaartup;5. 用適當(dāng)當(dāng)?shù)姆椒ㄟM(jìn)行行數(shù)據(jù)庫全備備份。損壞所所有的控制文文件:1. 確保數(shù)據(jù)庫庫已經(jīng)關(guān)閉,如如果沒有用下下面的命令來來關(guān)閉數(shù)據(jù)庫庫:svrmmgrlsshut

9、doown immmediaate;2. 從相應(yīng)的的備份結(jié)果集集中恢復(fù)最近近的控制文件件。對于沒有有采用帶庫備備份的點(diǎn)可以以直接從磁帶帶上將最近的的控制文件備備份恢復(fù)到相相應(yīng)目錄;對對于采用帶庫庫備份的點(diǎn)用用相應(yīng)的rmman腳本來來恢復(fù)最近的的控制文件。3. 用下面的命令來創(chuàng)建產(chǎn)生數(shù)據(jù)庫控制文件的腳本:svrmgrlstartup mount;svrmgrlalter database backup controlfile to trace noresetlogs;4. 修改第三步產(chǎn)生的trace文件,將其中關(guān)于創(chuàng)建控制文件的一部分語句拷貝出來并做些修改,使得它能夠體現(xiàn)最新的數(shù)據(jù)庫結(jié)構(gòu)。假設(shè)產(chǎn)

10、生的sql文件名字為createcontrol.sql.注意:Trace文件的具體路徑可以在執(zhí)行完第3)步操作后查看$ORACLE_BASE/admin/bdump/alert_ORCL.ora文件來確定。5. 用下面命令重新創(chuàng)建控制文件:svrmgrlshutdown abort;svrmgrlstartup nomount;svrmgrlcreatecontrol.sql;6. 用適當(dāng)?shù)姆椒ㄟM(jìn)行數(shù)據(jù)庫全備份。重做日志文件損壞:數(shù)據(jù)庫的所有增、刪、改都會記錄入重做日志。如果當(dāng)前激活的重做日志文件損壞,會導(dǎo)致數(shù)據(jù)庫異常關(guān)閉。非激活的重做日志最終也會因?yàn)槿罩厩袚Q變?yōu)榧せ畹闹刈鋈罩荆該p壞的非激

11、活的重做日志最終也會導(dǎo)致數(shù)據(jù)庫的異常終止。在ipas/mSwitch中每組重做日志只有一個(gè)成員,所以在下面的分析中只考慮重做日志組損壞的情況,而不考慮單個(gè)重做日志成員損壞的情況。確定損壞的重做日志的位置及其狀態(tài):1. 如果數(shù)據(jù)庫處于可用狀態(tài):select * from v$logfile;svrmgrlselect * from v$log;2. 如果數(shù)據(jù)庫處于已經(jīng)異常終止:svrmlgrstartup mount;svrmgrlselect * from v$logfile;svrmgrlselect * from v$log;其中,logfile的狀態(tài)為INVALID表示這組日志文件出現(xiàn)已

12、經(jīng)損壞;log狀態(tài)為Inactive:表示重做日志文件處于非激活狀態(tài);Active: 表示重做日志文件處于激活狀態(tài);Current:表示是重做日志為當(dāng)前正在使用的日志文件。損壞的日志文件處于非激活狀態(tài):1. 刪除相應(yīng)的日志組:svrmgrlalter database drop logfile group group_number;2. 重新創(chuàng)建相應(yīng)的日志組:svrmgrlalter database add log file group group_number (log_file_descritpion,) size log_file_size;損壞的日志文件處于激活狀態(tài)且為非當(dāng)前日志:1

13、. 清除相應(yīng)的日志組:svrmgrlalter database clear unarchived logfile group group_number;損壞的日志文件為當(dāng)前活動日志文件:用命令清除相應(yīng)的日志組:svrmgrlalter database clear unarchived logfile group group_number;如果清除失敗,則只能做基于時(shí)間點(diǎn)的不完全恢復(fù)。打開數(shù)據(jù)庫并且用適當(dāng)?shù)姆椒ㄟM(jìn)行數(shù)據(jù)庫全備份:svrmgrlalter database open;部分?jǐn)?shù)據(jù)文件損壞:若損壞的數(shù)據(jù)文件屬于非system表空間,則數(shù)據(jù)庫仍然可以處于打開狀態(tài)可以進(jìn)行操作,只是損壞的

14、數(shù)據(jù)文件不能訪問。這時(shí)在數(shù)據(jù)庫打開狀態(tài)下可以單獨(dú)對損壞的數(shù)據(jù)文件進(jìn)行恢復(fù)。若是system表空間的數(shù)據(jù)文件損壞則數(shù)據(jù)庫系統(tǒng)會異常終止。這時(shí)數(shù)據(jù)庫只能以Mount方式打開,然后再對數(shù)據(jù)文件進(jìn)行恢復(fù)。可以通過查看數(shù)據(jù)庫日志文件來判斷當(dāng)前損壞的數(shù)據(jù)文件到底是否屬于system表空間。非system表空間的數(shù)據(jù)文件損壞1. 確定損壞的文件名字:svrmgrlselect name from v$datafile where status=INVALID;2. 將損壞的數(shù)據(jù)文件處于offline狀態(tài):svrmgrlalter database datafile datafile_name offline

15、;3. 從相應(yīng)的備份結(jié)果集中恢復(fù)關(guān)于這個(gè)數(shù)據(jù)文件的最近的備份。對于沒有采用帶庫備份的點(diǎn)可以直接從磁帶上恢復(fù);對于用帶庫備份的點(diǎn)用相應(yīng)的rman腳本來恢復(fù)。4. 恢復(fù)數(shù)據(jù)文件:svrmgrlalter database recover datafile file_name;5. 使數(shù)據(jù)庫文件online:svrmgrlalter database datafile datafile_name online;6. 用適當(dāng)?shù)姆椒ㄟM(jìn)行數(shù)據(jù)庫全備份。system表空間的數(shù)據(jù)文件損壞:1. 以mount方式啟動數(shù)據(jù)庫svrmgrlstartup mount;2. 從相應(yīng)的備份結(jié)果集中恢復(fù)關(guān)于這個(gè)數(shù)據(jù)文件的

16、最近的備份。對于沒有采用帶庫備份的點(diǎn)可以直接從磁帶上恢復(fù);對于用帶庫備份的點(diǎn)用相應(yīng)的rman腳本來恢復(fù)。3. 恢復(fù)system表空間:svrmgrlalter database recover datafile datafile_name;4. 打開數(shù)據(jù)庫:svrmgrlalter database open;5. 用適當(dāng)?shù)姆椒ㄟM(jìn)行數(shù)據(jù)庫全備份。表空間損壞:若非system表空間已經(jīng)損壞,則數(shù)據(jù)庫仍然可以處于打開狀態(tài)可以進(jìn)行操作,只是損壞的表空間不能訪問。這樣在數(shù)據(jù)庫打開狀態(tài)下可以單獨(dú)對損壞的表空間進(jìn)行恢復(fù)。若是system表空間損壞則數(shù)據(jù)庫系統(tǒng)會異常終止。這時(shí)數(shù)據(jù)庫只能以Mount方式打開,

17、然后再對表空間進(jìn)行恢復(fù)。可以通過查看數(shù)據(jù)庫日志文件來判斷當(dāng)前損壞的表空間是否是system表空間.非system表空間損壞:1. 將損壞的表空間處于offline狀態(tài):svrmgrlalter tablespace tablespace_name offline;2. 從相應(yīng)的備份結(jié)果集中恢復(fù)關(guān)于這個(gè)表空間最近的備份。對于沒有采用帶庫備份的點(diǎn)可以直接從磁帶上恢復(fù);對于用帶庫備份的點(diǎn)用相應(yīng)的rman腳本來恢復(fù)。3. 恢復(fù)表空間:svrmgrlalter database recover tablespace tablespace_name;4. 使表空間online:svrmgrlalter t

18、ablespace tablespace_name online;5. 用適當(dāng)?shù)姆椒ㄟM(jìn)行數(shù)據(jù)庫全備份.system表空間損壞:1. 以mount方式啟動數(shù)據(jù)庫svrmgrlstartup mount;2. 從相應(yīng)的備份結(jié)果集中恢復(fù)system表空間最近的備份。對于沒有采用帶庫備份的點(diǎn)可以直接從磁帶上恢復(fù);對于用帶庫備份的點(diǎn)用相應(yīng)的rman腳本來恢復(fù)。3. 恢復(fù)system表空間:svrmgrlalter database recover tablespace system;4. 打開數(shù)據(jù)庫:svrmgrlalter database open;5. 用適當(dāng)?shù)姆椒ㄟM(jìn)行數(shù)據(jù)庫全備份。整個(gè)數(shù)據(jù)庫的所

19、有文件損壞:整個(gè)數(shù)據(jù)庫所有文件的損壞一般是在共享磁盤陣列發(fā)生無法恢復(fù)的災(zāi)難時(shí)才發(fā)生,這種情況下只能對數(shù)據(jù)庫進(jìn)行恢復(fù)。若數(shù)據(jù)庫的歸檔目錄也已經(jīng)丟失,則數(shù)據(jù)庫不可能做完全恢復(fù),會有用戶數(shù)據(jù)的丟失。沒采用帶庫備份的現(xiàn)場:1. 將最近的備份從磁帶上把各個(gè)文件解包到相應(yīng)的目錄下。2. 以mount方式打開數(shù)據(jù)庫:svrmgrlstartup mount;3. 恢復(fù)數(shù)據(jù)庫:svrmgrlrecover database until cancel;4. 打開數(shù)據(jù)庫:svrmgrlalter database open resetlogs;5. 用適當(dāng)?shù)姆椒ㄟM(jìn)行數(shù)據(jù)庫全備份。采用帶庫備份的現(xiàn)場:1. 以nom

20、ount方式打開數(shù)據(jù)庫:svrmgrlstartup nomount;2. 通過相應(yīng)的rman腳本進(jìn)行數(shù)據(jù)庫軟恢復(fù)。$rman cmdfile=hot_database_restore.rcv3. 打開數(shù)據(jù)庫:svrmgrlalter database open resetlogs;4. 用適當(dāng)?shù)姆椒ㄟM(jìn)行數(shù)據(jù)庫全備份。存在最近的數(shù)據(jù)庫完整冷備份前提下的一些經(jīng)典緊急情況的處理:數(shù)據(jù)文件,歸檔重作日志和控制文件同時(shí)丟失或損壞:無新增archives 時(shí)的狀況:條件和假設(shè):自上次鏡像備份以來尚未生成新的archive log(s); Archivelog Mode; 有同步的datafile(s)

21、和control file(s) 的鏡像(冷)拷貝恢復(fù)步驟:1. 將鏡像拷貝的datafile(s) 和control file(s) 抄送回原始地點(diǎn):$ cp /backup/good_one.dbf /orig_loc/bad_one.dbf$ cp /backup/control1.ctl /disk1/control1.ctl2. 以mount 選項(xiàng)啟動數(shù)據(jù)庫:$ svrmgrlsvrmgrl connect internalsvrmgrl startup mount3. 以舊的control file 來恢復(fù)數(shù)據(jù)庫:svrmgrl recover database usingback

22、up controlfileuntil cancel;* 介質(zhì)恢復(fù)完成(必須馬上cancel )4. Reset the logfiles (對啟動而言不可省略):svrmgrl alter database open resetlogs;5. 關(guān)閉數(shù)據(jù)庫并做一次全庫冷備份。新增archives 時(shí)的狀況:條件和假設(shè):自上次鏡像備份以來已經(jīng)生成新的archive log(s); Archivelog Mode; 有同步的datafile(s) 和control file(s) 的鏡像(冷)拷貝;archive log(s) 可用。恢復(fù)步驟:1. 如果數(shù)據(jù)庫尚未關(guān)閉,則首先把它關(guān)閉:$ svrm

23、grlsvrmgrl connect internalsvrmgrl shutdown abort2. 將備份文件抄送回原始地點(diǎn):所有Database Files所有Control Files(沒有archive(s) 或redo(s) 的情況下,control files 的更新無任何意義)所有On-Line Redo Logs (Not archives)init.ora file(選項(xiàng))3. 啟動數(shù)據(jù)庫:$ svrmgrlsvrmgrl connect internalsvrmgrl startup數(shù)據(jù)文件, 重作日志和控制文件同時(shí)丟失或損壞:條件和假設(shè):Archivelog Mode;

24、 有同步的所有所失文件的鏡像(冷)拷貝;archive log(s) 可用恢復(fù)步驟(必須采用不完全恢復(fù)的手法):1. 如果數(shù)據(jù)庫尚未關(guān)閉,則首先把它關(guān)閉:$ svrmgrlsvrmgrl connect internalsvrmgrl shutdown abort2. 將備份文件抄送回原始地點(diǎn):所有Database Files所有Control Files所有On-Line Redo Logs(Not archives)init.ora file(選項(xiàng))3. 啟動數(shù)據(jù)庫然而并不打開:svrmgrlstartup mount4. 做不完全數(shù)據(jù)庫恢復(fù),應(yīng)用所有從上次鏡像(冷)備份始積累起來的arc

25、hives:svrmgrl recover database until cancel using backup controlfile;.cancel5. Reset the logfiles (對啟動而言不可省略):svrmgrl alter database open resetlogs;6. 關(guān)閉數(shù)據(jù)庫并做一次全庫冷備份。數(shù)據(jù)文件和控制文件同時(shí)丟失或損壞:條件和假設(shè):Archivelog Mode; 有同步的datafile(s) 和control file(s) 的冷拷貝;archive log(s) 可用恢復(fù)步驟:1. 將冷拷貝的datafiles(s) 和control file

26、(s) 抄送回原始地點(diǎn):$ cp /backup/good_one.dbf /orig_loc/bad_one.dbf$ cp /backup/control1.ctl /disk1/control1.ctl2. 以mount 選項(xiàng)啟動數(shù)據(jù)庫:$ svrmgrlsvrmgrl connect internalsvrmgrl startup mount3. 以舊的control file 來恢復(fù)數(shù)據(jù)庫:svrmgrl recover database until cancel using backup controlfile;* 介質(zhì)恢復(fù)完成(須在應(yīng)用完最后一個(gè)archive log 后canc

27、el )4. Reset the logfiles (對啟動而言不可省略):svrmgrl alter database open resetlogs;重作日志和控制文件同時(shí)丟失或損壞時(shí):條件和假設(shè):Control Files 全部丟失或損壞;Archivelog Mode; 有Control Files 的鏡像(冷)拷貝恢復(fù)步驟:1. 如果數(shù)據(jù)庫尚未關(guān)閉,則首先把它關(guān)閉:$ svrmgrlsvrmgrl connect internalsvrmgrl shutdown abortsvrmgrlexit2. 以Control File 的鏡像(冷)拷貝覆蓋損壞了的Control File:$

28、cp /backup/control1.ctl /disk1/control1.ctl3. 啟動數(shù)據(jù)庫然而并不打開:$ svrmgrlsvrmgrl connect internalsvrmgrl startup mount4. Drop 壞掉的redo log (排除硬件故障):svrmgrl alter database drop logfile group 2;5. 重新創(chuàng)建redo log:svrmgrl alter database add logfile group 2 /orig_loc/log2.dbf size 10M;6. 以舊的control file 來恢復(fù)數(shù)據(jù)庫:sv

29、rmgrl recover database until cancel using backup controlfile;(必須馬上cancel )7. Reset the logfiles (對啟動而言不可省略):svrmgrl alter database open resetlogs;8. 關(guān)閉數(shù)據(jù)庫并做一次全庫冷備份只發(fā)生歸檔重作日志丟失或損壞時(shí):根據(jù)不同環(huán)境和情況,選擇下述手段之一:a. 馬上backup 全部datafiles (如果系統(tǒng)采用一般熱備份或RMAN 熱備份)b. 馬上正常關(guān)閉數(shù)據(jù)庫并進(jìn)行冷備份(如果系統(tǒng)采用冷備份)c. 冒險(xiǎn)前進(jìn)!不做備份而讓數(shù)據(jù)庫接著跑,直等到下一個(gè)

30、備份周期再做備份。這是在賭數(shù)據(jù)庫在下一個(gè)備份周期到來之前不會有需要恢復(fù)的錯(cuò)誤發(fā)生。注意:冒險(xiǎn)前進(jìn)的選擇:如果發(fā)生錯(cuò)誤而需要數(shù)據(jù)庫恢復(fù),則最多只能恢復(fù)到出問題archive log 之前的操作現(xiàn)場。從另一個(gè)角度講,archive log(s) 出現(xiàn)問題時(shí),數(shù)據(jù)庫若不需要恢復(fù)則其本身并沒有任何問題。Oracle邏輯結(jié)構(gòu)故障的處理方法:邏輯結(jié)構(gòu)的故障一般指由于人為的誤操作而導(dǎo)致重要數(shù)據(jù)丟失的情況。在這種情況下數(shù)據(jù)庫物理結(jié)構(gòu)是完整的也是一致的。對于這種情況采取對原來數(shù)據(jù)庫的全恢復(fù)是不合適的,我們一般采用三種方法來恢復(fù)用戶數(shù)據(jù)。采用exp/imp工具來恢復(fù)用戶數(shù)據(jù):如果丟失的數(shù)據(jù)存在一個(gè)以前用exp命令

31、的備份,則可以才用這種方式。1. 在數(shù)據(jù)庫內(nèi)創(chuàng)建一個(gè)臨時(shí)用戶:svrmgrlcreate user test_user identified by test;svrmgrlgrant connect,resource to test_user;2. 從以前exp命令備份的文件中把丟失數(shù)據(jù)的表按照用戶方式倒入測試用戶:$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)的D

32、ML語句將丟失的數(shù)據(jù)從測試用戶恢復(fù)到原用戶。4. 將測試用戶刪除:svrmgrldrop user test_user cascede;采用logminer來恢復(fù)用戶數(shù)據(jù):Logminer是Oracle提供的一個(gè)日志分析工具。它可以根據(jù)數(shù)據(jù)字典對在線聯(lián)機(jī)日志、歸檔日志進(jìn)行分析,從而可以獲得數(shù)據(jù)庫的各種DML操作的歷史記錄以及各種DML操作的回退信息。根據(jù)這些用戶就可以將由于誤操作而丟失的數(shù)據(jù)重新加入數(shù)據(jù)庫內(nèi)。1. 確認(rèn)數(shù)據(jù)庫的utl_file_dir參數(shù)已經(jīng)設(shè)置,如果沒有則需要把這個(gè)參數(shù)加入Oracle的初始化參數(shù)文件,然后重新啟動數(shù)據(jù)庫。下面例子中假設(shè)utl_file_dir=/opt/Or

33、acle/db01;2. 創(chuàng)建logminer所需要的數(shù)據(jù)字典信息,假設(shè)生成的數(shù)據(jù)字典文本文件為dict.ora:svrmgrlexecute dbms_logmnr_d.build(dictionary_filename=dict.ora, dictionary_location=/opt/Oracle/db01);3. 確定所需要分析的日志或者歸檔日志的范圍。這可以根據(jù)用戶誤操作的時(shí)間來確定大概的日志范圍。假設(shè)用戶誤操作時(shí)可能的日志文件為/opt/Oracle/db02/oradata/ORCL/redo3.log和歸檔日志/opt/Oracle/arch/orcl/orclarc_1_1

34、13.ora。4. 創(chuàng)建要分析的日志文件列表,按日志文件的先后順序依次加入:svrmgrlexecute 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

35、-06-28 12:00:00和2003-06-28 13:00:00之間:svrmgrlexecute 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é)果:svrmgrlselect operation,sql_redo,sql_undo from

36、v$logmnr_contents;7. 根據(jù)分析結(jié)果修復(fù)數(shù)據(jù)。8.結(jié)束logmnr:svrmgrldbms_logmnr.end_logmnr;9. 用適當(dāng)?shù)姆椒▽υ瓟?shù)據(jù)庫進(jìn)行數(shù)據(jù)庫全備份。利用備份恢復(fù)用戶數(shù)據(jù):采用這種方法時(shí)并不是在原數(shù)據(jù)庫進(jìn)行恢復(fù),而是利用數(shù)據(jù)庫備份在新的機(jī)器上重新建立一個(gè)新的數(shù)據(jù)庫。通過備份恢復(fù)在新機(jī)器上將數(shù)據(jù)庫恢復(fù)到用戶誤操作前,這樣就可以獲得丟失的數(shù)據(jù)將其恢復(fù)到原數(shù)據(jù)庫。1. 在新的機(jī)器上安裝數(shù)據(jù)庫軟件。2. 對于采用帶庫備份的現(xiàn)場,需要在新的數(shù)據(jù)庫服務(wù)器上安裝調(diào)試相應(yīng)的備份管軟件。3. 根據(jù)用戶誤操作的時(shí)間點(diǎn)進(jìn)行基于時(shí)間點(diǎn)的數(shù)據(jù)庫恢復(fù)操作。對于沒有采用帶庫備份的現(xiàn)

37、場,可以選取用戶誤操作前最近的備份磁帶進(jìn)行恢復(fù);對于才用帶庫備份的點(diǎn)可以通過基于時(shí)間恢復(fù)點(diǎn)恢復(fù)的rman腳本來進(jìn)行恢復(fù)。4.重新打開數(shù)據(jù)庫:svrmgrlalter database open resetlogs;5. 從新的數(shù)據(jù)庫中獲取丟失的用戶數(shù)據(jù),通過DML操作將其恢復(fù)到原數(shù)據(jù)庫中。6. 用適當(dāng)?shù)姆椒▽υ瓟?shù)據(jù)庫進(jìn)行數(shù)據(jù)庫全備份。用ORACLEE8i修復(fù)數(shù)數(shù)據(jù)庫壞塊的的三種方法在進(jìn)行SUN CLUSTTER雙機(jī)切切換、意外斷斷電或其它情情況下,有時(shí)時(shí)會發(fā)生共享享盤MOUNNT不上的情情況,需要使使用FSCKK對共享盤進(jìn)進(jìn)行修復(fù)。修修復(fù)完成后,在在數(shù)據(jù)庫啟動動過程中,卻卻又出現(xiàn)數(shù)數(shù)據(jù)塊損壞,

38、無無法啟動數(shù)據(jù)據(jù)庫的現(xiàn)象象,此時(shí),可可以根據(jù)不同同的數(shù)據(jù)塊損損壞類型,檢檢測并修復(fù)錯(cuò)錯(cuò)誤。在此介介紹三種使用用Oraclle8i修復(fù)復(fù)損壞數(shù)據(jù)塊塊的方法。 一、數(shù)據(jù)塊損壞壞,錯(cuò)誤代碼碼為ORA-015788 ORA-11115 I/OO ERROOR REAADING BLOCKK 通常后跟ORAA-737XX錯(cuò)誤與操作作系統(tǒng)錯(cuò)誤(如如UNIX中中的錯(cuò)誤號55) 產(chǎn)生原因: 1 硬件問題題(磁盤控制制器問題或磁磁盤問題) 2 物理級的的數(shù)據(jù)塊損壞壞(通常由前前一原因造成成) 3 處理巨型型文件時(shí),后后跟錯(cuò)誤代碼碼ORA-77371 確定故障原因與與恢復(fù)的方法法: 1 查看allert.llog

39、文件中中其它ORAA-11155錯(cuò)誤的發(fā)生生情況: 1) 如果指向向不同磁盤的的文件,則是是磁盤控制器器的問題,查查看V$DAATAFILLE,有哪些些文件位于該該控制器下,轉(zhuǎn)轉(zhuǎn)到第二步。 2) 如果指向向相同磁盤的的不同文件,則則是磁盤的問問題,轉(zhuǎn)到第第二步。 3) 如果指向向同一個(gè)文件件,執(zhí)行以下下語句查找文文件名: SELECT SEGMEENT_NAAME,SEEGMENTT_TYPEE FROMM DBA_EXTENNTS WHHERE FFILE_IID= ANND BETTWEEN BLOCKK_ID AAND BLLOCK_IID+BLOOCKS-11;其中,文件號與與塊號是O

40、RRA-11115中指出的的,如果該查查詢持續(xù)指向向某表或索引引,則重建它它們即可。 2 如果文件件是SYSTTEM表空間間,或處于NNOARCHHIVELOOG模式,關(guān)關(guān)閉數(shù)據(jù)庫,轉(zhuǎn)轉(zhuǎn)到第四步。 3 如果數(shù)據(jù)據(jù)庫處于ARRCHIVEELOG模式式,仍應(yīng)關(guān)閉閉數(shù)據(jù)庫,如如果不能關(guān)閉閉數(shù)據(jù)庫,則則將相應(yīng)的數(shù)數(shù)據(jù)文件脫機(jī)機(jī):ALTEER DATABBASE DDATAFIILE 文文件名 OOFFLINNE; 4 試著將數(shù)數(shù)據(jù)文件拷貝貝到別的磁盤盤。 5 如果拷貝貝失敗,則文文件將丟失。 6 STARRTUP MMOUNT; 7 將數(shù)據(jù)文文件重命名為為成功拷貝到到別的磁盤的的文件名: ALTER

41、DDATABAASE REENAME FILE 老路徑文文件名 TTO 新路路徑文件名; 8 ALTEER DATTABASEE OPENN;9 RECOOVER DDATAFIILE 文件件名; ALTER DDATABAASE DAATAFILLE 文件件名 ONNLINE; 二、回滾段需要要恢復(fù)如果回滾段處于于NEED RECOVVERY狀態(tài)態(tài),需要執(zhí)行行以下步驟進(jìn)進(jìn)行恢復(fù): 1 查看所有有聯(lián)機(jī)的表空空間與數(shù)據(jù)文文件 2 在iniit.oraa文件中加入入eventt = 110015 tracee namee conttext fforeveer,levvel 10,這這將生成一個(gè)個(gè)追

42、蹤文件,其其中含有事務(wù)務(wù)與回滾的信信息。 3 關(guān)閉并重重新打開數(shù)據(jù)據(jù)庫。 4 查看TRRACE文件件,應(yīng)有errror rrecoveery txx(#,#) objeect #.TX(#,#),指指出事務(wù)信息息,其中obbject #與syss.dba_objeccts中的oobjectt_id相同同。 5 使用以下下查詢找出正正在進(jìn)行恢復(fù)復(fù)的對象: SELECT ownerr,objeect_naame,obbject_type,statuus FROOM dbaa_objeects WWHERE objeect_idd=; 6 必須刪除除該對象以釋釋放回滾塊。 三、檢測與修復(fù)復(fù)損壞塊的常

43、常用方法:(一)使用初始始化參數(shù)DBB_BLOCCK_CHEECKINGG與DB_BBLOCK_CHECKKSUM。 當(dāng)塊改變時(shí),DDB_BLOOCK_CHHECKINNG對塊進(jìn)行行邏輯校驗(yàn)。將將防止發(fā)生110210 與102111錯(cuò)誤。 (二)使用DBBMS_REEPAIR包包,由dbmmsrpr.sql與pprvtrppr.plbb生成該包在在特定表中生生成損壞塊的的信息。 1DBMS_REPAIIR.ADMMIN_TAABLES用用于創(chuàng)建與刪刪除存儲損壞壞塊的表。其其中TABLLE_TYPPE為:REEPAIR_TABLEE(表),OORPHANN_TABLLE(索引);ACTIOON為

44、:CRREATE_ACTIOON(創(chuàng)建表表),PURRGE_ACCTION(刪刪除無關(guān)數(shù)據(jù)據(jù)),DROOP_ACTTION(刪刪除表)。例例: dbms_reepair.adminn_tablles(RREPAIRR_TABLLE,DBBMS_REEPAIR.REPAIIR_TABBLE,DBBMS_REEPAIR.CREATTE_ACTTION,temp_data); 2DBMS_REPAIIR.CHEECK_OBBJECT檢檢查表、索引引、分區(qū)中的的塊損壞。其其中OBJEECT_TYYPE為:TTABLE_OBJECCT(表),IINDEX_OBJECCT(索引), REPAIR_TABL

45、E_NAME(用于存儲損壞塊信息的表)。例: dbms_reepair.checkk_objeect(OORATRAAIN,LOCATTIONS,corrrupt_ccount=:cc); 3使用以下語語句查詢塊損損壞信息: SELECT objecct_namme, reelativve_fille_no, blocck_id, markked_coorruptt, corrrupt_descrriptioon, reepair_descrriptioon FROOM reppair_ttable; 4將塊標(biāo)志為為損壞的:ddbms_rrepairr.fix_corruupt_bllocks

46、(ORATTRAIN,LOCCATIONNS,fiix_couunt=:fc); 5跳過損壞塊塊:dbmss_repaair.skkip_coorruptt_bloccks(OORATRAAIN, LOCAATIONSS); 其中OBJECCT_TYPPE為 :TTABLE_OBJECCT(表),CCLUSTEER_OBJJECT(索索引)。 6使用REBBUILD_FREELLISTS重重建損壞的空空閑列表:DDBMS_RREPAIRR.rebuuild_ffreeliists 7使用以下方方法查找指向向損壞塊的索索引: (1) 創(chuàng)建存存放指向壞塊塊索引的表 (2) dbmms_reppai

47、r.ddump_oorphann_keyss(ORAATRAINN,LOOC_PK, orphan_tablee_namee=ORRPHAN_TAB1,key_countt=:kcc); (3) SELLECT iindex_name, counnt(*) FROM orphaan_keyy_tablle WHEERE taable_nname = CLAASSES GROUUP BY indexx_namee; (4) 重建具具有orphhan keeys的索引引 限制:不能分析析Indexx-orgaanizedd tablles 與 LOB indexxes,DUUMP_ORRPHAN_

48、KEYS不不能對bittmap與 functtion-bbased indexxes操作。 (三)使用SQQL命令A(yù)NNALYZEE TABLLE|INDDEX VALIIDATE STRUCCTURE utlvaliid.sqll.創(chuàng)建含有有損壞塊信息息的INVAALID_RROWS表,AANALYZZE TABBLE VAALIDATTE STRUCCTURE CASCAADE同時(shí)校校驗(yàn)表與索引引。 (四)使用DBBVERIFFY DBVERIFFY是一個(gè)外外部工具,所所以對數(shù)據(jù)庫庫影響很小??煽捎糜谠趯鋫浞菸募截愗惢卦恢们扒皺z驗(yàn)備份文文件的完好性性,并定位數(shù)數(shù)據(jù)塊損壞。命命令如下:

49、 dbv /oppt/Oraacle/ddb02/ooradatta/datta01.ddbf sttart=11 end=500 llogfille=dbvv.log Oracle數(shù)數(shù)據(jù)庫應(yīng)用中中實(shí)現(xiàn)漢字“同音”查詢接下來我們要編編寫一個(gè)函數(shù)數(shù)來實(shí)現(xiàn)獲取取漢字拼音編編碼。在編寫寫這個(gè)函數(shù)的的過程中我發(fā)發(fā)現(xiàn)了Oraacle處理理中英文混合合字符串的bbug,因此此函數(shù)中采用用在任何字符符串前添加一一個(gè)號來強(qiáng)制Orracle把把此字符串當(dāng)當(dāng)作雙字節(jié)來來處理。代碼碼如下:create or reeplacee funcction GetPiinYin(Keywoord inn varcchar2)

50、 retuurn vaarcharr2 isbbeginDDECLARRE i int; j innt; PPinYinn varcchar2(500); Temmp varrchar22(10); TemmpStr varchhar2(22);beggin i:=11; j:=LLengthh(|Keeywordd); PPinYinn:=; Whiile i=j LOOOP TemppStr:=substtr(|KeeyWordd,i,1); selecct HZPPY INTTO Temmp froom BJXXKS.t_Pinyiin Wheere Nuum=(seelect max(

51、nnum) ffrom BBJXKS.t_Pinnyin WWhere Num=ASCIII(TemppStr); Temp:=Repllace(TTemp,*,TeempStrr); Tempp:=Repplace(Temp,); PinYiin:=PiinYin|Tempp; i:=i+1; EEnd looop; retturn(PPinYinn);endd;end GetPiinYin;好了,現(xiàn)在可以以用這個(gè)函數(shù)數(shù)來實(shí)現(xiàn)漢字字的同音查詢詢了。如查詢詢表tablle1中字段段A中讀音和和“啊”一樣的記錄錄,SQL語語句可以這樣樣寫:select * froom tabble1 wwhere getpiinyin(A) liike %a% Oracle大大數(shù)據(jù)量的導(dǎo)導(dǎo)入和導(dǎo)出在Oraclee中批量數(shù)據(jù)據(jù)的導(dǎo)出是借借助sqlpplus的sspool來來實(shí)現(xiàn)的。批批量數(shù)據(jù)的導(dǎo)導(dǎo)入是通過ssqlloaad來實(shí)現(xiàn)的的。大量數(shù)據(jù)據(jù)的導(dǎo)出部分分如下:/* sql腳本本部分 deemo.sqq

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論