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