oracle schema_Oracle数据库坏块检查与修复
摘要:簡述數(shù)據(jù)庫壞塊,發(fā)現(xiàn)并處理Oracle的物理壞塊、邏輯壞塊
以下摘自網(wǎng)絡并規(guī)整:
一、數(shù)據(jù)庫壞塊介紹
數(shù)據(jù)庫的數(shù)據(jù)塊有固定的格式和結構,分三層:cache layer,transaction layer,data layer。在我們對數(shù)據(jù)塊進行讀取寫入操作的時候,數(shù)據(jù)庫會對要讀寫的數(shù)據(jù)塊做一致性的檢查,其中包括:數(shù)據(jù)塊的類型、數(shù)據(jù)塊的地址信息、數(shù)據(jù)塊的SCN號以及數(shù)據(jù)塊的頭部和尾部。如果發(fā)現(xiàn)其中有不一致的信息,那數(shù)據(jù)庫就會標記這個數(shù)據(jù)塊為壞塊了。
如果數(shù)據(jù)庫出現(xiàn)壞塊,數(shù)據(jù)庫的告警日志文件里面會存在有如下的一些報錯信息:Ora-1578、Ora-1110以及Ora-600 and trace file in bdump directory,其中Ora-600錯誤的第一個參數(shù)值的范圍是[2000]-[8000],不同的值代表著數(shù)據(jù)塊的不同的層出現(xiàn)問題,具體的如下表所示:Range block layerCache layer 2000 – 4000Transaction layer 4000 – 6000Data layer 6000 - 8000
二、數(shù)據(jù)庫壞塊分類
數(shù)據(jù)庫壞塊(corruption)
1、按照壞塊所屬對象的不同,分為用戶數(shù)據(jù)壞塊,數(shù)據(jù)字典壞塊,Undo壞塊,控制文件壞塊,Redo壞塊,Lob壞塊,index壞塊等等。
2、按照壞塊產(chǎn)生的原因,分為物理壞塊(physical corruption)和邏輯壞塊(logical corruption)。
三、物理壞塊與邏輯壞塊
物理壞塊指的是塊格式本身是壞的,塊內的數(shù)據(jù)沒有任何意義。
邏輯壞塊指的是塊內的數(shù)據(jù)在邏輯是存在問題。比如說索引塊的索引值沒有按從小到大排列。
常見的物理壞塊(Physical Block Corruptions)有塊頭和塊尾信息不一致(Fractured/Incomplete),checksum值無效,數(shù)據(jù)塊信息全部為0等情況,并且可能伴隨錯誤ORA-1578和ORA-1110。
為了及時發(fā)現(xiàn)物理壞塊和準確定位壞塊產(chǎn)生的原因,oracle建議設置初始化參數(shù)DB_BLOCK_CHECKSUM=TYPICAL(默認值)。一般情況下,物理壞塊是由于底層OS/disk系統(tǒng)錯誤/損壞,導致數(shù)據(jù)塊被修改,數(shù)據(jù)塊標志為壞塊(corruption)。
數(shù)據(jù)塊的Checksum值無效是一種常見的物理壞塊,當數(shù)據(jù)庫初始化參數(shù)DB_BLOCK_CHECKSUM=TYPICAL(默認值)時,DBWR進程將數(shù)據(jù)塊寫入disk時會計算數(shù)據(jù)塊的Checksum,并且將Checksum值記錄在數(shù)據(jù)塊的位置offset 16和17;當從disk讀取該數(shù)據(jù)塊時,oracle重新計算數(shù)據(jù)塊的Checksum,并且與記錄在數(shù)據(jù)塊中的Checksum做異或運算(Xor),如果異或結果為非0,說明數(shù)據(jù)塊被修改過,數(shù)據(jù)塊為壞塊(corruption)。
四、數(shù)據(jù)庫壞塊產(chǎn)生的原因
1、硬件原因;
2、ORACLE與操作系統(tǒng)BUG;
3、操作系統(tǒng)的I/O錯誤或緩沖問題;
4、內存或paging問題;
5、非Oracle進程擾亂Oracle共享內存區(qū)域;
6、異常關機,掉電,終止服務;
7、硬盤修復工具;
8、一個數(shù)據(jù)文件的一部分正在被覆蓋 ;
9、Oracle試圖訪問一個未被格式化的系統(tǒng)塊失敗;
10、數(shù)據(jù)文件部分溢出。
五、數(shù)據(jù)庫壞塊檢查
1、SQL方式
在進行查詢、更新等SQL發(fā)生報錯數(shù)據(jù)庫壞塊;
2、日志報錯記錄
根據(jù)alert中的報錯file_id和block_id查詢對象。
3、RMAN方式(不產(chǎn)生備份)
RMAN> BACKUP CHECK LOGICAL VALIDATE DATAFILE n ; --檢查某個數(shù)據(jù)文件邏輯壞塊
RMAN> BACKUP CHECK LOGICAL VALIDATE DATABASE; --檢查整個庫邏輯壞塊,結果放在v$database_block_corruption這個動態(tài)視圖中。
RMAN> BACKUP VALIDATE DATABASE; --檢查整個庫物理壞塊
RMAN> BACKUP VALIDATE DATAFILE n ; --檢查某個數(shù)據(jù)文件物理壞塊
注:另外還有VALIDATE…方式、RESTORE…VALIDATE方式檢查。
4、ANALYSE方式
analyze table tablename validate structure cascade online(offline);
注:該命令同樣會執(zhí)行物理和邏輯一致性檢查。除此之外,它還會檢查表和索引條目的匹配性,檢查分區(qū)表的記錄是否在正確的分區(qū)中, 檢查出的問題會放在USER_DUMP_DEST目錄的trace文件中。
5、dbv工具檢查
dbv file=d:\oracle\oradata\mydb\RONLY.DBF blocksize=8192
6、利用expdp工具導出整個數(shù)據(jù)庫可以檢測壞塊
對以下情況的壞塊是檢測不出來的:
HWM以上的壞塊是不會發(fā)現(xiàn)的;
索引中存在的壞塊是不會發(fā)現(xiàn)的;
數(shù)據(jù)字典中的壞塊是不會發(fā)現(xiàn)的。
注:發(fā)現(xiàn)壞塊就報錯,不繼續(xù)執(zhí)行。另外無法檢查邏輯壞塊。
六、數(shù)據(jù)庫壞塊修復方法
前提:發(fā)現(xiàn)壞塊后,首先要獲得壞塊的所屬對象、文件號及塊位置。
如果是索引、視圖等壞塊,可以刪除重建。
1、首先確認壞塊的對象(5文件號,1345為塊號)
SELECT tablespace_name,segment_type, owner, segment_name FROM dba_extents WHERE file_id =5 AND 1345 between block_id AND block_id + blocks - 1;2、查詢所有壞塊
select * from v$database_block_corruption;修復方法:假設壞塊為file # 5,block # 1345
3、通過RMAN備份恢復壞塊(如果有備份)
RMAN> backup validate datafile 5; --檢測數(shù)據(jù)文件物理壞塊信息RMAN> run {blockrecover datafile 5 block 1345;} --修復單個壞塊RMAN> run {blockrecover corruption list;} ----修復所有記錄在V$DATABASE_BLOCK_CORRUPTION中的邏輯壞塊。RMAN> recover datafile ‘/xxx/xx’; --修復數(shù)據(jù)文件注:修復前建議備份原數(shù)據(jù)文件,表空間offline。
4、跳過壞塊,導出數(shù)據(jù)并重建表后導入(如果沒有備份)
數(shù)據(jù)導完后再根據(jù)業(yè)務將數(shù)據(jù)補齊。
點擊下方“閱讀原文”查看更多精彩內容?
總結
以上是生活随笔為你收集整理的oracle schema_Oracle数据库坏块检查与修复的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python里的resize_Pytho
- 下一篇: mysql创建非聚集索引_一文看懂聚集索