background success stories

Reconstruction d’une base Oracle après utilisation accidentelle d’une option payante

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 !