db replay设置scale_up_multiplier不生效
设置scale_up_multiplier:
BEGIN
DBMS_WORKLOAD_REPLAY.PREPARE_REPLAY (scale_up_multiplier => 10);
END;
但是设置之后,在DBA_WORKLOAD_REPLAYS.SCALE_UP_MULTIPLIER检查发现,这个值始终是1。
这是因为scale_up_multiplier不支持基于object id的同步。当synchronization的值为object_id,scale_up_multiplier在代码里面被hard code为1的(BUG 9774435)。
而synchronization这个参数,默认true时,11g早期版本(好像是11.2.0.3之前),默认值true的情况下是指SCN,在11g的后期版本,默认值true的情况就变成指object_id了。
所以,早期文档上说的
SQL>exec dbms_workload_replay.prepare_replay(synchronization => TRUE,....
此时的true是SCN,所以,按照早期文档说明,在早期版本的数据上,执行完prepare之后,再放大scale_up_multiplier是可以的,是可以能放大到指定倍数的。
但是在我的11.2.0.4.5中,如果还是按照早期文档的说明,设置synchronization => TRUE,就会导致无论怎么设置scale_up_multiplier都不会生效的问题。
解决方法:显式设置synchronization => ‘SCN’
BEGIN
DBMS_WORKLOAD_REPLAY.PREPARE_REPLAY (synchronization => 'SCN',scale_up_multiplier => 10);
END;
补充关于db repaly用法
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