Oracle NOLOGGING. Quando il backup è "Success" ma il Restore è inutilizzabile

Questo articolo descrive un caso tipico in cui il software di backup (in questo caso specifico Rubrik, ma valido per molti altri) completa con successo il backup del database Oracle, ma il dato risulta successivamente inutilizzabile.

L'Incident

Questo Case Study tocca un punto dolente, molto comune. Rubrik considerava corretti i backup Oracle, tuttavia, da un test di restore dell’ambiente, risultava che, post recover PITR, il database segnalasse una serie di blocchi corrotti: 

ORA-01578: ORACLE data block corrupted (file # .., block # ..)
ORA-01110: data file 4: '*DISKGROUP/…’
ORA-26040: Data block was loaded using the NOLOGGING option

Una volta aperto il database risultavano errori di accesso a determinate tabelle, rendendo inutilizzabile il restore.

La causa

Quando contemporaneamente abbiamo gli errori ORA-01578 ( se abilitata la TDE troverete ORA-28304) e ORA-26040 siamo in presenza di un caso di corruption “controllata”, ovvero l’applicativo ha impostato delle operazioni con hint NOLOGGING, creando, de facto, delle operazioni volutamente non recuperabili.

Per abilitare il NOLOGGING serve una serie di combinazioni di parametri a livello DB/TBS/TABELLA/DDL

Table Mode Insert Mode ArchiveLog Mode Result
LOGGING APPEND ARCHIVE LOG Redo generated
NOLOGGING APPEND ARCHIVE LOG No redo (Critical)
LOGGING No append ARCHIVE LOG Redo generated
NOLOGGING No append ARCHIVE LOG Redo generated
LOGGING APPEND NoArchiveLog No redo
NOLOGGING APPEND NoArchiveLog No redo
LOGGING No append NoArchiveLog Redo generated
NOLOGGING No append NoArchiveLog Redo generated

 

Esempio classico: il database è in ARCHVELOG e viene lanciato un insert con hint /*+ APPEND NOLOGGING */. Questo evita la generazione di REDO, rendendo l’operazione veloce ma non recuperabile in caso di media recovery.

Di norma lato DBA, il database administrator, assieme all’applicativo può decidere di impostare la parametrizzazione a livello di : 

  • tablespace
  • tabella
  • indice
  • partizione
  • sottopartizione

Invece a livello DML è possibile con gli hint su:

  • INSERT
  • CTAS
  • CREATE INDEX
  • ALTER TABLE
  • ALTER INDEX

Di per sè tale opzione è una feature se usata consapevolmente, ma anche un enorme problema se usata massicciamente per dato non ricaricabile.

La remediation

Se non si ha il controllo sul codice è possibile forzare il FORCE LOGGING in uno di questi livelli: 

  • database
  • pluggable db
  • tablespace

in modo da propagare a tutti gli oggetti ivi contenuti.

Questo permette di evitare che implementazioni di operazioni di NOLOGGING creino problemi nei ripristini PITR o nei recover da snapshot.

 

Come diagnosticare la "corruzione silenziosa"

Verificare se i propri backup contengono blocchi corrotti da operazioni NOLOGGING è fondamentale, poiché la corruzione non emerge durante il backup, ma solo durante il ripristino.

Esistono due metodi principali di verifica:

1. Test di Restore Funzionale (Metodo Empirico)

Il metodo più sicuro è pianificare test di restore periodici. Attenzione: Non basta che il restore termini con successo e il database si apra (OPEN). È necessario eseguire query di lettura (SELECT COUNT(*)) sulle tabelle critiche o eseguire test applicativi. Solo accedendo fisicamente ai dati l'errore ORA-01578 verrà scatenato se il blocco è corrotto.

2. Validazione Tecnica tramite RMAN

Se si desidera un controllo più rapido e mirato senza dover eseguire test applicativi manuali, è possibile utilizzare RMAN direttamente sul database appena ripristinato (post Recover PITR). La procedura varia a seconda della versione di Oracle:

  • A) Per Oracle 12.2 e versioni successive - su un database ripristinato (dopo il Recover PITR), eseguire il comando specifico: RMAN> VALIDATE DATABASE NONLOGGED BLOCK;

Questo comando scansiona i file e popola la vista dinamica v$nonlogged_block. Per vedere i risultati, interrogare la vista via SQL: SELECT * FROM v$nonlogged_block;

  • B) Per Oracle 11g e versioni precedenti alla 12.2 - la sintassi specifica non è disponibile, quindi si utilizza il comando di validazione generico: RMAN> VALIDATE DATABASE;

Successivamente, bisogna interrogare la vista di sistema che registra le corruzioni:

Per Oracle 11g e 12.1
SELECT * FROM v$database_block_corruption 
WHERE CORRUPTION_TYPE = 'NOLOGGING';

Per versioni molto obsolete (pre-11g)
SELECT * FROM v$database_block_corruption 
WHERE CORRUPTION_TYPE = 'LOGICAL';

È cruciale comprendere che i software di backup (come Rubrik, Veeam, ecc.) non segnaleranno mai questo errore. Dal punto di vista di RMAN (e quindi del software di backup), un blocco marcato come "NOLOGGING" è un blocco tecnicamente valido e coerente: Oracle ha scelto volontariamente di non scriverci dati. Di conseguenza, una dashboard di backup "verde" non garantisce l'assenza di questo problema.

Ti è piaciuto quanto hai letto? Iscriviti a MISPECIAL, la nostra newsletter, per ricevere altri interessanti contenuti.

Iscriviti a MISPECIAL
Contenuti simili
DIGITAL ENTERPRISE
nov 03, 2025

5 Novembre il webinar imperdibile.

DIGITAL ENTERPRISE
ott 14, 2025

AI TRiSM framework per la gestione della fiducia, del rischio e della sicurezza dell'intelligenza artificiale