Utiliser Oracle Database Replay pour migrer vers 11g Release 2

Migrer des bases de données de 9i, 10g, 11g Release 1 vers Oracle 11g Release 2 sera, à n’en pas douter, le sport national pour les DBA et autres consultants Oracle en 2010. Vos motivations importeront peu : clustering, compression, performances, Exadata, Active Data Guard, Sécurité, downsizing… Le fait est que vous, moi et de nombreuses équipes projet auront les mêmes préoccupations : s’assurer que ces migrations n’auront que des impacts positifs pour les applications, évaluer les risques associées aux migrations, travailler efficacement.
Oracle Database Replay est « da thing » qui vous permettra d’explorer, en quelques jours, un projet complet de migration technique. Toutes les autres approches soit vous prendront des semaines d’implémentation avec les outils les plus évolués du marché soit ne couvriront qu’une très petite partie du fonctionnement réel de vos applications. Alors, certes, utiliser Database Replay nécessite que vous fassiez l’acquisition d’Oracle Real Application Testing (aka RAT) mais si vos applications sont critiques ou que vos équipes sont sur-staffées, vous ne pouvez pas ignorer cette solution.
Dans cet article vous trouverez un exemple complet d’utilisation d’Oracle Database Replay. Cet exemple s’appuie sur les outils en mode ligne de commande; vous préférerez sans doute utiliser Enterprise Manager pour votre projet mais le mode ligne de commande vous permettra de mieux comprendre comment fonctionne l’outil d’Oracle. Si vous lisez mes articles depuis quelques temps, cet article vous rappellera sans doute un article précédent qui s’appuyait sur Oracle 11g Release 1… En beaucoup mieux 😉

Résumé

Oracle Database Replay est constitué de 2 fonctionnalités :

  • La capture permet d’enregistrer l’ensemble de l’activité d’une application sur une base de données 9i (9.2.0.8), 10g (10.2.0.4) ou 11g
  • Le replay à proprement parler permet de rejouer l’activité enregistrée. Vous pouvez utiliser cette fonctionnalité sur une base de données Oracle 11g et Oracle 11g RAC.

Cet article couvre les différents aspects de Database Replay; Les différentes sections sont les suivantes :

  1. Votre vrai application !
  2. Capturer l’activité
  3. Restaurer de l’environnement de production pour les tests
  4. Rejouer la charge capturée et imprimer le rapport correspondant
  5. D’autres commandes utiles
  6. Conclusion

1. Votre vrai application !

Bien sur, pour utiliser Oracle Database Replay, il vous faut une vrai application ! Pour les besoins de notre exemple, vous trouverez ci-dessous un schéma, des données et une fonction PL/SQL que vous pourrez utiliser pour simuler une application. Voici le-dit script :

connect / as sysdba
drop user ezteam cascade;
create user ezteam
    identified by ezteam
    default tablespace users
    temporary tablespace temp;
grant connect, resource to ezteam;
connect ezteam/ezteam
create table EZTEAM(
     id          number       primary key,
     name        varchar2(25) not null,
     value       number,
     description varchar2(250)
         default 'Are you ready for a NOT so lightspeed demo?' );
create index EZTEAM_UK on EZTEAM(name);
insert into EZTEAM(id, name, value)
     values (1, 'EZSEQ', 1);
commit;
create or replace function get_nextval
       (p_name varchar2) return number
is
   v_return number;
begin
   lock table EZTEAM in exclusive mode;
   select value into v_return
     from EZTEAM
    where name=p_name;
   update EZTEAM
      set value=value+1
    where name=p_name;
   commit;
   return v_return;
end;
/
exit;

Maintenant que nous avons créé le schéma, l’application est constituée du script start_ezapp.sh ci-dessous :

cat start_ezapp.sh
#!/bin/bash
cat >ezapp.sh <<EOF
sqlplus -s /nolog <<EOSQL
connect ezteam/ezteam
declare
   myval number;
begin
   for i in 1..30000 loop
      myval:=get_nextval('EZSEQ');
   end loop;
end;
/
exit
EOSQL
EOF
chmod u+x ezapp.sh
nohup ./ezapp.sh >ezapp.1.out 2>&1 &
nohup ./ezapp.sh >ezapp.2.out 2>&1 &
nohup ./ezapp.sh >ezapp.3.out 2>&1 &

Pour démarrer l’application, vous devrez changer les droits sur le nouveau fichier :

chmod u+x start_ezapp.sh

2. Capturer l’activité

Avant de démarrer la capture de l’activité, il faut s’assurer qu’il existe un point pour constituer une copie de l’environnement et lancer le « Replay ». La technique que vous utiliserez importe peu : export/import, RMAN, Snaphots, Active Data Guard. En revanche, il faut vous assurer qu’il n’existe pas de transaction en cours lors du démarrage de la capture. C’est, entre autre, pour cela qu’Oracle recommande d’arrêter la base de données avant de lancer la capture.
Le package DBMS_WORKLOAD_CAPTURE permet de configurer puis démarrer la capture; les vues DBA_WORKLOAD_CAPTURES et DBA_WORKLOAD_FILTERS permettent de vérifier la configuration de cette capture. Le script ci-dessous prépare la capture. Pour cela, vous pouvez ajouter un ou plusieurs filtres qui définiront les ordres SQL capturés. Vous devez également créer un répertoire :

sqlplus / as sysdba
begin
dbms_workload_capture.add_filter(
    fname=>'EZFILTER1',
    fattribute=>'USER',
    fvalue=>'EZTEAM');
end;
/
set lines 120
col type format a7
col id format 99
col status format a8
col name format a9
col attribute format a9
col value format a9
select *
 from DBA_WORKLOAD_FILTERS;
TYPE      ID STATUS  NAME      ATTRIBUTE  VALUE
------ ---- ------ -------- --------- -------
CAPTURE    0 NEW     EZFILTER1 USER       EZTEAM
!rm -rf /u01/app/oracle/oradata/BLACK/capture
!mkdir -p /u01/app/oracle/oradata/BLACK/capture
drop directory capture_dir;
create directory capture_dir
   as '/u01/app/oracle/oradata/BLACK/capture';
col directory_name format a14
col directory_path format a40
set lines 100
select directory_name,
       directory_path
  from dba_directories
 where directory_name='CAPTURE_DIR';

La commande ci-dessous démarre effectivement la capture puis vérifie la configuration associée. le paramètre default_action positionné à exclude indique que aucune opération n’est capturée, sauf celles qui correspondent aux filtres que vous aurez définit:

BEGIN
DBMS_WORKLOAD_CAPTURE.START_CAPTURE (
    name            => 'EZCAPTURE',
    dir             => 'CAPTURE_DIR',
    duration        => null,
    default_action  => 'EXCLUDE',
    auto_unrestrict => true);
END;
/
set lines 120
col id format 99
col NAME format a12
col DIRECTORY format a12
col ACTION format a10
col STATUS format a13
col FILTERS format 9,999
col CSIZE format 999,999,999
col TRANS format 999,999
select ID,
       NAME,
       DIRECTORY,
       DEFAULT_ACTION ACTION,
       FILTERS_USED FILTERS,
       STATUS,
       CAPTURE_SIZE CSIZE,
       TRANSACTIONS TRANS
 from DBA_WORKLOAD_CAPTURES;
 ID NAME       DIRECTORY   ACTION  FILTERS STATUS      CSIZE TRANS
--- -------- ---------- ------- ------- --------- ----- -----
 31 EZCAPTURE CAPTURE_DIR EXCLUDE        1 IN PROGRESS	     0     0
exit;

Il ne vous reste plus qu’à lancer l’application pour générer effectivement capturer les ordres SQL de la base de données

./start_ezapp.sh
sqlplus / as sysdba
set lines 120
col id format 99
col NAME format a12
col DIRECTORY format a12
col ACTION format a10
col STATUS format a13
col FILTERS format 9,999
col CSIZE format 999,999,999
col TRANS format 999,999
select ID,
       NAME,
       DIRECTORY,
       DEFAULT_ACTION ACTION,
       FILTERS_USED FILTERS,
       STATUS,
       CAPTURE_SIZE CSIZE,
       TRANSACTIONS TRANS
 from DBA_WORKLOAD_CAPTURES;
ID NAME      DIRECTORY   ACTION   FILTERS STATUS            CSIZE    TRANS
-- -------- ---------- ------- ------ ---------- ---------- --------
32 EZCAPTURE CAPTURE_DIR EXCLUDE        1 IN PROGRESS   3,663,552   60,000
exit;

Pour arrêter la capture, il suffit de

exec dbms_workload_capture.finish_capture

3. Restaurer l’environnement de production pour les tests

Une fois la capture terminée, vous pouvez imprimer le rapport de capture à l’aide de la commande ci-dessous

accept db_directory default 'CAPTURE_DIR' -
   prompt "Select the DB Directory: "
accept report_name default 'capture.html' -
   prompt "Select the Report Name: "
DECLARE
   cap_id  NUMBER;
   cap_rpt CLOB;
   fh      UTL_FILE.FILE_TYPE;
   buffer  VARCHAR2(32767);
   amount  BINARY_INTEGER;
   offset  NUMBER(38);
BEGIN
   cap_id := DBMS_WORKLOAD_CAPTURE.GET_CAPTURE_INFO(
       dir => 'CAPTURE_DIR');
   cap_rpt := DBMS_WORKLOAD_CAPTURE.REPORT(
       capture_id => cap_id,
       format     => DBMS_WORKLOAD_CAPTURE.TYPE_HTML);
   fh := UTL_FILE.FOPEN(
       location     => '&&db_directory',
       filename     => '&&report_name',
       open_mode    => 'w',
       max_linesize => 32767);
   amount := 32767;
   offset := 1;
   WHILE amount >= 32767 LOOP
      DBMS_LOB.READ(
          lob_loc => cap_rpt,
          amount  => amount,
          offset  => offset,
          buffer  => buffer);
      offset := offset + amount;
      UTL_FILE.PUT(
          file   => fh,
          buffer => buffer);
      UTL_FILE.FFLUSH(file => fh);
   END LOOP;
   UTL_FILE.FCLOSE(file => fh);
END;
/

Vous pouvez ouvrir le rapport avec votre navigateur web préféré (Firefox, Chrome et même Lynx):
capture_report
L’étape suivante consiste à restaurer l’environnement pour vous préparer à rejouer les ordres SQL capturés. Comme je l’ai déjà dit, la méthode importe peu. Dans notre cas, il suffit de remettre la table

update ezteam.ezteam
   set value=1
  where name='EZSEQ';
commit;

4. Rejouer la charge capturée et imprimer le rapport correspondant

Vous voilà prêt, ou presque, à rejouer la charge capturée sur un environnement de test que vous aurez migré en 11g. Vous pouvez, au passage, effectuer tous les changements que vous jugerez nécessaires de RAC au partitioning en passant par Exadata, la compression ou n’importe quel autre changement pertinent. Pour rejouer la charge, vous utiliserez le package DBMS_WORKLOAD_REPLAY; les vues DBA_WORKLOAD_CONNECTION_MAPDBA_WORKLOAD_REPLAY_DIVERGENCEDBA_WORKLOAD_REPLAYS permettent de vérifier la configuration de cette capture :

  • Copier les fichiers du répertoire créé à l’étape 2 dans un répertoire sur l’environnement de test.
  • Créer un « directory » qui fait le lien avec ce répertoire.

Une fois les fichiers copiés, vous pouvez enregistrer et préparer les fichiers comme ci-dessous:

begin
   DBMS_WORKLOAD_REPLAY.PROCESS_CAPTURE (
       capture_dir =>'CAPTURE_DIR');
end;
/
BEGIN
   DBMS_WORKLOAD_REPLAY.INITIALIZE_REPLAY (
      replay_name => 'EZREPLAY',
      replay_dir  => 'CAPTURE_DIR');
END;
/
col id format 99 new_value replayid
col name format a8
col status format a11
select id,
       name,
       status
  from dba_workload_replays; 
 ID NAME       STATUS
--- -------- -----------
 11 EZREPLAY INITIALIZED

Changez les informations de connexion à la base de données comme ci-dessous:

prompt &&replayid
col CONN_ID format 99 new_value connid
col ORIG format a30 wor wra
col NEW format a30 wor wra
set longchunksize 100
select CONN_ID,
        substr(CAPTURE_CONN, 1, 350) ORIG,
        substr(REPLAY_CONN,1,350) NEW
  from DBA_WORKLOAD_CONNECTION_MAP
 where replay_id=&&replayid;
CONN_ID  ORIG                            NEW
------- --------------------------- ------------------------------
       1 (DESCRIPTION=(ADDRESS=(PROTOCO
          L=beq)(PROGRAM=/u01/app/oracle
          /product/11.2.0/db_1/bin/oracl
          e)(ARGV0=oracleBLACK)(ARGS='(D
          ESCRIPTION=(LOCAL=YES)(ADDRESS
          =(PROTOCOL=beq)))')(DETACH=NO)
          )(CONNECT_DATA=(CID=(PROGRAM=s
          qlplus)(HOST=arkzoyd-easyteam)
          (USER=oracle))))
prompt &&connid
accept tnsalias default 'BLACK' prompt "Enter the TNS alias [BLACK]: "
BEGIN
   DBMS_WORKLOAD_REPLAY.REMAP_CONNECTION (
      connection_id     => &&connid,
      replay_connection => '&&tnsalias');
END;
/
prompt &&replayid
col CONN_ID format 99 new_value connid
col ORIG format a30 wor wra
col NEW format a30 wor wra
set longchunksize 100
select CONN_ID,
        substr(CAPTURE_CONN, 1, 350) ORIG,
        substr(REPLAY_CONN,1,350) NEW
  from DBA_WORKLOAD_CONNECTION_MAP
 where replay_id=&&replayid;
CONN_ID  ORIG                          NEW
------- ------------------------------ ------------------------------
      1 (DESCRIPTION=(ADDRESS=(PROTOCO BLACK
        L=beq)(PROGRAM=/u01/app/oracle
        /product/11.2.0/db_1/bin/oracl
        e)(ARGV0=oracleBLACK)(ARGS='(D
        ESCRIPTION=(LOCAL=YES)(ADDRESS
        =(PROTOCOL=beq)))')(DETACH=NO)
        )(CONNECT_DATA=(CID=(PROGRAM=s
        qlplus)(HOST=arkzoyd-easyteam)
        (USER=oracle))))

La commande ci-dessous prépare l’activité pour que vous puissiez la rejouer :

BEGIN
   DBMS_WORKLOAD_REPLAY.PREPARE_REPLAY (
      synchronization => TRUE);
END;
/

La première étape nécessaire à l’exécution de la charge sur l’environnement de test consiste à calibrer le nombre de clients qui seront nécessaires. Pour cela, il faut lancer la commande wrc (Workload Replay Client) avec les informations de connexion et le mode calibrate comme ci-dessous:

wrc system/manager
      mode=calibrate
      replaydir=/u01/app/oracle/oradata/BLACK/capture

Grace au répertoire, la commande wrc vous conseille le nombre de clients à démarrer pour simuler la charge:

Workload Replay Client: Release 11.2.0.1.0 - Production on Sun Sep 27 00:04:27 2009
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
Report for Workload in: /u01/app/oracle/oradata/BLACK/capture
-----------------------
Recommendation:
Consider using at least 1 clients divided among 1 CPU(s)
You will need at least 11 MB of memory per client process.
If your machine(s) cannot match that number, consider using more clients.
Workload Characteristics:
- max concurrency: 3 sessions
- total number of sessions: 3
Assumptions:
- 1 client process per 50 concurrent sessions
- 4 client process per CPU
- 256 KB of memory cache per concurrent session
- think time scale = 100
- connect time scale = 100
- synchronization = TRUE

Une fois le nombre de clients determines, lancez-les (dans ce cas 1 seul) en mode replay comme ci-dessous :

wrc system/manager
   mode=replay
   replaydir=/u01/app/oracle/oradata/BLACK/capture
Workload Replay Client: Release 11.2.0.1.0 - Production on Sun Sep 27 00:15:13 2009
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
Wait for the replay to start (00:15:13)

Pour démarrer l’activité, exécutez le script ci-dessous :

BEGIN
   DBMS_WORKLOAD_REPLAY.START_REPLAY;
END;
/
col id format 99
col name format a8
col dir format a12
col status format a11
col secs format 9999
col cli format 99
col sync format a5
select id,
       name,
       to_char(END_time,'DD/MM/YYYY HH24:MI:SS') END_DATE,
       status,
       duration_secs secs,
       num_clients cli,
       synchronization sync
   from dba_workload_replays;
 ID NAME     END_DATE		 STATUS       SECS CLI SYNC
--- -------- ------------------- ----------- ----- --- -----
 11 EZREPLAY 26/09/2009 22:19:55 COMPLETED	14   1 SCN

Si le statut « REPLAY » est IN PROGRESS, vous pouvez continuer de superviser l’exécution en interrogeant la vue dba_workload_replays jusqu’à ce que le statut passe à COMPLETED. Une fois la charge ré-exécutée, vous pouvez vérifier que les requêtes ont été exécutées et imprimer le rapport correspondant:

connect / as sysdba
col name format a5
col value format 99,999
select name, value
  from ezteam.ezteam;
NAME	VALUE
----- -------
EZSEQ  60,001
accept db_directory default 'CAPTURE_DIR' prompt "Select the DB Directory: "
accept report_name default 'replay.html' prompt "Select the Report Name: "
DECLARE
   cap_id  NUMBER;
   rep_id  NUMBER;
   rep_rpt CLOB;
   fh      UTL_FILE.FILE_TYPE;
   buffer  VARCHAR2(32767);
   amount  BINARY_INTEGER;
   offset  NUMBER(38);
BEGIN
   cap_id := DBMS_WORKLOAD_REPLAY.GET_REPLAY_INFO(
      dir => 'CAPTURE_DIR');
   /* Get the latest replay for that capture */
   SELECT max(id)
      INTO rep_id
      FROM dba_workload_replays
     WHERE capture_id = cap_id;
   rep_rpt := DBMS_WORKLOAD_REPLAY.REPORT(
      replay_id => rep_id,
      format    => DBMS_WORKLOAD_REPLAY.TYPE_HTML);
   fh := UTL_FILE.FOPEN(
      location     => '&&db_directory',
      filename     => '&&report_name',
      open_mode    => 'w',
      max_linesize => 32767);
   amount := 32767;
   offset := 1;
   WHILE amount >= 32767 LOOP
      DBMS_LOB.READ(
         lob_loc => rep_rpt,
         amount  => amount,
         offset  => offset,
         buffer  => buffer);
      offset := offset + amount;
      UTL_FILE.PUT(
         file   => fh,
         buffer => buffer);
      UTL_FILE.FFLUSH(file => fh);
   END LOOP;
   UTL_FILE.FCLOSE(file => fh);
END;
/

Vous pouvez visualiser le rapport avec votre navigateur web préféré :
replay_report

5. D’autres commandes utiles

Il y a de nombreuses autres commandes que vous pouvez utiliser pour manipuler Oracle Database Replay comme ci-dessous :

col id format 99 new_value captureid
col NAME format a12
col DIRECTORY format a12
col ACTION format a10
col FILTS format 99
col CSIZE format 999,999,999
col TRANS format 999,999
select ID,
       NAME,
       DIRECTORY,
       DEFAULT_ACTION ACTION,
       FILTERS_USED FILS,
       CAPTURE_SIZE CSIZE,
       TRANSACTIONS TRANS
  from DBA_WORKLOAD_CAPTURES;
prompt &&captureid
BEGIN
   DBMS_WORKLOAD_CAPTURE.DELETE_CAPTURE_INFO (
      capture_id=>&captureid);
   DBMS_WORKLOAD_CAPTURE.DELETE_FILTER('EZFILTER');
END;
/
col id format 99 new_value replayid
col name format a8
SELECT ID,
     NAME,
     DURATION_SECS,
     STATUS
   FROM DBA_WORKLOAD_REPLAYS;
 ID NAME     DURATION_SECS STATUS
 -- -------- ------------- -----------
 11 EZREPLAY		14 COMPLETED
prompt &&replayid
BEGIN
    DBMS_WORKLOAD_REPLAY.DELETE_REPLAY_INFO(
       REPLAY_ID => &&replayid);
END;
/

6. Conclusion

Comme vous l’aurez sans doute compris à travers cet exemple simple, Oracle Database Replay permet de valider le fonctionnement d’une application sur Oracle 11g Release 2 en quelques heures. En outre, avec cette fonctionnalité vous évaluerez l’impact de tous les changements que vous pouvez faire sur la base de données, y compris l’utilisation d’un cluster RAC. Alors qui peut encore utiliser une autre méthode ? Et pourquoi ?

8 réflexions sur “Utiliser Oracle Database Replay pour migrer vers 11g Release 2”

  1. LOZARIO Antonio

    Bonsoir,
    est-il nécessaire de contracter des licences oracle RAT pour utiliser les packages oracle
    database replay ?
    Merci de votre réponse

  2. En completant avec Oracle Tuning Pack 11 G et notamment SQL Tunning Advisor et la solution est complete.

  3. Ping : Twitted by EasyBlogs

  4. Ping : Twitter Trackbacks for Utiliser Oracle Database Replay pour migrer vers 11g Release 2 « EASYTEAM Le BLOG [easyteam.fr] on Topsy.com

Les commentaires sont fermés.