Overblog Suivre ce blog
Editer l'article Administration Créer mon blog

LAMI DBA

Cette fois nous allons partir dans les nuages à la découverte du cloud Amazon Web Services, avec un focus particulier sur les instances RDS Oracle (comprenez ici Remote Database Service). Nous allons découvrir comment réaliser des alimentations via export / import datapump entre deux instances RDS.

Dans un environnement AWS, le dba n'a pas accès à la machine hébergeant l'instance Oracle, il n'a en effet accès qu'à la database en tant que telle, et qui plus est ne dispose pas du privilège SYSDBA.

Il faut donc s'y connecter depuis un client Oracle via un serveur rebond pour réaliser des actions, quelles soient liées à de l'administration courante ou, dans mon exemple, à la génération de dump.


Je vais détailler ici les différentes étapes qui vont permettre l'alimentation d'une instance RDS, à partir d'une instance RDS source.

Etape 1 : Afin d'avoir un jeu de test, je crée un schéma MRS avec une table à exporter sur ma source :

SQL> create user mrs identified by "*****" default tablespace users profile default account unlock;
User created.

SQL> grant connect, create session to mrs;
Grant succeeded.

SQL> alter user mrs quota unlimited on users;
User altered.

SQL> alter session set current_schema=MRS;
Session altered.

SQL>create table tab1 tablespace users as select 'USER1_'||object_name str_col, sysdate dt_col from all_objects;

SQL> select count(*) from mrs.tab1;
  COUNT(*)
----------
     23091

 

Etape 2 : Depuis un compte possédant les privilèges nécessaires, on lance un petit bloc PL/SQL pour générer le dump :

Note : on notera l'impossibilité de gérer ce type d'export via un job oracle, car il n'est pas permis, sur AWS, de générer des processus serveurs esclaves.

[srvmaster@oracle] sqlplus myuser/xxxx@MASOURCE
Connected to:
Oracle Database 12c Standard Edition Release 12.1.0.2.0 - 64bit Production

SQL> DECLARE
hdnl NUMBER;
BEGIN
hdnl := DBMS_DATAPUMP.open( operation => 'EXPORT', job_mode => 'SCHEMA', job_name=>null);
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'exp_mrs.dmp', REUSEFILE => 1, directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file);
DBMS_DATAPUMP.add_file( handle => hdnl, filename => 'exp_mrs.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file);
DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''MRS'')');
DBMS_DATAPUMP.start_job(hdnl);
END;
/ 

 

On vérifie que notre dump et son log soient bien générés en listant le contenu du directory DATA_PUMP_DIR, via une fonction mise à disposition par AWS :

SQL> select * from table (rdsadmin.rds_file_util.listdir(p_directory =>'DATA_PUMP_DIR'));

 

ou

SQL> select filename,TYPE,FILESIZE/1024/1024 "FILESIZE (Mo)",mtime from table (rdsadmin.rds_file_util.listdir(p_directory =>'DATA_PUMP_DIR'));


Etape 3 : On crée ensuite un DBLINK sur l'instance CIBLE :

Je crée maintenant sur mon instance RDS cible un DBLINK, qui aura pour objectif de récupérer le dump.

SQL>  create public database link mydblink connect to myuser identified by "thepassword" using 'MYALIASTNS' ;
Database link created.

 

Ensuite, on récupère le dump depuis la base cible, dans un directory qui sera créee à cet effet (ou bien utiliser le directory DATA_PUMP_DIR , c'est comme on veut / peut ...)

BEGIN
  DBMS_FILE_TRANSFER.GET_FILE(source_directory_object =>  'DATA_PUMP_DIR',
  source_file_name => 'exp_mrs.dmp',
  source_database => 'mydblink',
  destination_directory_object =>  'DP_DIR_TMP',
  destination_file_name => 'exp_mrs2.dmp');
END;
/
PL/SQL procedure successfully completed.

 

je peux désormais passer à la partie IMPORT sur cette seconde instance oracle RDS, toujours via le package DBMS_DATAPUMP.

SQL> declare
   h1 NUMBER;
   BEGIN
   h1 := DBMS_DATAPUMP.open (operation => 'IMPORT',   job_mode => 'SCHEMA',   job_name => NULL);
   DBMS_DATAPUMP.set_parameter (h1, 'TABLE_EXISTS_ACTION', 'TRUNCATE');
   DBMS_datapump.metadata_filter(handle => h1, name => 'SCHEMA_EXPR', value => q'[ IN ('MRS') ]');
   DBMS_DATAPUMP.add_file (handle => h1, filename => 'exp_mrs2.dmp', directory => 'DP_DIR_TMP', filetype => dbms_datapump.ku$_file_type_dump_file);
   DBMS_DATAPUMP.metadata_remap (h1,   'REMAP_SCHEMA',   'MRS',   'MRS_DEV');
   DBMS_DATAPUMP.start_job (h1);
 end;
/
PL/SQL procedure successfully completed.

 

On fait une petite vérification pour vérifier que nous avons bien récupéré notre schéma MRS_DEV et sa table :

 

SQL> select owner,count(table_name) from dba_tables where owner='MRS_DEV' group by owner;

OWNER                          COUNT(TABLE_NAME)
------------------------------ -----------------
MRS_DEV                                        1

SQL>  select count(*) from MRS_DEV.tab1;

  COUNT(*)
----------
     23091

 

Parfait, nous sommes donc ISO source, à l'exception du nom du schéma que j'ai souhaité renommer pour utiliser DBMS_DATAPUMP.metadata_remap.
    
Un petit peu de ménage pour terminer : on supprime le dump de l'instance RDS source :

SQL> exec utl_file.fremove('DATA_PUMP_DIR','exp_mrs.dmp');
PL/SQL procedure successfully completed.

 

Et voilà comment faire pour rafraichir un environnement oracle amazon RDS sans pour autant avoir la main sur le système !

Enjoy !
micka

 

Published by Mickael - - AWS (Amazon Web Services)

commentaires

Articles autour des SGBD Oracle, SQL Server & PostgreSQL

A propos de LAMI-DBA

Le Blog LAMI-DBA est la fusion de deux blogs existants, celui de LAurent (laodba) et celui de MIckael (dbafaq), deux DBA passionnés des sgbd, et particulièrement d'Oracle.

 

Laurent, 45 ans, Expert Oracle & MS SQL Server, Team Leader, dit "Le Taz", Certifié Expert RAC 11G, Exadata Implementation Specialist, OCA 11G, 

Profil Linkdin

 

 

 

Mickael, 35 ans, Expert Oracle, dit "Batman", Certifié Expert RAC 11G, OCP 11G, OCP 10G,

Profil Linkdin      

 

Hébergé par Overblog