IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration Oracle Discussion :

Bloc de données Oracle altéré (ORA-01578)


Sujet :

Administration Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Bloc de données Oracle altéré (ORA-01578)
    Bonjour,

    en voulant dropper tous les objets d'une instance de ma base, je suis tombé sur l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Error on line 0
    DROP TABLE HDBQUAL5.PI_DIRECT_DEBIT
     
    ORA-00604: une erreur s'est produite au niveau SQL récursif 1
    ORA-01578: bloc de données ORACLE altéré (fichier # 4, bloc # 161257)
    ORA-01110: fichier de données 4 : '/home/hdradm/logi/oracle/PMHDB1P/DATA/DATA1.dbf'
    Seul cet objet (avec un index lié) ne veut pas se détruire.
    J'ai effectué un dbv sur le fichier de données, qui donne :

    DBVERIFY - Verification complete

    Total Pages Examined : 262144
    Total Pages Processed (Data) : 47309
    Total Pages Failing (Data) : 0
    Total Pages Processed (Index): 64090
    Total Pages Failing (Index): 0
    Total Pages Processed (Other): 138106
    Total Pages Processed (Seg) : 0
    Total Pages Failing (Seg) : 0
    Total Pages Empty : 12634
    Total Pages Marked Corrupt : 5
    Total Pages Influx : 0
    Highest block SCN : 667116904 (0.667116904)


    Il y a donc des blocs corrompus dans ma base.

    Pour corriger cela, j'ai donc suivi les instructions d'utilisation du package DBMS_REPAIR trouvées ici : http://download-west.oracle.com/docs...231/repair.htm

    Seulement, au moment d'exécuter la procédure CHECK_OBJECT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DECLARE num_corrupt INT;
    BEGIN
    num_corrupt := 0;
    DBMS_REPAIR.CHECK_OBJECT (
         SCHEMA_NAME => 'HDBQUAL5',
         OBJECT_NAME => 'PI_DIRECT_DEBIT',
         REPAIR_TABLE_NAME => 'REPAIR_TABLE',
         CORRUPT_COUNT =>  num_corrupt);
    END;
    /
    ...plutôt que de me retourner le nombre de blocs corrompus trouvés, la procédure me renvoit... la même erreur !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DECLARE num_corrupt INT;
    *
    ERROR at line 1:
    ORA-00604: error occurred at recursive SQL level 1
    ORA-01578: ORACLE data block corrupted (file # 4, block # 161257)
    ORA-01110: data file 4: '/home/hdradm/logi/oracle/PMHDB1P/DATA/DATA1.dbf'
    ORA-06512: at "SYS.DBMS_REPAIR", line 293
    ORA-06512: at line 4
    Donc là je me trouve complètement bloqué.

    Auriez-vous une idée de comment réparer/contourner cela ? Je précise que je suis sous Oracle 10g et que je suis assez novice concernant les DB...

    Merci.

  2. #2
    Membre éprouvé Avatar de 13thFloor
    Homme Profil pro
    DBA Oracle freelance
    Inscrit en
    Janvier 2005
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle freelance

    Informations forums :
    Inscription : Janvier 2005
    Messages : 670
    Points : 945
    Points
    945
    Par défaut
    Si l'objet est un index : rebuild.
    Si l'objet est une table : exporter les données valides en utilisant les rowids.
    Tu fais 2 export de ta table avec une clause where pour les rowids :
    1/ inférieure ou égal au rowid du bloc précédent celui qui est corrompu (161257)
    2) supérieure au rowid du bloc suivant
    Avec tes 2 exports tu reconstitues ta table (sans les données du bloc corrompu).

    Si ton objectif est de tout dropper, stoppes la base, fais un fsck du file-system concerné et reconstruis une nouvelle db vierge à l'identique.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 083
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 083
    Points : 271
    Points
    271
    Par défaut
    Bonjour,
    en utilisant le numéro de block j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SQL> select count(*) from sysman.MGMT_METRICS_RAW;
    select count(*) from sysman.MGMT_METRICS_RAW
                                *
    ERROR at line 1:
    ORA-01578: ORACLE data block corrupted (file # 3, block # 27080)
    ORA-01110: data file 3: 'D:\BASE\MYDB\DATA\SYSAUX01.DBF'
    SQL> select * from sysman.MGMT_METRICS_RAW where rowid=27080;
    select * from sysman.MGMT_METRICS_RAW where rowid=27080
                                                     *
    ERROR at line 1:
    ORA-00932: inconsistent datatypes: expected - got NUMBER
    Merci pour votre aide.

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 50
    Points : 56
    Points
    56
    Par défaut
    Le rowid n'est pas un numéro de bloc oracle, ce n'est pas non plus un type numérique mais un type en tant que tel (manipulable tout de même en varchar2).

    Voici une piste pour exclure ton bloc corrompu (27080) de ta sélection:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM sysman.MGMT_METRICS_RAW 
    where DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid) <> 27080;

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 083
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 083
    Points : 271
    Points
    271
    Par défaut
    Merci severn mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SQL> SELECT count(*) FROM sysman.MGMT_METRICS_RAW
      2  WHERE DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid) <> 27080;
    WHERE DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid) <> 27080
          *
    ERREUR à la ligne 2 :
    ORA-06553: PLS-306: numéro ou types d'arguments erronés dans appel à
    'ROWID_BLOCK_NUMBER'

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 50
    Points : 56
    Points
    56
    Par défaut
    Pourtant la syntaxe est correcte.
    La signature de la fonction est la suivante (en 10.2.0.4 et postérieures):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dbms_rowid.rowid_block_number(
    row_id     IN ROWID,
    ts_type_in IN VARCHAR2 DEFAULT 'SMALLFILE') 
    RETURN NUMBER;
    As-tu la visibilité et les privilèges adéquats sur ce package?

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/11/2010, 13h22
  2. ORA-01578: bloc de données ORACLE altéré
    Par DoDoDo dans le forum Oracle
    Réponses: 2
    Dernier message: 17/06/2010, 16h35
  3. Erreur ORA-01578 récurente (bloc de données altéré)
    Par Korfandar dans le forum Administration
    Réponses: 3
    Dernier message: 30/09/2009, 13h37
  4. ORA-01578: ORACLE data block corrupted
    Par diabolo73 dans le forum Oracle
    Réponses: 1
    Dernier message: 23/10/2006, 20h04
  5. [9i] bloc de données altéré
    Par remika dans le forum Oracle
    Réponses: 37
    Dernier message: 09/09/2005, 15h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo