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 :
- Votre vrai application !
- Capturer l’activité
- Restaurer de l’environnement de production pour les tests
- Rejouer la charge capturée et imprimer le rapport correspondant
- D’autres commandes utiles
- 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):

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_MAP, DBA_WORKLOAD_REPLAY_DIVERGENCE, DBA_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é :

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 ?





En completant avec Oracle Tuning Pack 11 G et notamment SQL Tunning Advisor et la solution est complete.
Celui aui utilise une autre méthode ? Celui qui n’a pas les licences RAT pardi !
Payer des gens plutôt que des licences ?
Bonsoir,
est-il nécessaire de contracter des licences oracle RAT pour utiliser les packages oracle
database replay ?
Merci de votre réponse
Oracle développerait ses produits pour laisser à la concurrence le soin d’écrire les écrans pour les gérer ? La doc est claire ,peu importe, l’écran de paramètrage de SQL*Plus à Toad c’est l’API qui nécessite une licence.