欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ORA-01578、ORA-01110:數(shù)據(jù)塊被損壞,此時(shí)無法讀取文件問題修復(fù)方案

 更新時(shí)間:2024年03月22日 09:27:38   作者:zbqice007  
這篇文章主要給大家介紹了關(guān)于ORA-01578、ORA-01110:數(shù)據(jù)塊被損壞,此時(shí)無法讀取文件問題的修復(fù)方案,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用數(shù)據(jù)庫具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

查看問題:

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)文章

最新評論