Hallo,
ich stricke an einer Überwachung für korrupte Datenbankblöcke, komme aber nicht weiter.
Mein Problem ist, das eine Block-Korruption in einem Datafile oft in einem Block liegt, der leer ist, also kein Objekt betroffen ist.
Hier mein Konstrukt:
declare
Korr_chk number(10) := 0;
cursor Corr_c is select FILE# as FILE_NUM, BLOCK# as BLOCK_NUM, CORRUPTION_TYPE from v$database_block_corruption;
seg_n varchar2(30);
seg_t varchar2(30);
own_n varchar2(30);
tbs_n varchar2(30);
begin
select count(*) into Korr_chk from v$database_block_corruption;
if Korr_chk >0 THEN
for arec in Corr_c loop
seg_n := NULL;
seg_t := NULL;
own_n := NULL;
tbs_n := NULL;
SELECT segment_name, segment_type, owner, tablespace_name into seg_n, seg_t, own_n, tbs_n
FROM sys.dba_extents
WHERE file_id = arec.FILE_NUM
AND arec.BLOCK_NUM BETWEEN block_id and block_id + blocks -1;
dbms_output.put_line (arec.CORRUPTION_TYPE||’ korrupter Block ‚||arec.BLOCK_NUM||‘ in File ‚||arec.FILE_NUM);
dbms_output.put_line (‚Hier liegt ‚||seg_t||‘ ‚||own_n||‘.‘||seg_n||‘ aus Tablespace '||tbs_n);
end loop;
ELSE
dbms_output.put_line (‚Keine korrupten Blöcke gefunden‘);
END IF;
end;
/
Wie umgehe ich die Fehlermeldung
FEHLER in Zeile 1:
ORA-01403: no data found
ORA-06512: at line 16
?
Ich habe es mit einer NVL-Spaltenmaskierung versucht, aber was will die Instanz maskieren, wenn garkeine Zeilen zurückkommen …
Grüße
Chris