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 :
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.ORA-39002 : Opération non valide
ORA-39166 : L'objet TABLE1 est introuvale.
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.
Partager