Oracle壞塊處理相關

shilei1發表於2012-04-06
dbv  file=/data/d2/sitdata/apps_ts_tx_data.326.760209233   blocksize=8192 檢查那幾個快壞了。
SELECT  *  ---tablespace_name, segment_type, owner, segment_name, partition_name
FROM dba_extents
WHERE file_id = 89 and  799871  between block_id AND block_id + blocks - 1;
select * from dba_lobs where SEGMENT_NAME='SYS_LOB0000129851C00019$$';
select  BYTES/1024/1024/1024  from dba_segments 
where segment_name = 'FND_LOG_MESSAGES'  and segment_type = 'TABLE' ;
RMAN> blockrecover  datafile 89  block  799864, 799871  ;  如果有備份 
沒有辦法恢復就得使用 exp,imp :
SQL>create directory dmpdir as  '/data/d1'; 
SQL>grant read,write on directory  dmpdir  to applsys ; 
$ expdp  system/xxxx   directory=dmpdir  dumpfile=FND_LOG_MESSAGES.dmp  tables=applsys.FND_LOG_MESSAGES 
$ impdp  system/xxxx  directory=dmpdir  dumpfile=FND_LOG_MESSAGES.dmp  tables=applsys.FND_LOG_MESSAGES 
Rename 表 。
----------------------------------------------

 今天下午,遷移資料完成後,再給使用者做rman備份,備份到一半後,報

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: failure of backup command on t2 channel at 06/14/2009 15:49:09
ORA-19566: exceeded limit of 0 corrupt blocks for file /ora9idata02/oradata/stjj/ntiis_01.dbf

 

檢查日誌中發現以下表空間檔案號和塊號

Corrupt block relative dba: 0x1a43d4e3 (file 24, block 359808)
Fractured block found during backing up datafile
Data in bad block -
 type: 0 format: 0 rdba: 0x00000000
 last change scn: 0x0000.00000000 seq: 0x0 flg: 0x00
 consistency value in tail: 0x00000000
 check value in block header: 0x0, block checksum disabled
 spare1: 0x0, spare2: 0x0, spare3: 0x0
***

然後用dbv檢查發現至少有四,五個壞塊

dbv file=/ora9idata02/oradata/stjj/ntiis_01.dbf  blocksize=8192

然後用以下sql檢查,看是什麼物件損壞

select * from dba_extents where file_id=24 and 359808 between block_id and block_id+blocks-1;
透過檢查沒有任何行輸出
 如果所有的壞塊執行這個sql檢查出來的結果都是返回0行,說明沒有物件在壞塊。
因為資料剛導完,應用還在測試,這個使用者下的表沒資料更新,
而且這個表空間只屬於這個使用者,就採取刪除,重建表空間的方法和資料重新匯入
 然後用rman備份資料正常
-------------------------------
首先需要找到壞塊的ID(可以執行dbverify實現),假設為,假定檔案編碼為。執行下面的查詢查詢段名: 
SELECT segment_name,segment_type,extent_id,block_id, blocks 
from dba_extents t 
where 
file_id =  
AND between block_id and (block_id + blocks - 1) 
一旦找到壞段名稱,若段是一個表,則最好建立一個臨時表,存放好的資料。若段是索引,則刪除它,再重建。 
create table good_table 
as 
select from bad_table where rowid not in 
(select rowid 
from bad_table where substr(rowid,10,6) =
在這裡要注意8以前的受限ROWID與現在ROWID的差別。 
還可以使用診斷事件10231 
SQL> ALTER SYSTEM SET EVENTS '10231 trace name context forever,level 10'; 
建立一個臨時表good_table的表中除壞塊的資料都檢索出來 
SQL>CREATE TABLE good_table as select * from bad_table; 
最後關閉診斷事件 
SQL> ALTER SYSTEM SET EVENTS '10231 trace name context off '; 
關於ROWID的結構,還可以參考dbms_rowid.rowid_create函式。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/196700/viewspace-720601/,如需轉載,請註明出處,否則將追究法律責任。

相關文章