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

Oracle Discussion :

[8.0.5-->9.2.0.5] Checksum sur des tables oracle


Sujet :

Oracle

  1. #1
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 59
    Points : 41
    Points
    41
    Par défaut [8.0.5-->9.2.0.5] Checksum sur des tables oracle
    Bonjour,

    je dois récupérer les données d'une base sous 8.0.5 pour les intégrer dans une base 9i.

    Pour tester l'intégrité des données, je voulais savoir savoir s'il existait, ou si quelqu'un a déjà mis en place un type de checksum sur une table?

    En, une manière basique de tester l'intégrité d'une table serait de faire un et de comparer le résultat sur les 2 bases.

    Mais je me demandais s'il était possible de faire quelque chose d'un peu plus évolué. C'est pour ça que je pensais à un sorte de checksum. Je ne sais pas si c'est un peu farfelu comme idée, mais je n'en ai pas d'autre

    Si quelqu'un avait quelque chose à me proposer, ça serait super cool.

    Merci d'avance

  2. #2
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Oracle utilise deux paramètres pour les checksums
    - DB_BLOCK_CHECKSUM = true/false : si true calcule une checksum lors de l'écriture d'un bloc sur le disque. La checksum permet de vérifier que ce qui a été écrit dans le bloc est bien ce qu'on lit actuellement.
    - DB_BLOCK_CHECKING = true/false : si false fait une vérification de cohérence des blocs uniquement pour le tablespace SYSTEM sinon pour tous les tablespaces.

    <edit>Par contre, ca n'est pas possible de faire une requête qui retournerait tous les objets qui posent un problème. Je suppose qu'Oracle t'envoies un message d'erreur élégant quand il détecte une incohérence...
    </edit>

    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  3. #3
    Expert Oracle confirmé

    Homme Profil pro
    Consultant Big Data
    Inscrit en
    Mars 2003
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant Big Data
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2003
    Messages : 448
    Points : 926
    Points
    926
    Par défaut
    Bonjour,

    Je ne suis pas spécialiste, mais je voudrais dire 2 choses :

    1 ) faire un select count (*) n'est pas une bonne chose, car l'optimiseur peut choisir de faire un Fast Full Scan Index. En clair, pour donner le nombre d'occurrences de la table, il ne va pas lire tous les blocs de la table (et donc détecter les erreurs), mais lire tous les blocs de l'index (ce qui détecterait les blocs corrompus, mais de l'index),

    2 ) il existe un utilitaire DBVERIFY qui permet justement de vérifier l'intégrité des blocs de données. Cet utilitaire (dbv.exe) marche aussi bien sur les database files de la base online, que sur les backups.

  4. #4
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 59
    Points : 41
    Points
    41
    Par défaut
    En fait je pense que je me suis peut être exprimé.

    Ou bien c'est moi qui ne comprend pas tout. En fait vous préconisez de tester l'intégrité des données en testant l'intégrité des blocs.

    Par exemple si j'ai une table T_toto sur ma base 8.0.5. Je l'exporte vers une base 9i dont la gestion des tablespace est différente, donc la gestion des blocs aussi.

    Sur ma base 8.0.5, je teste ma table en faisant le select count(*) qui je le conviens n'est peut être pas top. Je trouve 1 million de lignes.

    Sur ma base 9i, je fais la même chose et je trouve aussi 1 millions de lignes.

    A priori, je peux me dire que j'ai les mêmes sur ma base 8.0.5 et ma base 9i.

    En fait je voulais juste savoir si on pouvait tester le contenu de la table par un algo ou une fonction quelconque, et ainsi comparer le résultat sur les deux bases. En gros y a t il une alternative à se contenter de compter le nombre de lignes de la table pour chaque base pour se dire qu'on a bien les mêmes infos??

    Je parlais de checksum car j'ai vu cette fonction sur Unix, mais c'était juste à titre d'exemple.

  5. #5
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Si tu veux comparer deux tables, le plus simple est de regarder les différences symétriques :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    -- lignes dans T1 mais pas dans T2
    select *
    from   T1
    minus
    select * 
    from   T2
    /
     
    -- lignes dans T2 mais pas dans T1
    select *
    from   T2
    minus
    select * 
    from   T1

    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  6. #6
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Citation Envoyé par rouardg
    Bonjour,

    Je ne suis pas spécialiste, mais je voudrais dire 2 choses :

    1 ) faire un select count (*) n'est pas une bonne chose, car l'optimiseur peut choisir de faire un Fast Full Scan Index. En clair, pour donner le nombre d'occurrences de la table, il ne va pas lire tous les blocs de la table (et donc détecter les erreurs), mais lire tous les blocs de l'index (ce qui détecterait les blocs corrompus, mais de l'index),
    je ne pense pas qu'un SELECT COUNT(*) utilise un index d'une quelconque manière
    d'une part parce que l'optimisateur ne saurait pas lequel choisir et d'autre part parce que, par définition, un index ne stocke pas les valeurs NULL.
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  7. #7
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Citation Envoyé par SheikYerbouti
    je ne pense pas qu'un SELECT COUNT(*) utilise un index d'une quelconque manière
    d'une part parce que l'optimisateur ne saurait pas lequel choisir et d'autre part parce que, par définition, un index ne stocke pas les valeurs NULL.

    Si tu as une colonne NOT NULL alors Oracle peut utiliser un index sur cette colonne dans le cadre d'un count(*) :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    SQL> select count(*) from EMP_1;
     
      COUNT(*)
    ----------
            14
     
     
    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=21954 Card=1)
       1    0   SORT (AGGREGATE)
       2    1     TABLE ACCESS (FULL) OF 'EMP_1' (TABLE) (Cost=21954 Card=1000000)
     
    SQL> alter table EMP_1 modify empno not null;
     
    Table altered.
     
    SQL> select count(*) from EMP_1;
     
      COUNT(*)
    ----------
            14
     
     
    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=1 Card=1)
       1    0   SORT (AGGREGATE)
       2    1     INDEX (FULL SCAN) OF 'IDX_EMPNO' (INDEX) (Cost=1 Card=1000000)
    Par contre, ici Oracle fait un Index - Full Scan avant de compter les résultats. Je pensais qu'il aurait fait un Index - FFS. L'index est non unique mais j'ai le même résultat avec un index unique.

    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  8. #8
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 59
    Points : 41
    Points
    41
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    -- lignes dans T1 mais pas dans T2
    select *
    from   T1
    minus
    select *
    from   T2
    /
     
    -- lignes dans T2 mais pas dans T1
    select *
    from   T2
    minus
    select *
    from   T1
    Ca a l'air pas mal ça, mais le pb, c'est que les 2 tables sont sur 2 bases différentes. Si je ne me trompe pas, c'est imossible :

  9. #9
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Non, il suffit de créer un database link entre les deux bases. Cherches sur le forum tu devrais trouver plus d'infos.


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  10. #10
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 59
    Points : 41
    Points
    41
    Par défaut
    OK merci, je vais regarder. Je pense que je vais retenir cette solution.

    Merci de vos réponses

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Documentation gratuite sur l'API Windows, COM, DCOM, OLE, etc.
    Par Community Management dans le forum Windows
    Réponses: 1
    Dernier message: 16/11/2006, 15h28
  2. [Kylix] Kylix embarqué sur PDA ?
    Par Anonymous dans le forum NoSQL
    Réponses: 10
    Dernier message: 29/11/2002, 13h59
  3. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18
  4. Réponses: 4
    Dernier message: 27/03/2002, 11h03
  5. F.A.Q, Doc, cours, tutoriels sur JBuilder
    Par Ricky81 dans le forum JBuilder
    Réponses: 0
    Dernier message: 14/03/2002, 15h28

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