본문 바로가기

카테고리 없음

ORACLE Database Replay 11g v1.0

ORACLE Database Replay 11g v1.0

 

Date

Ver

Etc.

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]

https://support.oracle.com/CSP/ui/flash.html#tab=KBHome(page=KBHome&id=()),(page=KBNavigator&id=(from=BOOKMARK&viewingMode=1143&bmDocType=HOWTO&bmDocID=445116.1&bmDocDsrc=KB&bmDocTitle=Using%20the%20workload%20capture%20and%20replay%20in%2011G))

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