Il existe deux types de corruption.
a. Corruption physique: Cela se produit généralement en raison de la corruption des médias. Dans ce cas, le bloc n’est pas valide checksum.it peut contient zéro. Ceci est généralement le résultat de problèmes d’infrastructure tels que les médias, le réseau, la mémoire.
RMAN block recover peut être utilisé pour supprimer la corruption physique
Nous voyons l’erreur ORA-01578: Bloc de données ORACLE corrompu dans le journal des alertes lorsque oracle détecte une corruption physique. Oracle détecte la corruption en vérifiant l’en-tête de bloc et le pied de page de bloc.
b. Corruption logique: Cela se produit lorsque oracle trouve l’en-tête et le pied de page du bloc bons mais qu’il trouve une cohérence interne dans le bloc. Généralement, cela se produit en raison d’un bug dans le logiciel Oracle. Lorsque oracle le détecte, il renvoie l’erreur dans le journal des alertes.
ORA-08103 – Cette erreur est une erreur de corruption logique pour un bloc de données particulier.
ORA-00600 – Cette erreur est liée à la corruption de bloc et se produit en raison d’un SCN plus élevé que celui de la base de données SCN.
Comment vérifier la corruption de la base de données
La corruption de la base de données peut être trouvée en utilisant la méthode ci-dessous
a. RMAN
c. Vérification du journal des alertes pour une occurrence possible
c. dbverify
d. Export
e. Analyser la commande
RMAN
Exécuter la commande ci-dessous
RMAN> backup validate check logical database;
» L’option « CHECK LOGICAL » est utilisée pour identifier les corruptions de blocs physiques et logiques.
Nous pouvons utiliser la commande ci-dessous au cas où nous souhaiterions effectuer une vérification sélective
BACKUP VALIDATE DATAFILE 1;BACKUP VALIDATE check logical DATAFILE 1;BACKUP VALIDATE TABLESPACE TOOLS;BACKUP VALIDATE check logical TABLESPACE TOOLS;BACKUP VALIDATE BACKUPSET 1;BACKUP VALIDATE CURRENT CONTROLFILE;
Sélectionnez la vue pour identifier les blocs corrompus détectés par RMAN.
SQL> select * from v$database_block_corruption;For each row, find the segment impactedSQL> SELECT TABLESPACE_NAME, SEGMENT_NAME, PARTITION_NAME, SEGMENT_TYPE FROM DBA_EXTENTS WHERE FILE_ID=&FILE_ID AND &BLOCK_ID BETWEEN BLOCK_ID AND BLOCK_ID + BLOCKS - 1;
Veuillez noter qu’une fois un bloc corrompu réparé, la ligne identifiant le bloc est supprimée de la vue.
Vérification du journal des alertes pour une occurrence possible
Vérification de l’alerte. fichier journal des blocs corrompus, liste des fichiers de données.
For ex:- ORA-01578: ORACLE data block corrupted (file # 11, block # 45)ORA-01110: data file 5: '/xyz/db01.dbf'
dbverify
Vous pouvez également utiliser l’utilitaire dbverify pour identifier les Corruptions Intra-Blocs physiques et logiques.
dbv file=datafile_name blocksize=datafile_block_size
Vous pouvez utiliser la commande ci-dessous pour générer la commande dbv pour tous les fichiers de données
sqlplus /nologconnect / as sysdbaset feedback offset head offset echo offset linesize 200set pagesize 2500spool /tmp/dbvlogs/dbvchk.shselect 'dbv file=' || name || ' blocksize='|| block_size || ' logfile=' ||substr(name, instr(name, '/', -1, 1) +1) ||'.' || file# || '.log' from v$datafile/spool off
En cas de périphérique BRUT
select 'dbv file='||name||' blocksize='||block_size||' end='||(bytes/block_size)||' logfile='||substr (name, instr (name, '/', -1, 1) + 1)||'.'||file#||'.log'from v$datafile;
En cas de stockage ASM
select 'dbv file=' || name || ' blocksize='|| block_size || ' USERID=sys/&SYS_PASSWORD logfile=' ||substr(name, instr(name, '/', -1, 1) +1) ||'.' || file# || '.log' from v$datafile/
Export
En utilisant l’exportation de la table ou du schéma, vous trouverez également la corruption dans la table ou le schéma
Mais la grande limitation avec l’exportation est qu’elle échoue immédiatement après avoir rencontré la première corruption., donc une image complète sera manquée.La commande
ANALYZE
ANALYZE a été désignée comme le meilleur utilitaire qui effectue un maximum de vérifications.
C’est l’utilitaire facile pour vérifier les corruptions associées à l’index sur n’importe quel moyen.
Pour vérifier la corruption avec une table, procédez comme suit:
ANALYZE TABLE <OWNER.TABLE_NAME> VALIDATE STRUCTURE;
Pour vérifier la corruption avec un index, procédez comme suit:
ANALYZE INDEX <OWNER.INDEX_NAME> VALIDATE STRUCTURE;
Pour vérifier la corruption avec la table et son ou ses index pour effectuer les vérifications de références croisées, procédez comme suit:
ANALYZE TABLE <OWNER.TABLE_NAME> VALIDATE STRUCTURE CASCADE;
Pour les tables de partition, nous devons utiliser la commande ANALYZE avec l’option INTO INVALID_ROWS, similaire à ce qui suit:
ANALYZE TABLE <OWNER.TABLE_NAME> VALIDATE STRUCTURE CASCADE INTO INVALID_ROWS;
Comment corriger la corruption
a. En utilisant la commande blockrecover RMAN
Avec Block recover, seuls les blocs en cours de récupération ne sont pas disponibles, le fichier de données rest est disponible
RMAN > blockrecover datafile 10 bloc 1688
RMAN > RESTAURATION DE LA LISTE DE CORRUPTION BLOCKRECOVER JUSQU’À l’heure ‘SYSDATE – 7’;
b. Utilisation de la récupération du fichier de données à partir d’une sauvegarde ou d’une veille (si vous en avez)
c. Récupération complète de la base de données
d. Dans le cas où il s’agit uniquement d’une corruption d’index, nous pouvons supprimer l’index et le recréer
e. Nous pouvons utiliser DBMS_REPAIR. Il ne corrigera pas le bloc corrompu, mais il marquera ce bloc comme saut et vous ne vérifierez pas ce bloc maintenant