ORACLE資料庫壞塊的處理 (處理無物件壞快的方法)
資料庫壞塊的情況有很多,這裡主要介紹如何處理不屬於任何資料物件的資料檔案壞塊情況。
有兩種解決辦法
方法1:可以將發生壞塊的資料檔案,其所屬表空間裡的所有資料物件移動到別的表空間。然後將現有的資料檔案刪除並重建。該方法的缺點是很明顯的,對7*24小時執行系統的正常業務處理有很大影響。
方法2:參考資料Metalink: Note#336133.1 How to Format Corrupted Block Not Part of Any Segment
詳細的處理細節如下:
1,首先確認資料庫告警日誌裡的報錯資訊如下:
Corrupt block relative dba: 0×0ccf26df (file 51, block 992991)
Fractured block found during backing up datafile
Data in bad block -
type: 6 format: 2 rdba: 0×0ccf26df
last change scn: 0×0428.1d038e69 seq: 0×1 flg: 0×04
consistency value in tail: 0xa2560601
check value in block header: 0×7170, computed block checksum: 0×2c3f
spare1: 0×0, spare2: 0×0, spare3: 0×0
***
Reread of blocknum=992991, file=/dev/rd03lv32_03. found same corrupt data
找出壞塊的位置是51號檔案的第992991個資料塊。
2.利用dba_extents檢視確認該壞塊屬於的資料物件:
SQL> select * from dba_extents where file_id=51 and &block between block_id and block_id+blocks;
Enter value for block: 992991
old 1: select * from dba_extents where file_id=51 and &block between block_id and block_id+blocks
new 1: select * from dba_extents where file_id=51 and 992991 between block_id and block_id+blocks
no rows selected
該壞塊不屬於任何的資料物件。
3.檢查該資料檔案的可用空間
SQL> select tablespace_name,file_id,sum(bytes/1024/1024) Mb from dba_free_space
2 where file_id=51 group by tablespace_name,file_id;
TABLESPACE_NAME FILE_ID MB
————————– ———- ———-
DATA100 51 1560
壞塊的表空間上建立一張臨時表,並做如下處理:
建立一張表:
create table s (n number, c varchar2(4000)) nologging tablespace DATA100;
並手工分配給該表以發生壞塊的資料檔案的全部可用空間:
alter table s allocate extent (DATAFILE ‘/dev/rd03lv32_03′ SIZE 1560M);
此處1560Mb就是前文中檢查的51號檔案的所有可用空間。
向該表中插入100行資料:
BEGIN
FOR i IN 1..100 LOOP
INSERT INTO s VALUES(i,’x');
END LOOP;
END;
/
然後對其進行迴圈插入,直到前文中所述的壞塊被使用。
BEGIN
FOR i IN 1..1000000000 LOOP
INSERT INTO s select * from s;
END LOOP;
END;
/
再次確認無資料壞塊:
再次使用dbv檢查該資料檔案,確認無壞塊。
dbv file=’/dev/rd03lv32_03′ blocksize=8192
刪除操作中建立的表:
DROP TABLE s;
處理完畢。
有兩種解決辦法
方法1:可以將發生壞塊的資料檔案,其所屬表空間裡的所有資料物件移動到別的表空間。然後將現有的資料檔案刪除並重建。該方法的缺點是很明顯的,對7*24小時執行系統的正常業務處理有很大影響。
方法2:參考資料Metalink: Note#336133.1 How to Format Corrupted Block Not Part of Any Segment
詳細的處理細節如下:
1,首先確認資料庫告警日誌裡的報錯資訊如下:
Corrupt block relative dba: 0×0ccf26df (file 51, block 992991)
Fractured block found during backing up datafile
Data in bad block -
type: 6 format: 2 rdba: 0×0ccf26df
last change scn: 0×0428.1d038e69 seq: 0×1 flg: 0×04
consistency value in tail: 0xa2560601
check value in block header: 0×7170, computed block checksum: 0×2c3f
spare1: 0×0, spare2: 0×0, spare3: 0×0
***
Reread of blocknum=992991, file=/dev/rd03lv32_03. found same corrupt data
找出壞塊的位置是51號檔案的第992991個資料塊。
2.利用dba_extents檢視確認該壞塊屬於的資料物件:
SQL> select * from dba_extents where file_id=51 and &block between block_id and block_id+blocks;
Enter value for block: 992991
old 1: select * from dba_extents where file_id=51 and &block between block_id and block_id+blocks
new 1: select * from dba_extents where file_id=51 and 992991 between block_id and block_id+blocks
no rows selected
該壞塊不屬於任何的資料物件。
3.檢查該資料檔案的可用空間
SQL> select tablespace_name,file_id,sum(bytes/1024/1024) Mb from dba_free_space
2 where file_id=51 group by tablespace_name,file_id;
TABLESPACE_NAME FILE_ID MB
————————– ———- ———-
DATA100 51 1560
壞塊的表空間上建立一張臨時表,並做如下處理:
建立一張表:
create table s (n number, c varchar2(4000)) nologging tablespace DATA100;
並手工分配給該表以發生壞塊的資料檔案的全部可用空間:
alter table s allocate extent (DATAFILE ‘/dev/rd03lv32_03′ SIZE 1560M);
此處1560Mb就是前文中檢查的51號檔案的所有可用空間。
向該表中插入100行資料:
BEGIN
FOR i IN 1..100 LOOP
INSERT INTO s VALUES(i,’x');
END LOOP;
END;
/
然後對其進行迴圈插入,直到前文中所述的壞塊被使用。
BEGIN
FOR i IN 1..1000000000 LOOP
INSERT INTO s select * from s;
END LOOP;
END;
/
再次確認無資料壞塊:
再次使用dbv檢查該資料檔案,確認無壞塊。
dbv file=’/dev/rd03lv32_03′ blocksize=8192
刪除操作中建立的表:
DROP TABLE s;
處理完畢。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12361284/viewspace-620151/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORACLE資料庫壞塊的處理 (一次壞快處理過程)Oracle資料庫
- 資料庫壞塊處理資料庫
- 資料庫壞塊Corrupt block的處理方法資料庫BloC
- 教你如何處理Oracle資料庫中的壞塊Oracle資料庫
- Oracle壞塊處理Oracle
- ORACLE 壞塊處理Oracle
- ORACLE資料庫壞塊的處理 (通過re-create table方法)Oracle資料庫
- 一次ORACLE資料庫undo壞塊處理Oracle資料庫
- 對oracle中出現的壞塊的處理方法Oracle
- 如何處理Oracle資料庫中的壞塊問題(轉)Oracle資料庫
- [zt] 如何處理Oracle資料庫中的壞塊[final]Oracle資料庫
- Oracle壞塊處理相關Oracle
- Oracle壞塊問題處理Oracle
- oracle corrupt block壞塊處理OracleBloC
- rootvg壞塊處理
- 處理塊損壞
- ORACLE壞塊(ORA-01578)處理方法Oracle
- 一個簡單易用的資料庫壞塊處理方案資料庫
- BAD Block 壞塊的處理BloC
- Oracle 11.2.0.4.4 ADG 備庫資料檔案壞塊處理Oracle
- oracle資料庫改壞spfile引數重啟處理方法Oracle資料庫
- 【BLOCK】Oracle壞塊處理命令參考BloCOracle
- oracle壞塊模擬處理(筆記)Oracle筆記
- Oracle 壞塊處理三板斧Oracle
- Oracle壞塊修復處理實驗Oracle
- ORACLE壞塊(ORA-01578)處理方法(zt)Oracle
- DBA實踐---壞塊處理
- Oracle資料庫出現ORA-19566 LOB壞塊的處理記錄Oracle資料庫
- ORA-01578(資料塊損壞)跳過壞塊處理辦法
- 第7章 處理塊損壞
- bad block表上壞塊的處理BloC
- MySQL資料庫InnoDB壞頁處理修復MySql資料庫
- Oracle 9i資料壞塊的處理(ORA-01578) ztOracle
- Oracle RMAN備份中對壞塊(corrupt block)的處理OracleBloC
- oracle - redo 損壞或刪除處理方法Oracle
- Oracle資料庫無效物件問題處理Oracle資料庫物件
- Oracle資料庫壞塊(corruption)-物理壞塊Oracle資料庫
- 壞塊的處理思維(用程式製作壞塊不如用系統)