![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Blocs corrompus en Oracle 7 (23/09/2003) >Lors de la suppression d'un enregistrement dans une table, j'obtiens l'erreur oracle suivante :
>ORA-01578 : Oracle data block corrupted (file # 13, block # 54144)
>ORA-01110 : data file 13 :/chemin du datafile.dbf .
Oracle 7.2.3, Noarchivelog
Comment remédier ? Dans ce cas, on ne peut PAS récupérer les lignes mauvaises, mais on peut sauvegarder les bonnes.
Comment?
select * from sys.dba_extents where file_id = 13 and 54144 between block_id and (block_id + blocks - 1); (filenum et blocknum sont affichés par ORA-0578). Cette requête donne le nom du segment et son type, etc. Si on les connaît deja, tant mieux ;-)
event = "10231 trace name context forever" Cet event permettra d'occulter les blocs pourris lors d'un scan.
create table tempo as select * from TABLEINITIALE; drop table TABLEINITIALE; create table TABLEINITIALE as select * from tempo; (Ou un export, drop, import;)
Si plusieurs tables, index, sont atteints, réitérez :-) Oracle en général (15/03/2004) Qui n’a pas rencontré, au moins une fois, des blocs corrompus, qui ne s’est pas posé la question depuis quand existent-ils dans la base ? Plusieurs causes peuvent déterminer la corruption des blocs : interface d’entrée/sortie endommagée ou boguée (par exemple contrôleur disque défectueux), entrées/sorties OS incomplètes à cause d’un problème de cache, logiciels de réparation de disque (qui survient au boot suivant après l’écran bleu ?), mémoire défectueuse, etc.
Un bloc est écrit de manière binaire. ORACLE estime qu’un bloc est corrompu quand il n’est plus conforme à ce format. La vérification de cette conformité, présentée dans la première partie du livre, se fait d’habitude dans les couches supérieures du cache. Rappelons-nous qu’un bloc dans le cache contient des informations sur la version du bloc, les transactions le concernant et une information de checksum (non utilisée en standard afin de ne pas alourdir le traitement). Si une incohérence du bloc est détectée, en fonction de sa gravité et de la couche du noyau où elle a été découverte, le bloc est dit ‘media corrupt’ ou ‘software corrupt’.
Généralement, les erreurs ORA-1578 ou ORA-600 [3374] signalent la présence d’un ou plusieurs blocs corrompus. Nous pouvons dépister ces blocs en appliquant diverses méthodes, plus ou moins astucieuses :
Analyze table table_name validate structure cascade
Cette commande vérifie chaque bloc au niveau du cache et plus haut. Les index sont également analysés grâce à cet ordre.
Utiliser DB_VERIFY
DB_VERIFY est un utilitaire qui contrôle la cohérence physique des fichiers ORACLE. Les blocs de la base sont montés dans la SGA et les vérifications se font au niveau du cache. Il est utile, également, pour vérifier que les fichiers sauvegardés pourront être utilisés lors d’une restauration. Il accepte quelques paramètres dont un, non négligeable, est la taille du bloc. Il porte différents noms en fonction de la plate-forme OS. Vous pouvez vérifier les fichiers des données ou les fichiers redo log archivés.
Veillez à appliquer DB_VERIFY avec l’instance arrêtée, sinon … Ses paramètres possibles sont affichés avec la commande :
Db_verify help=yes Bien que vous n’êtes pas tenus de donner la plage de blocs à vérifier pour des fichiers OS (elle est obligatoire pour les raw devices), une bonne habitude est de l’indiquer systématiquement à DB_VERIFY !
Select bytes from v$datafile where name = ‘fichier’;Select value from v$parameter where name = ‘db_block_size’; Dbverf file=fichier, end=…
Checksum des blocsORACLE prévoit, par son architecture, la possibilité de marquer pour chaque bloc son checksum dans le bloc lui-même. L’écriture et l’analyse du checksum alourdissent d'environ 10% à 20% la charge globale d’ORACLE, mais l'analyse garantit l'alerte immédiate lors d’une non concordance. Les checksums sont calculés par DBWR et DIRECT LOADER lors de l’écriture du bloc et sont lus par les process serveurs. Le calcul et la vérification du checksum sont provoqués par les paramètres LOG_BLOCK_CHECKSUM pour les fichiers redo log et DB_BLOCK_CHECKSUM pour les fichiers de données.
Le paramètre _DB_BLOCK_CACHE_PROTECT (mis à TRUE), dans init.ora, renforce la protection du cache layer. Si jamais un bloc est corrompu dans le cache, il ne sera pas écrit sur le disque (globalement vous aurez un ORA-600 minimum ;-))
Dans la même plage de vérifications, nous disposons de plusieurs events pour vérifier la corruption des blocs. Ces events provoquent une corruption des blocs lors de la détection des erreurs :
alter session set events '102xx trace name context forever, level 10';
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||