14.11.2021
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;
Затем таблицу можно пересоздать.
Другое решение — чинить поврежденные блоки — не исследовал.