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;