ITPub博客

首页 > 数据库 > Oracle > 11g_DB_Replay

11g_DB_Replay

原创 Oracle 作者:zhyuh 时间:2009-09-28 11:32:01 0 删除 编辑
重播(REPLAY)是Oracle11g的一个重要新特性,能够捕捉数据库某个时段发生的所有或者特定的外部请求,并且在另外一个数据库中重现。这使得测试数据库可以比较容易模拟生产环境,做各种测试,尤其是性能方面的测试,获得更加精确的结果。

Database Replay主要利用2个package: DBMS_WORKLOAD_CAPTURE 和 DBMS_WORKLOAD_REPLAY,分4个步骤:
1. 捕捉产品数据库的负载。
2. 预处理捕获的负载信息。
3. 重播数据库负载。
4. 创建报告并分析结果。
[@more@]**********
* 源数据库
**********
--创建存放负载信息的目录。
SQL> create directory relay_source as 'd:tempsource';
目录已创建。

--创建信息过滤器,此处只抓取SCOTT用户的所有操作。
SQL> exec dbms_workload_capture.add_filter( fname => 'user_scott', fattribute => 'USER', fvalue => 'scott');
PL/SQL 过程已成功完成。

--开始抓取,时间为900秒。
SQL> exec dbms_workload_capture.start_capture(name=>'SCOTT_900',dir=>'RELAY_SOURCE',duration=>900);
PL/SQL 过程已成功完成。

--另一窗口SCOTT用户的操作
SQL> conn scott/tiger
已连接。
SQL> create table temp1 as select * from dba_objects;
表已创建。
SQL> insert into temp1 select * from temp1;
已创建68366行。
SQL> insert into temp1 select * from temp1;
已创建136732行。
SQL> commit;
提交完成。
SQL> insert into temp1 select * from temp1;
已创建273464行。
SQL> insert into temp1 select * from temp1;
已创建546928行。
SQL> commit;
提交完成。
SQL> insert into temp1 select * from temp1;
已创建1093856行。
SQL> commit;
提交完成。
SQL> create index idx1 on temp1(object_id);
索引已创建。
......
SQL> insert into temp1 select * from temp1;
已创建2187712行。
SQL> commit;
提交完成。
SQL> conn / as sysdba
已连接。

--不到900秒的时候停止抓取信息。
SQL> exec dbms_workload_capture.finish_capture();
PL/SQL 过程已成功完成。

--目录下生成的文件。
D:tempsource:-
2009-02-11 11:44 6,222 wcr_4m4k7ws0020r0.rec
2009-02-11 11:37 1,152 wcr_4m4k7ws00213w.rec
2009-02-11 11:40 0 wcr_4m4k8pc0023v8.rec
2009-02-11 11:45 1,372 wcr_4m4k9r80021m8.rec
2009-02-11 11:46 49,620 wcr_cr.html
2009-02-11 11:46 23,370 wcr_cr.text
2009-02-11 11:45 181 wcr_fcapture.wmd
2009-02-11 11:36 120 wcr_scapture.wmd

************
* 目标数据库
************
--创建目录,并将上述文件从原目录复制过来。
SQL> create directory relay_target as 'd:temptarget';
目录已创建。

--预处理这些文件。
SQL> exec dbms_workload_replay.process_capture(capture_dir => 'RELAY_TARGET');
PL/SQL 过程已成功完成。

--预处理后新生成5个文件
D:temptarget:-
2009-02-11 13:50 12,288 WCR_CONN_DATA.EXTB
2009-02-11 13:50 142 wcr_login.pp
2009-02-11 13:50 35 wcr_process.wmd
2009-02-11 13:50 12,288 WCR_SCN_ORDER.EXTB
2009-02-11 13:50 12,288 WCR_SEQ_DATA.EXTB

--可以用 wrc的calibrate模式校验一下
D:temptarget>wrc mode=calibrate replaydir=.
Workload Replay Client: Release 11.1.0.6.0 - Production on 星期三 2月 11 135
0 2009
Copyright (c) 1982, 2007, Oracle. All rights reserved.

Report for Workload in: .
-----------------------
Recommendation:
Consider using at least 1 clients divided among 1 CPU(s).
Workload Characteristics:
- max concurrency: 1 sessions
- total number of sessions: 2
Assumptions:
- 1 client process per 50 concurrent sessions
- 4 client process per CPU
- think time scale = 100
- connect time scale = 100
- synchronization = TRUE

--执行下面2个过程,为重播准备。
SQL> exec dbms_workload_replay.initialize_replay(replay_name => 'SCOTT_600', replay_dir=> 'RELAY_TARGET');
PL/SQL 过程已成功完成。
SQL> exec dbms_workload_replay.prepare_replay(synchronization => true);
PL/SQL 过程已成功完成。

--以重播模式启动wrc,屏幕会处在wait状态。
D:temptarget>wrc system/oracle mode=replay replaydir=.
Workload Replay Client: Release 11.1.0.6.0 - Production on 星期三 2月 11 14:03:4
4 2009
Copyright (c) 1982, 2007, Oracle. All rights reserved.

Wait for the replay to start (14:03:44)

--另一窗口中运行start_replay过程。
SQL> conn / as sysdba
已连接。
SQL> exec DBMS_WORKLOAD_REPLAY.START_REPLAY ();
PL/SQL 过程已成功完成。

--wrc窗口会显示重播开始。
Wait for the replay to start (14:03:44)
Replay started (14:04:06)

--重播过程中我们可以看到不同时间点temp1表中的不同数据量。
--注:由于环境所限,这里的源数据库和目标数据库其实为同一数据库,在重播前删除scott用户的temp1表。
SQL> select count(*) from temp1;
COUNT(*)
----------
1093840

SQL> select count(*) from temp1;
COUNT(*)
----------
2187680

--重播结束后wrc窗口会显示
Wait for the replay to start (14:03:44)
Replay started (14:04:06)
Replay finished (1443)

--重播后会有报告产生,或者可以使用下面脚本产生报告。
DECLARE
cap_id NUMBER;
rep_id NUMBER;
rep_rpt CLOB;
BEGIN
cap_id := DBMS_WORKLOAD_REPLAY.GET_REPLAY_INFO(dir => 'RELAY_TARGET');
/* 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_TEXT);
END;
/

--下面这些操作不能被抓获/重播
■ SQL*Loader direct path load of data
■ Oracle Streams
■ Data Pump Import and Export
■ Advanced replication streams
■ Non–PL/SQL-based Advanced Queuing (AQ)
■ Flashback Database and Flashback queries
■ Distributed transactions and remote describe/commit operations
■ Shared server
■ Non–SQL-based object access

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/207/viewspace-1027418/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 11g_Health_Monitor
请登录后发表评论 登录
全部评论
  • 博文量
    233
  • 访问量
    2009568