ORACLE Database Replay 11g v1.0
12.05.24 |
1.0 |
|
|
|
|
|
|
|
1. Database Replay
Database Replay 는 RAT ( Real Application Testing ) 을 지원하는 도구중의 하나이다.
다른 하나는 SQL Performance Analyzer 이다.
기능은 capture / replay 로 나뉘어진다.
문자 그대로 워크로드를 캡쳐하여 어떤 SQL 이 어느 빈도로 수행이 되었는지 기록하고, 이 정보를 타겟이 되는 DB 에서 재생한다.
여기서 주의할 점은 재생 할 DB 는 소스 DB 와 논리적으로 동일해야 한다는 점이다.
그 이유는 캡처된 DML 도 재생하기 때문이다. 타겟이 되는 데이터가 없다면 에러가 날 것이다.
2. Necessary things for using Database Replay
A. RAT 옵션이 설치되어 있어야 한다.
B. 패키지 dbms_workload_capture 가 유효한 상태로 존재해야 한다.
RAT 옵션의 확인은 다음과 같이 확인한다.
SQL> select * from v$option 2 where parameter = 'Real Application Testing';
PARAMETER VALUE ---------------------------------------- ---------- Real Application Testing TRUE |
3. Main Package of Database Replay
A. DBMS_WORKLOAD_CAPTURE
ADD_FILTER : 필터조건을 추가한다.
DELETE_CAPTURE_INFO : DBA_WORKLOAD_CAPTURES 정보를 삭제한다.
DELETE_FILTER : 필터조건을 삭제한다.
EXPORT_AWR : capture id 에 해당하는 AWR Snapshots 을 추출한다.
FINISH_CAPTURE : 캡쳐작업을 완료한다.
GET_CAPTURE_INFO Function
IMPORT_AWR : 주어진 capture ID 와 관련된 AWR snapshots 을 Import 한다.
PROCESS_CAPTURE : 지정된 디렉토리의 workload 를 수행한다.
REPORT : 리포트를 작성한다.
START_CAPTURE : workload capture 를 시작한다.
B. DBMS_WORKLOAD_REPLAY
CALIBRATE Function
CANCEL_REPLAY : 진행중인 REPLAY 를 취소한다.
DELETE_REPLAY_INFO : DBMS_WORKLOAD_REPLAYS 정보를 삭제한다.
EXPORT_AWR : 주어진 REPLAY ID 에 대해 AWR Snapshots 을 export 한다.
GET_RELAY_INFO
IMPORT_AWR : 주어진 REPLAY ID 에 대해 AWR Snapshots 을 import 한다.
INITIALIZE_REPLAY : replay 를 초기화한다.
PAUSE_REPLAY : 진행중인 replay 를 일시중지한다.
PREPARE_REPLAY : RDBMS 를 Prepare mode 로 변경한다.
PROCESS_CAPTURE : 지정된 위치의 워크로드를 로드한다.
REMAP_CONNECTION
REPORT : 리포트를 생성한다.
RESUME_REPLAY : replay 를 다시 시작한다.
START_REPLAY : replay 를 시작한다.
4. Restrictions
다음의 요소는 캡쳐대상에서 제외된다.
A. Directet path load of external files
B. Shared Server requests
C. Streams
D. Advanced Replication Streams
E. Non PL/SQL AQ
F. Flashback queries
G. OCI based object navigations
H. Non SQL based object access
I. Distributed transactions
J. Remote describe/commit operations
5. View related to Database Replay
DBA_WORKLOAD_CAPTURES DBA_WORKLOAD_CONNECTION_MAP DBA_WORKLOAD_FILTERS DBA_WORKLOAD_REPLAYS DBA_WORKLOAD_REPLAY_DIVERGENCE DBA_WORKLOAD_REPLAY_FILTER_SET |
위에서 중요한 부분은 표시한 두개의 VIEW 이다.
DBA_WORKLOAD_CAPTURES 는 캡처에 대한 정보를 가진다.
DBA WORKLOAD_REPLAYS 는 재생한 정보를 가진다.
6. Database Replay flow
A. workload 를 캡춰할 대상에 대해 filter 를 추가한다.
B. 캡춰를 시작한다. (필터 사용여부를 결정할 수 있다.)
C. 작업 로드를 실행한다. 서비스 장비인 경우 이 과정이 불필요하다.
D. 캡춰를 완료한다.
E. 캡춰된 정보를 재생한다.
F. 캡처된 정보의 재생을 중지한다.
7. Database Replay PL/SQL example (outline)
A. DBMS_WORKLOAD_CAPTURE.ADD_FILTER
캡쳐대상을 한정지음
B. DBMS_WORKLOAD_REPLAY.START_CAPTURE
캡쳐를 시작
C. 작업 로드 실행
D. DBMS_WORKLOAD_CAPTURE.FINISH_CAPTURE()
캡쳐를 완료
E. DBMS_WORKLOAD_REPLAY.PROCESS_CAPTURE
재생을 준비
F. DBMS_WORKLOAD_REPLAY.INITIALIZE_REPLAY
재생을 초기화
G. dbms_workload_replay.prepare_replay
재생을 준비
H. dbms_workload_replay.start_replay
재생을 시작
8. Database Replay PL/SQL example
test 유저 및 test 테이블 생성
SQL> create user test identified by test 2 default tablespace test 3 temporary tablespace temp;
User created.
SQL> grant connect,resource to test;
Grant succeeded.
SQL> create table test_tbl(id int);
Table created. |
OS, DB Directory 생성
주의점으로 directory 로 생성할 OS 타겟 디렉토리는 빈 디렉토리여야 한다.
test1@/u01>mkdir workload test1@/u01>cd workload test1@/u01/workload>ls test1@/u01/workload>
SQL> create directory database_replay 2 as '/u01/workload';
Directory created.
SQL> grant read,write on directory database_replay to system;
Grant succeeded. |
dbms_workload_capture.add_filter
SQL> exec dbms_workload_capture.add_filter(- > fname=>'first',- > fattribute=>'USER',- > fvalue=>'TEST'); |
filter 조건이 추가되었음을 조회해 보았다.
SQL> select * from DBA_WORKLOAD_FILTERS;
TYPE ID STATUS NAME ATTRIBUTE VALUE ---------- ---------- ------ -------------------- --------------- ---------- CAPTURE 0 NEW FIRST USER TEST |
dbms_workload_replay.start_capture
위 메소드의 인자로 name 지정을 한다. 이 이름은 DBA_WORKLOAD_CAPTURES.NAME 이 된다.
SQL> exec dbms_workload_capture.start_capture(- > name=>'FIRST',- > dir=>'DATABASE_REPLAY');
PL/SQL procedure successfully completed. |
캡쳐를 시작하면 OS 에 지정한 directory 에 아래와 같이 파일들이 생성된다.
test1@/u01/workload>ls cap capfiles wcr_cap_00001.start test1@/u01/workload>ls cap wcr_scapture.wmd test1@/u01/workload>ls capfiles inst1 |
캡쳐 정보를 조회해 보았다.
Status 로 현재 정보를 알 수 있다.
SQL> select name, dbversion, directory, status, START_TIME 2 from DBA_WORKLOAD_CAPTURES;
NAME DBVERSION DIRECTORY STATUS START_TIM --------------- --------------- --------------- --------------- --------- first 11.2.0.1.0 DATABASE_REPLAY IN PROGRESS 22-MAY-12 |
작업 로드 실행
SQL> insert into test_tbl 2 select level from dual connect by level < 1000000;
999999 rows created.
SQL> commit;
Commit complete. |
dbms_workload_capture.finish_capture()
프로시저 호출로 캡쳐 작업을 완료한다.
SQL> exec dbms_workload_capture.finish_capture();
PL/SQL procedure successfully completed. |
종료된 작업로드를 DBA_WORKLOAD_CAPTURES 를 조회하여 확인했다.
SQL> select name, dbversion, directory, status, START_TIME 2 from DBA_WORKLOAD_CAPTURES;
NAME DBVERSION DIRECTORY STATUS START_TIM --------------- --------------- --------------- --------------- --------- first_capture 11.2.0.1.0 DATABASE_REPLAY COMPLETED 22-MAY-12 |
dbms_workload_replay.process_capture
캡쳐된 정보를 적재한다. 인자값은 DATABASE LINK 이다.
SQL> exec dbms_workload_replay.process_capture('DATABASE_REPLAY');
PL/SQL procedure successfully completed. |
dbms_workload_replay.initialize_replay
적재된 데이터를 초기화 한다.
SQL> exec dbms_workload_replay.initialize_replay('first_replay','DATABASE_REPLAY');
PL/SQL procedure successfully completed. |
dbms_workload_replay.prepare_replay
초기화 된 재생정보를 준비단계로 이행한다.
SQL> exec dbms_workload_replay.prepare_replay();
PL/SQL procedure successfully completed. |
wrc
준비단계에서 실제 로드를 수행하기 위해서는 wrc 의 접속이 필요하다.
test1@/u01/workload>wrc userid=system replaydir=/u01/workload
Workload Replay Client: Release 11.2.0.1.0 - Production on Thu May 24 10:11:31 2012
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
Password: Wait for the replay to start (10:11:36) |
wrc 세션을 맺은 상태에서 아래 프로시저의 호출로 재생을 시작한다.
dbms_workload_replay.start_replay
SQL> select count(*) from test.test_tbl;
COUNT(*) ---------- 1999998
SQL> exec dbms_workload_replay.start_replay;
PL/SQL procedure successfully completed.
SQL> select count(*) from test.test_tbl;
COUNT(*) ---------- 3999996 |
재생전에 199만이었던 데이터가 재생 후 399만으로 늘어났다. 재생 과정에 DML 이 수행되었음을 알 수 있다.
Wait for the replay to start (10:11:36) Replay started (10:13:13) Replay finished (10:15:44) |
재생이 완료되면 위와같이 Replay 가 종료되었음을 알리는 메시지가 wrc 에 남는다.
9. View reports (capture, replay)
- CAPTURE 보고서
dbms_workload_capture.report 의 첫 번째 인자는 dba_workload_captures.id 정보로 얻을 수 있다.
SQL> set pagesize 0 long 30000000 longchunksize 1000
SQL> select dbms_workload_capture.report(13,'TEXT') from dual;
- REPLAY 보고서
dbms_workload_replay.report 의 첫 번째 인자는 dba_workload_replays.id 정보로 얻을 수 있다.
SQL> set pagesize 0 long 30000000 longchunksize 1000
SQL> select dbms_workload_replay.report(7,'TEXT') from dual;
위 보고서들은 CAPTURE|REPLAY 자체에 대한 내용들을 담고 있으며 SQL 레벨의 성능정보는 담겨있지 않다.
10. Export report
아래와 같이 프로시저를 호출하여 capture, replay 를 비교해 레포트를 뽑는다.
declare cap_id number; rep_id number; rep_rpt clob; begin cap_id := dbms_workload_replay.get_replay_info(dir=>'DATABASE_REPLAY'); 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_text); dbms_output.put_line(rep_rpt); end; / |
11. References
A. PREPARE_REPLAY Procedure
http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_workload_replay.htm#CBAFFDFE
B. Using the workload capture and replay in 11G [ID 445116.1]
C. Database Replay in Oracle Database 11g Release 1 |
http://www.oracle-base.com/articles/11g/database-replay-11gr1.php
D. Oracle Database 11g : New Features for Administrators