首页 > Oracle > oracle lob坏块处理

oracle lob坏块处理

2017年11月21日 发表评论 阅读评论

报这些错,例如1555并不是因为回滚段空间不够,原因在于LOB段的损坏,解决如下:

1 标识出哪一行的lob有坏
a、建个临时表

SQL> create table corrupt_lobs (corrupt_rowid rowid, err_num number);


b、对表进行逐行检测

DECLARE
  ERROR_1578  EXCEPTION;
  ERROR_1555  EXCEPTION;
  ERROR_22922 EXCEPTION;
  PRAGMA EXCEPTION_INIT(ERROR_1578, -1578);
  PRAGMA EXCEPTION_INIT(ERROR_1555, -1555);
  PRAGMA EXCEPTION_INIT(ERROR_22922, -22922);
  N NUMBER;
BEGIN
  FOR CURSOR_LOB IN (SELECT ROWID R,C_LOB FROM  QIUYB.TEST_LOB  partition (SYS_P333559)) LOOP
    BEGIN
      N := DBMS_LOB.INSTR(CURSOR_LOB.C_LOB,
                          HEXTORAW('889911'));
    EXCEPTION
      WHEN ERROR_1578 THEN
        INSERT INTO corrupt_lobs
        VALUES
          (CURSOR_LOB.R, 1578);
        COMMIT;
      WHEN ERROR_1555 THEN
        INSERT INTO corrupt_lobs
        VALUES
          (CURSOR_LOB.R, 1555);
        COMMIT;
      WHEN ERROR_22922 THEN
        INSERT INTO corrupt_lobs
        VALUES
          (CURSOR_LOB.R, 22922);
        COMMIT;
    END;
  END LOOP;
END;

2 对坏的lob置空

UPDATE QIUYB.TEST_LOB 
set    C_LOB = empty_clob()
where  rowid in (select corrupt_rowid from   corrupt_lobs);

3 参考文档
ORA-1578 ORA-26040 in a LOB segment – Script to solve the errors (Doc ID 293515.1)

分类: Oracle 标签: , ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.