Lors d’une duplication de schéma entre deux databases 11g, via les outils DataPump d’Oracle « expdp / impdp », un client nous appelle car il tombe sur une erreur ORA—00439 dans la phase d’import :
ORA-00439: fonction non activée : Deferred Segment Creation
Il lui semble que le problème vient de la base source, car après des recherches avec son ami « G….e », il lui semble qu’il faut modifier le paramètre « deferred_segment_creation » pour le passer à FALSE.
Il redémarre l’instance source, fait un export complet avec expdp, puis importe à nouveau le schéma désiré via impdp MAIS toujours la même erreur.
Il nous envoie donc son log en nous demandant de l’aide pour ce transfert de schéma qui ne devait lui prendre que quelques minutes :
Import: Release 11.2.0.1.0 - Production on … 2014 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. ;;; Connecté à : Oracle Database 11g Release 11.2.0.1.0 - 64bit Production Table maître "SYSTEM"."SYS_IMPORT_SCHEMA_01" chargée/déchargée avec succès Démarrage de "SYSTEM"."SYS_IMPORT_SCHEMA_01" : system/********@XXXXX directory=datapump dumpfile=XXXXX.DMP schemas=XXXXX Traitement du type d'objet SCHEMA_EXPORT/USER Traitement du type d'objet SCHEMA_EXPORT/SYSTEM_GRANT Traitement du type d'objet SCHEMA_EXPORT/ROLE_GRANT Traitement du type d'objet SCHEMA_EXPORT/DEFAULT_ROLE Traitement du type d'objet SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA Traitement du type d'objet SCHEMA_EXPORT/TYPE/TYPE_SPEC Traitement du type d'objet SCHEMA_EXPORT/SEQUENCE/SEQUENCE Traitement du type d'objet SCHEMA_EXPORT/TABLE/TABLE ORA-39083: Echec de la création du type d'objet TABLE:"XXXXX"."DATA" avec erreur : ORA-00439: fonction non activée : Deferred Segment Creation SQL en échec : CREATE TABLE ... .... .... Traitement du type d'objet SCHEMA_EXPORT/TABLE/TRIGGE Traitement du type d'objet SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS Traitement du type d'objet SCHEMA_EXPORT/TABLE/INDEX/DOMAIN_INDEX/INDEX Traitement du type d'objet SCHEMA_EXPORT/JOB Travail "SYSTEM"."SYS_IMPORT_SCHEMA_01" terminé avec 105 erreur(s) à 10:15:40
Nous lui demandons de préciser la version et l’édition de la database source :
11.2.0.3.0 Enterprise Edition
La version cible : 11.2.0.1.0 Standard Edition est donnée dans la trace de l’impdp.
Notre premier réflexe : l’orienter sur notre blog préféré 😉 Où l’article suivant nous explique tout sur ce paramètre « à surprise » Deferred Segment Creation en 11gR2 :
http://arkzoyd.wpengine.com/2011/04/18/effet-cache-de-la-database-11g-deferred-segment-creation/?lang=fr
Et là tout s’éclaire : On ne peut pas importer en Standard Edition des Tables créées avec ce paramètre, qui est fait pour une fonctionnalité utilisable en Enterprise Edition…
Faut-il donc passer sur toutes les tables et indexes de la base source ? pour passer une instruction du type :
alter table allocate extent;
Mais non ! Car impdp a tout prévu : quand on exporte / importe des databases de versions différentes, il est judicieux de préciser le paramètre « version ».
Nous allons donc tromper « impdp » en positionnant le paramètre « version=11.1 » qui va faire ignorer à l’import les fonctionnalités « par défaut » de la 11.2. Car c’est seulement depuis la 11.2 que le paramètre deferred_segment_creation est à TRUE par défaut.
Donc si le deferred_segment_creation n’a pas été mis explicitement, lors de la création des tables et indexes du schéma, cette option sera ignorée à l’import.
Nous proposons donc à notre client de faire un import du style :
impdp <tous les paramètres comme avant>
version=11.1
Puis de nous appeler et nous envoyer des logs si le problème persiste ou si un autre survient.
ET la bonne nouvelle c’est que … pas de nouvelle ! L’astuce a donc fonctionné.