L’utilisation d’une option Oracle soumise à licence sans posséder celle-ci arrive chaque jour malheureusement. Il y a le cas où :
- La personne (développeur ou même DBA non agguéri) a pu prendre connaissance d’une fonctionnalité intéressante présente dans la documentation Oracle, où à aucun moment celle-ci n’est qualifiée de payante et l’utilise
- Le moteur utilise de lui même une option soumise à licence (bug ou exception)
- La personne sait que la fonctionnalité est soumise à licence, qu’il ne possède pas celle-ci mais l’utilise quand même
Dans cet article, nous traiterons le premier cas à l’aide d’un export/import transportable tablespace
Prérequis :
- Vérification de l’état des composants de la registry pour installer les mêmes lors de la recréation de la base :
select comp_name, version, status from dba_registry;
- Vérification de l’usage des options soumises/non soumises à licence :
col feature_info for a60; select name,version,detected_usages,first_usage_date,last_usage_date,feature_info from dba_feature_usage_statistics;
- Sauvegarde du controlfile sous forme de trace :
alter database backup controlfile to trace;
- Générer un état des tablespace/datafile afin de pouvoir les recréer à l’identique
- Sauvegarder le spfile et le pfile
- Sauvegarder le fichier de mot de passe
- Sauvegarder la liste des objets invalides
- Vérifier la présence d’un backup RMAN (si la base est volumineuse) et/ou export (si la volumétrie est inférieure à 200G) au cas où la méthode de reconstruction ne se déroule pas comme prévue
- Sauvegarder le DDL de création des user :
set heading off; set echo off; set pages 2000; set long 99999; spool ddl_users.sql select dbms_metadata.get_ddl('USER',username) FROM dba_users; spool off
- Export des directories :
expdp \"/ as sysdba\" full=y include=directory directory=DMP_DIR dumpfile=EXPDP_directory.dmp logfile=EXPDP_directory.log
- Sauvegarde des statistiques dans un tablespace/schéma/table dédiée :
create tablespace sav_stat; create user sav_stat identified by ****; GRANT UNLIMITED TABLESPACE TO sav_stat; exec DBMS_STATS.CREATE_STAT_TABLE('SAV_STAT','sav_stat_base','SAV_STAT'); exec dbms_stats.export_database_stats('sav_stat_base',null,'SAV_STAT'); exec dbms_stats.export_dictionary_stats('sav_stat_base',null,'SAV_STAT'); exec dbms_stats.export_fixed_objects_stats('sav_stat_base',null,'SAV_STAT'); exec dbms_stats.export_system_stats('sav_stat_base',null,'SAV_STAT');
- Désactiver le job d’export s’il y en a un
Reconstruction :
- Interruption des connexions à la base
- Effectuer une sauvegarde transportable tablespace
EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('DWH,DWHIDX,ODS,PERFSTAT,SETRA,USERS', TRUE); SELECT * FROM TRANSPORT_SET_VIOLATIONS; alter tablespace PERFSTAT read only; alter tablespace DWH read only; alter tablespace DWHIDX read only; alter tablespace SAV_STAT read only; alter tablespace USERS read only; nohup expdp \"/ as sysdba\" transport_tablespaces=PERFSTAT,DWH,DWHIDX,USERS,SAV_STAT transport_full_check=y directory=DMP_DIR dumpfile=expdp_tts.dmp logfile=expdp_tts.log &
- Vérifier qu’il n’y a pas d’erreurs à la suite de l’export. Ne pas poursuivre s’il y a des erreurs, les corriger
- Arrêt de la base :
shutdown immediate;
- Suppression des fichiers de base de données suivants sysaux, system, sys, temp, undo, controlfiles, redologs (attention aux alias sous ASM et ne pas supprimer des fichiers utilisés)
- Démarrage de la base en mode nomount :
startup nomount;
- Recréation de la base en fonction des éléments collectés dans les prérequis
- Restreindre l’accès à la base :
alter system enable restricted session;
- Vérifier que les tablespaces/datafiles non applicatifs sont recréés avec la bonne configuration
- Recréer les composants nécessaires
- Recompiler tous les objets :
@?/rdbms/admin/utlrp.sql
- Vérifier l’état des composants de la registry :
select comp_name, version, status from dba_registry;
- Recréer la directory DMP_DIR pour effectuer les imports
- Recréer les users avec les ordres DDL générés en prérequis
- Recréer les directories sauf DMP_DIR avec l’export effectué en prérequis (générer le DDL)
impdp \"/ as sysdba\" directory=DMP_DIR dumpfile=EXPDP_DIRECTORIES.dmp sqlfile=ddl_directories.sqlfile
- Importer les tablespaces/datafiles :
nohup impdp \"/ as sysdba\" dumpfile=expdp_tts.dmp DIRECTORY=DMP_DIR TRANSPORT_DATAFILES='+DATA_SYSNAME/ORCL/datafile/fsdata01.277.821069105','+DATA_SYSNAME/ORCL/datafile/fsindex01.278.419052810' logfile=impdp_tts.log &
- Modifier l’état des tablespaces importés et vérifier leur état :
alter tablespace PERFSTAT read write; alter tablespace DWH read write; alter tablespace DWHIDX read write; alter tablespace SAV_STAT read write; alter tablespace USERS read write;
- Redonner l’accès à la base :
alter system disable restricted session;
- Vérifier que les jobs s’exécutent correctement
- Activer le job d’export s’il y en a un. Vérifier qu’il ne s’exécute pas juste après sa réactivation (dans le cas où sa dernière exécution n’aurait pas eu lieu)
- Recompiler tous les objets :
sqlplus / as sysdba @?/rdbms/admin/utlrp.sql
- Import des statistiques :
exec dbms_stats.import_database_stats('sav_stat_base',null,'SAV_STAT'); exec dbms_stats.import_dictionary_stats('sav_stat_base',null,'SAV_STAT'); exec dbms_stats.import_fixed_objects_stats('sav_stat_base',null,'SAV_STAT'); exec dbms_stats.import_system_stats('sav_stat_base',null,'SAV_STAT');
- Exécuter un backup RMAN
- Reconnecter les applications à la base
- Contrôler qu’il n’y a plus de traces d’utilisation de l’option :
col feature_info for a60; select name,version,detected_usages,first_usage_date,last_usage_date,feature_info from dba_feature_usage_statistics;
Besoin d’un audit licences ? N’hésitez-pas à nous contacter !