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 :

Créer une vue matérialisée avec PREBUILD


Sujet :

Administration Oracle

  1. #1
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2003
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2003
    Messages : 46
    Points : 45
    Points
    45
    Par défaut Créer une vue matérialisée avec PREBUILD
    Bonjour,

    Après avoir résolu mon problème de création de vues matérialisée (MV) avec l'option PREBUILT TABLE, j'ai un nouveau problème dont je n'ai aucune idée comment le résoudre. Ci-dessous sa description.

    Contexte
    • RDBMS Oracle 11.2.0.1 standard edition
    • Une base de prod (PROD) avec une table extra large (1Go minimum).
    • Une base distante (ville différente) (DIST) devant contenir cette table et être mise à jour régulièrement avec les données de la table PROD, mais également mise à jour sans que les données remonte vers la PROD.


    1ère Solution envisagée
    • Création de la table vide TABLE1 sur DIST
    • Arrêt des utilisateurs de la base PROD
    • Export des données de la table via expdp
    • Création d'un MATERIALIZED VIEW LOGS sur la table de la base PROD
    • Redémarrage des utilisateurs de la base PROD (Temps T1)
    • Import des données de la table via impdp sur la base DIST
    • Création d'une MATERIALIZED VIEW avec option PREBUILT TABLE et FAST REFRESH (Temps T2)


    Pas de problème si ce n'est que les données créés, modifiées ou détruites entre T1 et T2 ne sont pas envoyé lors du REFRESH de la MV.
    Quand on regarde ce qui ce passe au niveau du log MLOG$_TABLE, entre T1 et T2 toutes les transactions sont sauvegardées.
    Mais dès que la commande de création de la MV sur DIST est exécutée, le log MLOG$_TABLE sur PROD est vidé mais les données pas mises à jour sur la base DIST.
    A la réflexion, on peut se dire que c'est normal car oracle ne sait pas à qui il doit envoyer les données qu'il a mises dans MLOG$_TABLE et qu'au rattachement de la MV, il vide le MLOG$_TABLE.

    2ème Solution envisagée
    • Création de la table vide TABLE1 sur DIST
    • Arrêt des utilisateurs de la base PROD
    • Export des données de la table via expdp
    • Création d'un MATERIALIZED VIEW LOGS sur la table de la base PROD
    • Création d'une MATERIALIZED VIEW avec option PREBUILT TABLE et FAST REFRESH
    • Redémarrage des utilisateurs de la base PROD
    • Import des données de la table via impdp sur la base DIST


    Dans ce cas, comme il n'y a pas de modification entre la création du MV log sur PROD et la création de la MV sur DIST, je pense que toutes les modifications ultérieures seront gardées dans MLOG$_TABLE jusqu'au REFRESH de la MV.
    J'ai donc fait en dernier mon IMPDP de ma table et j'ai eu les erreurs suivantes :
    ORA-39002 : Opération non valide
    ORA-39166 : L'objet TABLE1 est introuvale.
    En effet, la table existe bien sur DIST mais comme elle est encapsulée dans une MV, on ne doit surement plus pouvoir y toucher.

    Ma question est la suivante. Dans les doc oracle, sur les différents forums, blogs, ... il est dit que pour faire des MV de grosses tables quand il n'est pas possible de passer les données par le réseau lors de la création des MV alors utiliser l'option PREBUILT TABLE. Mais personne ne parle comment faire pour qu'il n'y ai pas perte de données.
    Si quelqu'un connait la solution, je le saurai gré de bien vouloir de la donner car je n'ai plus d'idée.

    Merci d'avance.

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 79
    Points : 170
    Points
    170
    Par défaut
    Citation Envoyé par foster06 Voir le message
    A la réflexion, on peut se dire que c'est normal car oracle ne sait pas à qui il doit envoyer les données qu'il a mises dans MLOG$_TABLE et qu'au rattachement de la MV, il vide le MLOG$_TABLE.
    Salut,
    Oui, c'est quasiment ca: pour lui, le tracking commence seulement quand la MV est créée. Pour empêcher ca, il faut créer la MV avec la clause NEVER REFRESH, Là, les logs ne seront pas mis à zéro. Ensuite, tu fais un ALTER sur ta MV pour remettre le mode de refresh que tu veux.

    MAIS je ne suis pas sûr que ce soit ce que tu veux: une MV updatable signifie que les modifs sur ta base distante vont être envoyées au master à chaque refresh. Ton besoin collerait plus avec une MV writeable, mais dans ce cas, les modifs sur la base distante seront perdues à chaque refresh... (cf la doc ici: http://docs.oracle.com/cd/B19306_01/...6/repmview.htm )

  3. #3
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2003
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2003
    Messages : 46
    Points : 45
    Points
    45
    Par défaut
    Bonjour,

    Merci beaucoup pour ta réponse. C'est vrai que je n'ai absolument pas penser à faire des ALTER sur les MV. En vérité, je ne pensais pas que c'était possible.

    MAIS je ne suis pas sûr que ce soit ce que tu veux: une MV updatable signifie que les modifs sur ta base distante vont être envoyées au master à chaque refresh. Ton besoin collerait plus avec une MV writeable, mais dans ce cas, les modifs sur la base distante seront perdues à chaque refresh..
    Merci pour ton conseil, mais c'est bien une MV writeable que je veux et non pas une MV updatable. Je ne désire pas que les données remontent sur la base de PROD. En plus, çà m'obligerait à créer un rep_object en réplication ce qui est plus lourd.
    Je vais essayer immédiatement et clôturerai la discussion si ça marche.

  4. #4
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2003
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2003
    Messages : 46
    Points : 45
    Points
    45
    Par défaut
    Voilà le résultat de mes tests. Il n'est pas très concluant.

    J'ai donc créé un MV log sur la base de prod via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    create materialized view log on SHM.TABLE1 tablespace TS_MVIEWLOG ;
    Pas de problème.

    J'ai fait quelques modifs sur la table. J'ai bien retrouvé les lignes dans le log MLOG$_TABLE1.

    Coté base distante DIST, j'ai créé ma MV sur la table déjà existante via :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE MATERIALIZED VIEW SHM.TABLES1
        ON PREBUILT TABLE
        WITHOUT REDUCED PRECISION
        NEVER REFRESH
        AS SELECT * FROM SHM.TABLE1@PROD;
    Pas de problème et les lignes de MLOG$_TABLES1 sur la PROD ne sont pas purgées.

    Ensuite, je modifie la MV afin de pouvoir la mettre à jour via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ALTER MATERIALIZED VIEW SHM.TABLE1 REFRESH FAST WITH PRIMARY KEY ;
    Pas de problème, la commande s'exécute.

    Enfin, j'essaie de faire un refresh de la table via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    BEGIN
      DBMS_MVIEW.REFRESH ('SHM.TABLE1','f');
    END ;
    /
    Et là j'ai l'erreur
    ORA-12057 : La vue matérialisée SHM.TABLE1 n'est pas valide et doit subir une régénération complète. Exactement ce que je ne veux pas.

    Le second problème, c'est que je veux que ma MV soit writeable, c'est pour cela que je dois la créer avec les options FOR UPDATE.
    Le problème c'est qu'oracle ne veut pas créer le MV avec NEVER REFRESH et FOR UPDATE.
    Si je crée la MV sans FOR UPDATE, il n'existe pas d'option dans le ALTER MATERIALIZED VIEW pour mettre FOR UPDATE.
    Et du coup, je ne peux pas modifier ma MV comme j'aimerai le faire.

    Donc j'ai avancé un peu mais je suis toujours dans la panade.

    Merci pour votre aide.

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 79
    Points : 170
    Points
    170
    Par défaut
    Salut,
    Désolé, du coup je ne sais pas. J'ai cherché sur internet, et pourrais-tu regarder ce que tu as dans la table mv_capabilities_table ?
    J'ai vu ca ici, ca a l'air intéressant: http://rwijk.blogspot.fr/2009/09/fas...ized-view.html

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/12/2008, 22h38
  2. Créer une vue avec des onglets
    Par Flackou dans le forum MFC
    Réponses: 2
    Dernier message: 14/06/2007, 12h43
  3. Enlever une instance de vues matérialisées avec Oracle 9i
    Par foster06 dans le forum Administration
    Réponses: 1
    Dernier message: 14/05/2007, 15h34
  4. Créer une vue avec du SQl dynamique
    Par gghonang2 dans le forum Oracle
    Réponses: 15
    Dernier message: 06/09/2006, 23h03
  5. Créer une vue avec des requêtes UNION ?
    Par webtheque dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/04/2005, 13h37

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