ORA-01578、ORA-01110:數(shù)據(jù)塊被損壞,此時(shí)無法讀取文件問題修復(fù)方案
查看問題:
1.使用oracle用戶登錄linux服務(wù)器,并進(jìn)入sql模式
# sqlplus /nolog
2.超級管理員的權(quán)限操作數(shù)據(jù)庫
# conn /as sysdba;
3.查詢不在線的數(shù)據(jù)
select name, status from v$datafile order by file#;
4.恢復(fù)數(shù)據(jù)
# recover datafile
5.再次查詢文件數(shù)據(jù) 文件為脫機(jī)狀態(tài)
# select status from v$datafile where file# = 6;
6.將文件掛上網(wǎng)
# alter database datafile 13 online;
7.確認(rèn)文件狀態(tài)
# select name, status from v$datafile order by file#;
8.文件已經(jīng)上線,可能還會(huì)出現(xiàn)一些問題 BLOB字段損壞導(dǎo)致部分表無法使用
參考了很多優(yōu)秀博主的文章 可是有些不適用,便自己整理了一下
原因分析:
1.重啟數(shù)據(jù)庫 導(dǎo)致oracle在操作blob字段有問題。
2.應(yīng)用操作數(shù)據(jù)庫事,產(chǎn)生了鎖等待。
3.出現(xiàn)鎖等待,可以通過后臺(tái)日志查看,后臺(tái)會(huì)有對應(yīng)的拋出一個(gè)ORA-00600錯(cuò)誤。
4.根據(jù) ORA-00600 錯(cuò)誤跟蹤,發(fā)現(xiàn)是一個(gè)INSERT 語句插入導(dǎo)致(可能是壞塊造成),在數(shù)據(jù)庫重啟時(shí)插入數(shù)據(jù)有問題。
5.通過select count(*) from user.table;查詢對應(yīng)的表會(huì)拋出錯(cuò)誤,說明此數(shù)據(jù)文件下的某個(gè)塊存在問題;
表修復(fù)方案:
方案一 可視化處理壞塊(親測有效):
操作需要用超級管理員登錄,下面用的是plsql 也可以用控制臺(tái)
1.查詢壞塊對應(yīng)的分段類型、所屬、分段名稱
SELECT SEGMENT_TYPE, OWNER, SEGMENT_NAME FROM DBA_EXTENTS WHERE FILE_ID = 6 AND 1962511 BETWEEN BLOCK_ID AND BLOCK_ID + BLOCKS - 1; -- FILE_ID 文件標(biāo)識(shí) 1962511 壞塊的標(biāo)識(shí) 可通過報(bào)錯(cuò)獲取
2.查詢壞塊的對應(yīng)表
select table_name, column_name from dba_lobs where segment_name = 'SYS_LOB0000086896C00002$$' and owner = 'HLT20230606'; -- segment_name 分段名稱 上一條語句中獲取 owner 所有者
3.根據(jù)表及字段查看到數(shù)據(jù)缺失有損壞,刪除損壞塊即可,置空應(yīng)該也可以
select * from HLT20230606.S_BS_UIVIEWEXT; DELETE FROM HLT20230606.S_BS_UIVIEWEXT WHERE FID = 'AnwAAACllIjajtru'
優(yōu)勢:可視化發(fā)現(xiàn)錯(cuò)誤并可以直接通過語句清理
劣勢:需要sql能執(zhí)行查詢語句,否則看不到錯(cuò)誤點(diǎn)在哪里
方案二(查詢壞塊的rowid進(jìn)行處理):
1.通過表空間 object_id,file_ID,block#,row# 構(gòu)造ROWID 1)通過FILE_ID,BLOCK 查詢出
segment_name:
SELECT SEGMENT_TYPE, OWNER, SEGMENT_NAME FROM DBA_EXTENTS WHERE FILE_ID = 6 AND 1962511 BETWEEN BLOCK_ID AND BLOCK_ID+BLOCKS
2.構(gòu)造壞塊的ROWID
SELECT DATA_OBJECT_ID FROM USER_OBJECTS WHERE OBJECT_NAME = 'SYS_LOB0000086896C00002$$';
不懂為啥查不出來
SELECT DBMS_ROWID.ROWID_CREATE(1, 54649, 39, 24961, 0) FROM DUAL; -- 54649 上面查出來的
3.通過ROWID 查詢對應(yīng)的列數(shù)據(jù),并處理
SELECT ROWID,XXX FROM TABLE_NAME
優(yōu)勢:直接定位到有問題的數(shù)據(jù)
劣勢:不懂為啥查不到數(shù)據(jù)
方案三(建立中間表處理):
1.建臨時(shí)表
create table corrupted_lob_data (corrupted_rowid rowid);
2.設(shè)置凹入
set concat off
3.打開設(shè)置輸出服務(wù)器
set serveroutput on
4.執(zhí)行存過
declare error_1555 exception; pragma exception_init(error_1555, -1555); num number; begin for cursor_lob in (select rowid r, &&lob_column from &table_owner. &table_with_lob) loop begin num := dbms_lob.instr(cursor_lob.FSQL, hextoraw('889911')); exception when error_1555 then insert into corrupted_lob_data values (cursor_lob.r); commit; end; end loop; end;
5.獲取有問題數(shù)據(jù)
select * from corrupted_lob_data; select * from table(壞塊的表) where rowid='AAEtzZAAOAACBpiAAP' ;--(BLOB壞的字段會(huì)出現(xiàn)ERROR字樣)
通過上面的sql執(zhí)行獲取到具體哪些數(shù)據(jù)有問題,并對這些數(shù)據(jù)進(jìn)行處理。
優(yōu)勢:循壞遍歷到各個(gè)問題數(shù)據(jù)并放入中間表,更快的定位問題數(shù)據(jù)
劣勢:執(zhí)行存過報(bào)錯(cuò)的話,沒辦法解決
方案四(重新導(dǎo)入可用數(shù)據(jù)):
1.10231 內(nèi)部事件,設(shè)置在全表掃描時(shí)跳過損壞的數(shù)據(jù)塊.
alter system set events='10231 trace name context forever,level 10';
2.導(dǎo)出對應(yīng)的表信息
exp HLT20230606/kshdksk file=t.dmp tables=S_BS_UIVIEWEXT -- exp 用戶名/密碼@數(shù)據(jù)庫 file=t.dmp tables=有問題的表
3.刪除表
drop table t;
4.導(dǎo)入備份表
imp HLT20230606/kshdksk@orcl file=t.dmp tables=S_BS_UIVIEWEXT -- imp 用戶名/密碼@數(shù)據(jù)庫 file=t.dmp tables=有問題表
優(yōu)勢:直接整個(gè)問題表進(jìn)行導(dǎo)入導(dǎo)出,對于數(shù)據(jù)量大的表,這種方式比較快
劣勢:直接跳過問題數(shù)據(jù),無法直觀的看到有問題的數(shù)據(jù)
方案五(通過數(shù)據(jù)庫直接建備份表轉(zhuǎn)換):
1.查詢壞塊對應(yīng)的分段類型、所屬、分段名稱
SELECT SEGMENT_TYPE, OWNER, SEGMENT_NAME FROM DBA_EXTENTS WHERE FILE_ID = 6 AND 1962511 BETWEEN BLOCK_ID AND BLOCK_ID + BLOCKS - 1; -- FILE_ID 文件標(biāo)識(shí) 1962511 壞塊的標(biāo)識(shí) 可通過報(bào)錯(cuò)獲取
2.查詢壞塊的對應(yīng)表
select table_name, column_name from dba_lobs where segment_name = 'SYS_LOB0000086896C00002$$' and owner = 'HLT20230606'; -- segment_name 分段名稱 上一條語句中獲取 owner 所有者
3.使用10231事件忽略壞塊
alter session SET EVENTS '10231 trace name context forever,level 10';
4.使用CTAS方式重建表
create table S_BS_UIVIEWEXT_NEW as select * from S_BS_UIVIEWEXT;
5.重命名表rename table
rename S_BS_UIVIEWEXT to S_BS_UIVIEWEXT_BAK; rename S_BS_UIVIEWEXT_NEW to S_BS_UIVIEWEXT;
6.重建索引rebuild index
alter index PK_BS_UIVIEWEXT rebuild;
7.關(guān)閉忽略壞塊
alter session SET EVENTS '10231 trace name context off';
優(yōu)勢:直接整個(gè)問題表進(jìn)行重建,對于數(shù)據(jù)量大的表,這種方式比較快
劣勢:直接跳過問題數(shù)據(jù),無法直觀的看到有問題的數(shù)據(jù)
對象方案修復(fù):
對于對象 可以直接重建對象
alter index indexname rebuild
總結(jié)
到此這篇關(guān)于ORA-01578、ORA-01110:數(shù)據(jù)塊被損壞,此時(shí)無法讀取文件問題修復(fù)方案的文章就介紹到這了,更多相關(guān)ORA-01578 ORA-01110數(shù)據(jù)塊被損壞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Oracle 8x實(shí)現(xiàn)自動(dòng)斷開后再連接
在Oracle 8x實(shí)現(xiàn)自動(dòng)斷開后再連接...2007-03-03CentOS8下安裝oracle客戶端完整(填坑)過程分享(推薦)
這篇文章主要介紹了CentOS8下安裝oracle客戶端完整(填坑)過程分享,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12在Oracle數(shù)據(jù)庫中添加外鍵約束的方法詳解
這篇文章主要介紹了在Oracle數(shù)據(jù)庫中添加外鍵約束的方法,需要的朋友可以參考下2016-01-01Oracle 表三種連接方式使用介紹(sql優(yōu)化)
這篇文章主要介紹了Oracle表三種連接方式的使用,學(xué)習(xí)sql優(yōu)化的朋友可以參考下2014-08-08ORACLE應(yīng)用經(jīng)驗(yàn)(1)
ORACLE應(yīng)用經(jīng)驗(yàn)(1)...2007-03-03Oracle刪除字段中的空格、回車及指定字符的實(shí)例代碼
本文給大家分享Oracle刪除字段中的空格、回車及指定字符的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下2017-03-03Oracle 11gR2中啟動(dòng)Scott用戶的方法(推薦)
這篇文章主要介紹了Oracle 11gR2中啟動(dòng)Scott用戶的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08