oracle

ORA-01578: ORACLE data block corrupted

select log_mode from V$DATABASE

1. ====================== Если ARCHIVELOG ======================.

select * from v$database_block_corruption;

RMAN> validate check logical database;

This will check all blocks for corruption in an online operation and update v$database_block_corruption

RMAN> recover corruption list;

This will recover all the detected corrupted blocks from step 1 in an online operation.

2. ====================== Если NOARCHIVELOG ======================.

EXP-00056: ORACLE выдала ошибку 1578
ORA-01578: разрушен блок данных ORACLE (файл # 5, блок # 121773)
ORA-01110: файл данных 5: ‘C:\ORACLE\ORADATA\DBNOHT05\USERS01.DBF’

select owner, segment_type, segment_name from dba_extents where file_id = 5 and 121773 between block_id and block_id+blocks-1;

Увидим, что за объект в поврежденном блоке.

analyze table SUPERMAG.SMSPECSTAT validate structure [cascade]; — это вряд ли поможет

Под SYS:

begin dbms_repair.admin_tables(‘ORPHAN_KEYS_TABLE’, dbms_repair.orphan_table, dbms_repair.create_action); end;
begin dbms_repair.admin_tables(‘REPAIR_TABLE’,1,1,’SYSTEM’); end;

declare
c number;
begin
sys.DBMS_REPAIR.check_object(‘SUPERMAG’, ‘SMSPECSTAT’, corrupt_count => c);
dbms_output.put_line(‘cnt :’ ||c);
end;

select * from repair_table — видим блоки, которые надо чинить

Простое решение — пропускать поврежденные блоки.

declare
c number;
begin
sys.DBMS_REPAIR.skip_corrupt_blocks(‘SUPERMAG’, ‘SMSPECSTAT’);
dbms_output.put_line(‘cnt :’ ||c);
end;

Затем таблицу можно пересоздать.

Другое решение — чинить поврежденные блоки — не исследовал.

Пролистать наверх