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 ?
8 réflexions sur “Utiliser Oracle Database Replay pour migrer vers 11g Release 2”
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.
Bonsoir,
est-il nécessaire de contracter des licences oracle RAT pour utiliser les packages oracle
database replay ?
Merci de votre réponse
Payer des gens plutôt que des licences ?
Celui aui utilise une autre méthode ? Celui qui n’a pas les licences RAT pardi !
En completant avec Oracle Tuning Pack 11 G et notamment SQL Tunning Advisor et la solution est complete.
😉
Ping : Twitted by EasyBlogs
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.