oracle block corrupted - ghdrako/doc_snipets GitHub Wiki
V$DATABASE_BLOCK_CORRUPTION
Oracle automatycznie wykrywa uszkodzone bloki i zapisuje je w widoku V$DATABASE_BLOCK_CORRUPTION.
🔹 Sprawdzenie, czy w bazie są uszkodzone bloki:
SELECT * FROM V$DATABASE_BLOCK_CORRUPTION;
📌 Kolumny:
FILE# – numer pliku, w którym występuje problem.
BLOCK# – numer uszkodzonego bloku.
BLOCKS – liczba uszkodzonych bloków.
CORRUPTION_TYPE – typ korupcji (np. CORRUPT, LOGICAL_CORRUPT).
c) DBMS_REPAIR – wykrywanie uszkodzonych bloków
Oracle udostępnia pakiet DBMS_REPAIR, który pozwala zidentyfikować i oznaczyć uszkodzone bloki.
1️⃣ Tworzenie tabeli logów dla błędów bloków:
BEGIN
DBMS_REPAIR.ADMIN_TABLES (
TABLE_NAME => 'REPAIR_LOG',
TABLE_TYPE => DBMS_REPAIR.REPAIR_TABLE,
ACTION => DBMS_REPAIR.CREATE_ACTION
);
END;
/
2️⃣ Skanywanie tabeli w poszukiwaniu błędów bloków:
BEGIN
DBMS_REPAIR.CHECK_OBJECT (
SCHEMA_NAME => 'HR',
OBJECT_NAME => 'PRACOWNICY',
OBJECT_TYPE => DBMS_REPAIR.TABLE_OBJECT,
REPAIR_TABLE_NAME => 'REPAIR_LOG'
);
END;
/
3️⃣ Sprawdzenie wyników:
SELECT * FROM REPAIR_LOG;
d) Użycie narzędzia RMAN do wykrywania korupcji
Oracle Recovery Manager (RMAN) może sprawdzić integralność danych w bazie.
1️⃣ Skanowanie uszkodzonych bloków w całej bazie danych:
RMAN> BACKUP VALIDATE CHECK LOGICAL DATABASE;
📌 CHECK LOGICAL – sprawdza zarówno korupcję fizyczną, jak i logiczną.
2️⃣ Sprawdzenie integralności konkretnego pliku danych:
RMAN> BACKUP VALIDATE CHECK LOGICAL DATAFILE 5;
3️⃣ Znalezienie uszkodzonych bloków w backupie RMAN:
RMAN> VALIDATE DATABASE;
e) DBVERIFY – narzędzie do sprawdzania bloków
DBVERIFY to narzędzie dostarczane z Oracle do sprawdzania integralności bloków w plikach danych.
🔹 Przykład sprawdzenia konkretnego pliku danych:
dbv file=/u01/oradata/prod/data01.dbf blocksize=8192
🔹 Przykładowy wynik w przypadku błędów:
DBVERIFY - Verification starting : FILE = /u01/oradata/prod/data01.dbf
Page 123456 is corrupt
Naprawa
Naprawa za pomocą RMAN
RMAN umożliwia naprawę uszkodzonych bloków, jeśli masz backup.
🔹 Naprawa uszkodzonych bloków w bazie danych:
RMAN> BLOCKRECOVER DATAFILE 5 BLOCK 12345;
🔹 Naprawa wielu bloków jednocześnie:
RMAN> RECOVER CORRUPTION LIST;
b) Oznaczenie bloków jako uszkodzone i pominięcie ich
Jeśli nie można naprawić bloku, można oznaczyć go jako uszkodzony, aby Oracle go ignorował.
1️⃣ Dodanie uszkodzonego bloku do listy ignorowanych:
BEGIN
DBMS_REPAIR.FIX_CORRUPT_BLOCKS(
SCHEMA_NAME => 'HR',
OBJECT_NAME => 'PRACOWNICY',
OBJECT_TYPE => DBMS_REPAIR.TABLE_OBJECT
);
END;
/
2️⃣ Oznaczenie uszkodzonych bloków jako pominięte:
BEGIN
DBMS_REPAIR.SKIP_CORRUPT_BLOCKS(
SCHEMA_NAME => 'HR',
OBJECT_NAME => 'PRACOWNICY',
OBJECT_TYPE => DBMS_REPAIR.TABLE_OBJECT,
FLAGS => DBMS_REPAIR.SKIP_FLAG
);
END;
/
Odtworzenie danych z backupu
Jeśli uszkodzenie dotyczy wielu bloków, lepszym rozwiązaniem może być przywrócenie danych z backupu.
1️⃣ Przywrócenie bazy z backupu RMAN:
RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE;
2️⃣ Przywrócenie tylko jednego pliku danych:
RMAN> RESTORE DATAFILE 5;
RMAN> RECOVER DATAFILE 5;