Oracle物理結構故障的處理方法_第1頁
Oracle物理結構故障的處理方法_第2頁
Oracle物理結構故障的處理方法_第3頁
Oracle物理結構故障的處理方法_第4頁
Oracle物理結構故障的處理方法_第5頁
已閱讀5頁,還剩11頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Oracle快速刪除重復的記錄做項目的時候,一位同事導數據的時候,不小心把一個表中的數據全都搞重了,也就是說,這個表里所有的記錄都有一條重復的。這個表的數據是千萬級的,而且是生產系統。也就是說,不能把所有的記錄都刪除,而且必須快速的把重復記錄刪掉。對此,總結了一下刪除重復記錄的方法,以及每種方法的優缺點。為了陳訴方便,假設表名為Tbl,表中有三列col1,col2,col3,其中col1,col2是主鍵,并且,col1,col2上加了索引。1、通過創建臨時表可以把數據先導入到一個臨時表中,然后刪除原表的數據,再把數據導回原表,SQL語句如下:create table tbl_tmp (sele

2、ct distinct * from tbl);truncate table tbl;/清空表記錄insert into tbl select * from tbl_tmp;/將臨時表中的數據插回來。這種方法可以實現需求,但是很明顯,對于一個千萬級記錄的表,這種方法很慢,在生產系統中,這會給系統帶來很大的開銷,不可行。2、利用rowid在Oracle中,每一條記錄都有一個rowid,rowid在整個數據庫中是唯一的,rowid確定了每條記錄是Oracle中的哪一個數據文件、塊、行上。在重復的記錄中,可能所有列的內容都相同,但rowid不會相同。SQL語句如下:delete from tbl w

3、here rowid in (select a.rowid from tbl a, tbl b where a.rowid>b.rowid and a.col1=b.col1 and a.col2 = b.col2)如果已經知道每條記錄只有一條重復的,這個sql語句適用。但是如果每條記錄的重復記錄有N條,這個N是未知的,就要考慮適用下面這種方法了。3、利用max或min函數這里也要使用rowid,與上面不同的是結合max或min函數來實現。SQL語句如下delete from tbl a where rowid not in (select max(b.rowid) from

4、tbl b where a.col1=b.col1 and a.col2 = b.col2);/這里max使用min也可以或者用下面的語句delete from tbl a where rowid < (select max(b.rowid) from tbl b where a.col1=b.col1 and a.col2 = b.col2);/這里如果把max換成min的話,前面的where子句中需要把"<"改為">"跟上面的方法思路基本是一樣的,不過使用了group by,減少了顯性的比較條件,提高效

5、率。SQL語句如下:delete from tbl where rowid not in (select max(rowid) from tbl t group by t.col1, t.col2 );delete from tbl where (col1, col2) in (select col1,col2 from tbl group by col1,col2 having  count(*) > 1) and rowid  not in (select

6、  min(rowid) from tbl group by col1,col2 having  count(*) > 1)還有一種方法,對于表中有重復記錄的記錄比較少的,并且有索引的情況,比較適用。假定col1,col2上有索引,并且tbl表中有重復記錄的記錄比較少,SQL語句如下4、利用group by,提高效率Oracle物理結構故障的處理方法:Oracle物理結構故障是指構成數據庫的各個物理文件損壞而導致的各種數據庫故障。這些故障可能是由于硬件故障造成的,也可能是人為誤操作而引起。所以我們首

7、先要判斷問題的起因,如果是硬件故障則首先要解決硬件問題。在無硬件問題的前提下我們才能按照下面的處理方發來進一步處理。控制文件損壞:控制文件記錄了關于Oracle的重要配置信息,如數據庫名、字符集名字、各個數據文件、日志文件的位置等等信息。控制文件的損壞,會導致數據庫異常關閉。一旦缺少控制文件,數據庫也無法啟動,這是一種比較嚴重的錯誤。可以通過查詢數據庫的日志文件來定位損壞了的控制文件。日志文件位于$ORACLE_BASE/admin/bdump/alert_ORCL.ora.損壞單個控制文件:1. 確保數據庫已經關閉,如果沒有用下面的命令來關閉數據庫:svrmgrl>shutdown i

8、mmediate;2. 查看初始化文件$ORACLE_BASE/admin/pfile/initORCL.ora,確定所有控制文件的路徑。3. 用操作系統命令將其它正確的控制文件覆蓋錯誤的控制文件。4. 用下面的命令重新啟動數據庫svrmgrl>startup;5. 用適當的方法進行數據庫全備份。損壞所有的控制文件:1. 確保數據庫已經關閉,如果沒有用下面的命令來關閉數據庫:svrmgrl>shutdown immediate;2. 從相應的備份結果集中恢復最近的控制文件。對于沒有采用帶庫備份的點可以直接從磁帶上將最近的控制文件備份恢復到相應目錄;對于采用帶庫備份的點用相應的rma

9、n腳本來恢復最近的控制文件。3. 用下面的命令來創建產生數據庫控制文件的腳本:svrmgrl>startup mount;svrmgrl>alter database backup controlfile to trace noresetlogs;4. 修改第三步產生的trace文件,將其中關于創建控制文件的一部分語句拷貝出來并做些修改,使得它能夠體現最新的數據庫結構。假設產生的sql文件名字為createcontrol.sql.注意:Trace文件的具體路徑可以在執行完第3)步操作后查看$ORACLE_BASE/admin/bdump/alert_ORCL.ora文件來確定。5.

10、 用下面命令重新創建控制文件:svrmgrl>shutdown abort;svrmgrl>startup nomount;svrmgrl>createcontrol.sql;6. 用適當的方法進行數據庫全備份。重做日志文件損壞:數據庫的所有增、刪、改都會記錄入重做日志。如果當前激活的重做日志文件損壞,會導致數據庫異常關閉。非激活的重做日志最終也會因為日志切換變為激活的重做日志,所以損壞的非激活的重做日志最終也會導致數據庫的異常終止。在ipas/mSwitch中每組重做日志只有一個成員,所以在下面的分析中只考慮重做日志組損壞的情況,而不考慮單個重做日志成員損壞的情況。確定損壞

11、的重做日志的位置及其狀態:1. 如果數據庫處于可用狀態:select * from v$logfile;svrmgrl>select * from v$log;2. 如果數據庫處于已經異常終止:svrmlgr>startup mount;svrmgrl>select * from v$logfile;svrmgrl>select * from v$log;其中,logfile的狀態為INVALID表示這組日志文件出現已經損壞;log狀態為Inactive:表示重做日志文件處于非激活狀態;Active: 表示重做日志文件處于激活狀態;Current:表示是重做日志為當前正

12、在使用的日志文件。損壞的日志文件處于非激活狀態:1. 刪除相應的日志組:svrmgrl>alter database drop logfile group group_number;2. 重新創建相應的日志組:svrmgrl>alter database add log file group group_number (log_file_descritpion,) size log_file_size;損壞的日志文件處于激活狀態且為非當前日志:1. 清除相應的日志組:svrmgrl>alter database clear unarchived logfile group g

13、roup_number;損壞的日志文件為當前活動日志文件:用命令清除相應的日志組:svrmgrl>alter database clear unarchived logfile group group_number;如果清除失敗,則只能做基于時間點的不完全恢復。打開數據庫并且用適當的方法進行數據庫全備份:svrmgrl>alter database open;部分數據文件損壞:若損壞的數據文件屬于非system表空間,則數據庫仍然可以處于打開狀態可以進行操作,只是損壞的數據文件不能訪問。這時在數據庫打開狀態下可以單獨對損壞的數據文件進行恢復。若是system表空間的數據文件損壞則數

14、據庫系統會異常終止。這時數據庫只能以Mount方式打開,然后再對數據文件進行恢復。可以通過查看數據庫日志文件來判斷當前損壞的數據文件到底是否屬于system表空間。非system表空間的數據文件損壞1. 確定損壞的文件名字:svrmgrl>select name from v$datafile where status=INVALID;2. 將損壞的數據文件處于offline狀態:svrmgrl>alter database datafile datafile_name offline;3. 從相應的備份結果集中恢復關于這個數據文件的最近的備份。對于沒有采用帶庫備份的點可以直接從磁

15、帶上恢復;對于用帶庫備份的點用相應的rman腳本來恢復。4. 恢復數據文件:svrmgrl>alter database recover datafile file_name;5. 使數據庫文件online:svrmgrl>alter database datafile datafile_name online;6. 用適當的方法進行數據庫全備份。system表空間的數據文件損壞:1. 以mount方式啟動數據庫svrmgrl>startup mount;2. 從相應的備份結果集中恢復關于這個數據文件的最近的備份。對于沒有采用帶庫備份的點可以直接從磁帶上恢復;對于用帶庫備份的

16、點用相應的rman腳本來恢復。3. 恢復system表空間:svrmgrl>alter database recover datafile datafile_name;4. 打開數據庫:svrmgrl>alter database open;5. 用適當的方法進行數據庫全備份。表空間損壞:若非system表空間已經損壞,則數據庫仍然可以處于打開狀態可以進行操作,只是損壞的表空間不能訪問。這樣在數據庫打開狀態下可以單獨對損壞的表空間進行恢復。若是system表空間損壞則數據庫系統會異常終止。這時數據庫只能以Mount方式打開,然后再對表空間進行恢復。可以通過查看數據庫日志文件來判斷當

17、前損壞的表空間是否是system表空間.非system表空間損壞:1. 將損壞的表空間處于offline狀態:svrmgrl>alter tablespace tablespace_name offline;2. 從相應的備份結果集中恢復關于這個表空間最近的備份。對于沒有采用帶庫備份的點可以直接從磁帶上恢復;對于用帶庫備份的點用相應的rman腳本來恢復。3. 恢復表空間:svrmgrl>alter database recover tablespace tablespace_name;4. 使表空間online:svrmgrl>alter tablespace tablesp

18、ace_name online;5. 用適當的方法進行數據庫全備份.system表空間損壞:1. 以mount方式啟動數據庫svrmgrl>startup mount;2. 從相應的備份結果集中恢復system表空間最近的備份。對于沒有采用帶庫備份的點可以直接從磁帶上恢復;對于用帶庫備份的點用相應的rman腳本來恢復。3. 恢復system表空間:svrmgrl>alter database recover tablespace system;4. 打開數據庫:svrmgrl>alter database open;5. 用適當的方法進行數據庫全備份。整個數據庫的所有文件損壞

19、:整個數據庫所有文件的損壞一般是在共享磁盤陣列發生無法恢復的災難時才發生,這種情況下只能對數據庫進行恢復。若數據庫的歸檔目錄也已經丟失,則數據庫不可能做完全恢復,會有用戶數據的丟失。沒采用帶庫備份的現場:1. 將最近的備份從磁帶上把各個文件解包到相應的目錄下。2. 以mount方式打開數據庫:svrmgrl>startup mount;3. 恢復數據庫:svrmgrl>recover database until cancel;4. 打開數據庫:svrmgrl>alter database open resetlogs;5. 用適當的方法進行數據庫全備份。采用帶庫備份的現場:

20、1. 以nomount方式打開數據庫:svrmgrl>startup nomount;2. 通過相應的rman腳本進行數據庫軟恢復。$rman cmdfile=hot_database_restore.rcv3. 打開數據庫:svrmgrl>alter database open resetlogs;4. 用適當的方法進行數據庫全備份。存在最近的數據庫完整冷備份前提下的一些經典緊急情況的處理:數據文件,歸檔重作日志和控制文件同時丟失或損壞:無新增archives 時的狀況:條件和假設:自上次鏡像備份以來尚未生成新的archive log(s); Archivelog Mode; 有

21、同步的datafile(s) 和control file(s) 的鏡像(冷)拷貝恢復步驟:1. 將鏡像拷貝的datafile(s) 和control file(s) 抄送回原始地點:$ cp /backup/good_one.dbf /orig_loc/bad_one.dbf$ cp /backup/control1.ctl /disk1/control1.ctl2. 以mount 選項啟動數據庫:$ svrmgrlsvrmgrl> connect internalsvrmgrl> startup mount3. 以舊的control file 來恢復數據庫:svrmgrl>

22、 recover database using backup controlfile until cancel;* 介質恢復完成(必須馬上cancel )4. Reset the logfiles (對啟動而言不可省略):svrmgrl> alter database open resetlogs;5. 關閉數據庫并做一次全庫冷備份。新增archives 時的狀況:條件和假設:自上次鏡像備份以來已經生成新的archive log(s); Archivelog Mode; 有同步的datafile(s) 和control file(s) 的鏡像(冷)拷貝;archive

23、 log(s) 可用。恢復步驟:1. 如果數據庫尚未關閉,則首先把它關閉:$ svrmgrlsvrmgrl> connect internalsvrmgrl> shutdown abort2. 將備份文件抄送回原始地點:所有Database Files所有Control Files(沒有archive(s) 或redo(s) 的情況下,control files 的更新無任何意義)所有On-Line Redo Logs (Not archives)init.ora file(選項)3. 啟動數據庫:$ svrmgrlsvrmgrl> connect internalsvrmg

24、rl> startup數據文件, 重作日志和控制文件同時丟失或損壞:條件和假設:Archivelog Mode; 有同步的所有所失文件的鏡像(冷)拷貝;archive log(s) 可用恢復步驟(必須采用不完全恢復的手法):1. 如果數據庫尚未關閉,則首先把它關閉:$ svrmgrlsvrmgrl> connect internalsvrmgrl> shutdown abort2. 將備份文件抄送回原始地點:所有Database Files所有Control Files所有On-Line Redo Logs(Not archives)init.ora file(選項)3. 啟

25、動數據庫然而并不打開:svrmgrl>startup mount4. 做不完全數據庫恢復,應用所有從上次鏡像(冷)備份始積累起來的archives:svrmgrl> recover database until cancel using backup controlfile;.cancel5. Reset the logfiles (對啟動而言不可省略):svrmgrl> alter database open resetlogs;6. 關閉數據庫并做一次全庫冷備份。數據文件和控制文件同時丟失或損壞:條件和假設:Archivelog Mode; 有同步的datafile(s)

26、 和control file(s) 的冷拷貝;archive log(s) 可用恢復步驟:1. 將冷拷貝的datafiles(s) 和control file(s) 抄送回原始地點:$ cp /backup/good_one.dbf /orig_loc/bad_one.dbf$ cp /backup/control1.ctl /disk1/control1.ctl2. 以mount 選項啟動數據庫:$ svrmgrlsvrmgrl> connect internalsvrmgrl> startup mount3. 以舊的control file 來恢復數據庫:svrmgrl>

27、 recover database until cancel using backup controlfile;* 介質恢復完成(須在應用完最后一個archive log 后cancel )4. Reset the logfiles (對啟動而言不可省略):svrmgrl> alter database open resetlogs;重作日志和控制文件同時丟失或損壞時:條件和假設:Control Files 全部丟失或損壞;Archivelog Mode; 有Control Files 的鏡像(冷)拷貝恢復步驟:1. 如果數據庫尚未關閉,則首先把它關閉:$ svrmgrlsvrmgrl&

28、gt; connect internalsvrmgrl> shutdown abortsvrmgrl>exit2. 以Control File 的鏡像(冷)拷貝覆蓋損壞了的Control File:$ cp /backup/control1.ctl /disk1/control1.ctl3. 啟動數據庫然而并不打開:$ svrmgrlsvrmgrl> connect internalsvrmgrl> startup mount4. Drop 壞掉的redo log (排除硬件故障):svrmgrl> alter database drop logfile grou

29、p 2;5. 重新創建redo log:svrmgrl> alter database add logfile group 2 '/orig_loc/log2.dbf' size 10M;6. 以舊的control file 來恢復數據庫:svrmgrl> recover database until cancel using backup controlfile;(必須馬上cancel )7. Reset the logfiles (對啟動而言不可省略):svrmgrl> alter database open resetlogs;8. 關閉數據庫并做一次全

30、庫冷備份只發生歸檔重作日志丟失或損壞時:根據不同環境和情況,選擇下述手段之一:a. 馬上backup 全部datafiles (如果系統采用一般熱備份或RMAN 熱備份)b. 馬上正常關閉數據庫并進行冷備份(如果系統采用冷備份)c. 冒險前進!不做備份而讓數據庫接著跑,直等到下一個備份周期再做備份。這是在賭數據庫在下一個備份周期到來之前不會有需要恢復的錯誤發生。注意:冒險前進的選擇:如果發生錯誤而需要數據庫恢復,則最多只能恢復到出問題archive log 之前的操作現場。從另一個角度講,archive log(s) 出現問題時,數據庫若不需要恢復則其本身并沒有任何問題。Oracle邏輯結構故

31、障的處理方法:邏輯結構的故障一般指由于人為的誤操作而導致重要數據丟失的情況。在這種情況下數據庫物理結構是完整的也是一致的。對于這種情況采取對原來數據庫的全恢復是不合適的,我們一般采用三種方法來恢復用戶數據。采用exp/imp工具來恢復用戶數據:如果丟失的數據存在一個以前用exp命令的備份,則可以才用這種方式。1. 在數據庫內創建一個臨時用戶:svrmgrl>create user test_user identified by test;svrmgrl>grant connect,resource to test_user;2. 從以前exp命令備份的文件中把丟失數據的表按照用戶方

32、式倒入測試用戶:$imp system/manager file=export_file_name tables=(lost_data_table_name) fromuser=lost_data_table_owner touser=test_user constraint=n;3. 用相應的DML語句將丟失的數據從測試用戶恢復到原用戶。4. 將測試用戶刪除:svrmgrl>drop user test_user cascede;采用logminer來恢復用戶數據:Logminer是Oracle提供的一個日志分析工具。它可以根據數據字典對在線聯機日志、歸檔日志進行分析,從而可以獲得數據

33、庫的各種DML操作的歷史記錄以及各種DML操作的回退信息。根據這些用戶就可以將由于誤操作而丟失的數據重新加入數據庫內。1. 確認數據庫的utl_file_dir參數已經設置,如果沒有則需要把這個參數加入Oracle的初始化參數文件,然后重新啟動數據庫。下面例子中假設utl_file_dir=/opt/Oracle/db01;2. 創建logminer所需要的數據字典信息,假設生成的數據字典文本文件為dict.ora:svrmgrl>execute dbms_logmnr_d.build(dictionary_filename=>'dict.ora', diction

34、ary_location=>'/opt/Oracle/db01);3. 確定所需要分析的日志或者歸檔日志的范圍。這可以根據用戶誤操作的時間來確定大概的日志范圍。假設用戶誤操作時可能的日志文件為/opt/Oracle/db02/oradata/ORCL/redo3.log和歸檔日志/opt/Oracle/arch/orcl/orclarc_1_113.ora。4. 創建要分析的日志文件列表,按日志文件的先后順序依次加入:svrmgrl>execute dbms_logmnr.add_logfile(logfilename=>/opt/Oracle/arch/orcl/o

35、rclarc_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. 開始日志分析,假設需要分析的時間在2003-06-28 12:00:00和2003-06-28 13:00:00之間:svrmgrl>execute dbms_logmnr.start_logmnr(dictfilename=&

36、gt; /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. 獲取分析結果:svrmgrl>select operation,sql_redo,sql_undo from v$logmnr_contents;7. 根據分析結果修復數據。8.結束logmnr:svrmgrl>dbms_logmnr.end_logmnr

37、;9. 用適當的方法對原數據庫進行數據庫全備份。利用備份恢復用戶數據:采用這種方法時并不是在原數據庫進行恢復,而是利用數據庫備份在新的機器上重新建立一個新的數據庫。通過備份恢復在新機器上將數據庫恢復到用戶誤操作前,這樣就可以獲得丟失的數據將其恢復到原數據庫。1. 在新的機器上安裝數據庫軟件。2. 對于采用帶庫備份的現場,需要在新的數據庫服務器上安裝調試相應的備份管軟件。3. 根據用戶誤操作的時間點進行基于時間點的數據庫恢復操作。對于沒有采用帶庫備份的現場,可以選取用戶誤操作前最近的備份磁帶進行恢復;對于才用帶庫備份的點可以通過基于時間恢復點恢復的rman腳本來進行恢復。4.重新打開數據庫:sv

38、rmgrl>alter database open resetlogs;5. 從新的數據庫中獲取丟失的用戶數據,通過DML操作將其恢復到原數據庫中。6. 用適當的方法對原數據庫進行數據庫全備份。用ORACLE8i修復數據庫壞塊的三種方法在進行SUN CLUSTER雙機切換、意外斷電或其它情況下,有時會發生共享盤MOUNT不上的情況,需要使用FSCK對共享盤進行修復。修復完成后,在數據庫啟動過程中,卻又出現"數據塊損壞,無法啟動數據庫"的現象,此時,可以根據不同的數據塊損壞類型,檢測并修復錯誤。在此介紹三種使用Oracle8i修復損壞數據塊的方法。 一、數據塊損壞,錯誤

39、代碼為ORA-01578 ORA-1115 I/O ERROR READING BLOCK 通常后跟ORA-737X錯誤與操作系統錯誤(如UNIX中的錯誤號5) 產生原因: 1 硬件問題(磁盤控制器問題或磁盤問題) 2 物理級的數據塊損壞(通常由前一原因造成) 3 處理巨型文件時,后跟錯誤代碼ORA-7371 確定故障原因與恢復的方法: 1 查看alert.log文件中其它ORA-1115錯誤的發生情況: 1) 如果指向不同磁盤的文件,則是磁盤控制器的問題,查看V$DATAFILE,有哪些文件位于該控制器下,轉到第二步。 2) 如果指向相同磁盤的不同文件,則是磁盤的問題,轉到第二步。 3) 如

40、果指向同一個文件,執行以下語句查找文件名: SELECT SEGMENT_NAME,SEGMENT_TYPE FROM DBA_EXTENTS WHERE FILE_ID=<文件號> AND <塊號> BETWEEN BLOCK_ID AND BLOCK_ID+BLOCKS-1;其中,文件號與塊號是ORA-1115中指出的,如果該查詢持續指向某表或索引,則重建它們即可。 2 如果文件是SYSTEM表空間,或處于NOARCHIVELOG模式,關閉數據庫,轉到第四步。 3 如果數據庫處于ARCHIVELOG模式,仍應關閉數據庫,如果不能關閉數據庫,則將相應的數據文件脫機:A

41、LTER DATABASE DATAFILE '文件名' OFFLINE; 4 試著將數據文件拷貝到別的磁盤。 5 如果拷貝失敗,則文件將丟失。 6 STARTUP MOUNT; 7 將數據文件重命名為成功拷貝到別的磁盤的文件名: ALTER DATABASE RENAME FILE '老路徑文件名' TO '新路徑文件名' 8 ALTER DATABASE OPEN;9 RECOVER DATAFILE 文件名; ALTER DATABASE DATAFILE '文件名' ONLINE; 二、回滾段需要恢復如果回滾段處于NEED

42、 RECOVERY狀態,需要執行以下步驟進行恢復: 1 查看所有聯機的表空間與數據文件 2 在init.ora文件中加入event = "10015 trace name context forever,level 10",這將生成一個追蹤文件,其中含有事務與回滾的信息。 3 關閉并重新打開數據庫。 4 查看TRACE文件,應有error recovery tx(#,#) object #.TX(#,#),指出事務信息,其中object #與sys.dba_objects中的object_id相同。 5 使用以下查詢找出正在進行恢復的對象: SELECT owner,obj

43、ect_name,object_type,status FROM dba_objects WHERE  object_id=<object #> 6 必須刪除該對象以釋放回滾塊。 三、檢測與修復損壞塊的常用方法:(一)使用初始化參數DB_BLOCK_CHECKING與DB_BLOCK_CHECKSUM。 當塊改變時,DB_BLOCK_CHECKING對塊進行邏輯校驗。將防止發生10210 與10211錯誤。 (二)使用DBMS_REPAIR包,由dbmsrpr.sql與prvtrpr.plb生成該包在特定表中生成損壞塊的信息。 1DBMS_REPAIR.ADMIN_TAB

44、LES用于創建與刪除存儲損壞塊的表。其中TABLE_TYPE為:REPAIR_TABLE(表),ORPHAN_TABLE(索引);ACTION為:CREATE_ACTION(創建表),PURGE_ACTION(刪除無關數據),DROP_ACTION(刪除表)。例: dbms_repair.admin_tables('REPAIR_TABLE',DBMS_REPAIR.REPAIR_TABLE,DBMS_REPAIR.CREATE_ACTION,'temp_data'); 2DBMS_REPAIR.CHECK_OBJECT檢查表、索引、分區中的塊損壞。其中OBJE

45、CT_TYPE為:TABLE_OBJECT(表),INDEX_OBJECT(索引), REPAIR_TABLE_NAME(用于存儲損壞塊信息的表)。例: dbms_repair.check_object('ORATRAIN','LOCATIONS',corrupt_count=>:cc); 3使用以下語句查詢塊損壞信息: SELECT object_name, relative_file_no, block_id, marked_corrupt, corrupt_description, repair_description FROM repair_tab

46、le; 4將塊標志為損壞的:dbms_repair.fix_corrupt_blocks('ORATRAIN','LOCATIONS',fix_count=>:fc); 5跳過損壞塊:dbms_repair.skip_corrupt_blocks('ORATRAIN', 'LOCATIONS'); 其中OBJECT_TYPE為 :TABLE_OBJECT(表),CLUSTER_OBJECT(索引)。 6使用REBUILD_FREELISTS重建損壞的空閑列表:DBMS_REPAIR.rebuild_freelists 7使用

47、以下方法查找指向損壞塊的索引: (1) 創建存放指向壞塊索引的表 (2) dbms_repair.dump_orphan_keys('ORATRAIN','LOC_PK', orphan_table_name=>'ORPHAN_TAB1',key_count=>:kc); (3) SELECT index_name, count(*) FROM orphan_key_table WHERE table_name = 'CLASSES' GROUP BY index_name; (4) 重建具有orphan keys的索

48、引 限制:不能分析Index-organized tables 與 LOB indexes,DUMP_ORPHAN_KEYS不能對bitmap與 function-based indexes操作。 (三)使用SQL命令ANALYZE TABLE|INDEX VALIDATE STRUCTURE utlvalid.sql.創建含有損壞塊信息的INVALID_ROWS表,ANALYZE TABLE VALIDATE STRUCTURE CASCADE同時校驗表與索引。 (四)使用DBVERIFY DBVERIFY是一個外部工具,所以對數據庫影響很小。可用于在將備份文件拷貝回原位置前檢驗備份文件的完

49、好性,并定位數據塊損壞。命令如下: dbv /opt/Oracle/db02/oradata/data01.dbf start=1 end=500 logfile=dbv.log Oracle數據庫應用中實現漢字“同音”查詢接下來我們要編寫一個函數來實現獲取漢字拼音編碼。在編寫這個函數的過程中我發現了Oracle處理中英文混合字符串的bug,因此函數中采用在任何字符串前添加一個號來強制Oracle把此字符串當作雙字節來處理。代碼如下:create or replace function GetPinYin(Keyword in varchar2) return varchar2 isbegin

50、DECLARE  i int;  j int;  PinYin varchar2(500);  Temp varchar2(10);  TempStr varchar2(2);begin    i:=1;  j:=Length(''|Keyword);  PinYin:=''  While i<=j LOOP    TempStr:=substr(''|KeyWord,i,1);   

51、; select HZPY INTO Temp from BJXKS.t_Pinyin Where Num=(select max(num) from BJXKS.t_Pinyin Where Num<=ASCII(TempStr);    Temp:=Replace(Temp,'*',TempStr);    Temp:=Replace(Temp,'','');    PinYin:=PinYin|Temp;    i:

52、=i+1;  End loop;    return(PinYin);end;end GetPinYin;好了,現在可以用這個函數來實現漢字的同音查詢了。如查詢表table1中字段A中讀音和“啊”一樣的記錄,SQL語句可以這樣寫:select * from table1 where getpinyin(A) like '%a%' Oracle大數據量的導入和導出在Oracle中批量數據的導出是借助sqlplus的spool來實現的。批量數據的導入是通過sqlload來實現的。大量數據的導出部分如下:/* *  sql腳本部分 d

53、emo.sql begin */* * author meconsea * date 20050413 * msn meconsea * Email meconsea */#-markup html:html格式輸出,缺省為off/#-autocommit:自動提交insert、update、delete帶來的記錄改變,缺省為off/#-define:識別命令中的變量前綴符,缺省為on,也就是'&',碰到變量前綴符,后面的字符串作為變量處理.set colsep' ' 

54、60;                     /#-域輸出分隔符set echo off;                         

55、0;  /#-顯示start啟動的腳本中的每個sql命令,缺省為onset feedback off;                        /#-回顯本次sql命令處理的記錄條數,缺省為on       set heading off;    

56、60;                    /#-輸出域標題,缺省為onset pagesize 0;                          /#-輸出每頁行數,缺省為24,為了避免分頁,可設定為0。set linesize 80;                         /#-輸出一行字符個數,缺省為80set n

溫馨提示

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

評論

0/150

提交評論