Oracle 11g推出的神器,可以抓取生产环境真实负载(sql语句),在目标环境重演,进行对比。在核心生产环境迁移等重大变更前,尽量确定变更带来的影响。
核心步骤包括:准备工作、捕获负载、预处理负载、重演负载、对比分析,每步又包含多个子步骤,下面通过测试案例来看。
-- 本例中我们只建一个表
-- 源与目标库均执行
create table mytab (a varchar2(2000));
--建立过滤器filter_test,用于过滤掉user为system的规则
BEGIN
DBMS_WORKLOAD_CAPTURE.ADD_FILTER (
fname => 'filter_test',
fattribute => 'USER',
fvalue => 'SYSTEM');
END;
/
create directory test_dir as '/data/bak';
BEGIN
DBMS_WORKLOAD_CAPTURE.START_CAPTURE (name => 'peak_120s',
dir => 'TEST_DIR',
duration => 120);
END;
/
注意事项
- 目录不能有其他文件,否则会报错ORA-15505
- dir => 'DIR_NAME' 目录名要大写,否则会报错ORA-20222
- duration => 120,指定120秒后自动结束。如果未指定,或者想提前结束,需要使用FINISH_CAPTURE存储过程来停止。
declare
l_stmt varchar2(2000);
begin
for ctr in 1..100000 loop
l_stmt := 'insert into mytab values (''''||
lpad(round(dbms_random.value(1,9999999999999999999)),20,0)||'''')';
dbms_output.put_line(l_stmt);
execute immediate l_stmt;
commit;
end loop;
end;
/
等待指定时间后自动强制,或使用FINISH_CAPTURE存储过程手动停止
exec dbms_workload_capture.FINISH_CAPTURE();
[oracle@source-db ~]$ cd /data/bak/
[oracle@source-db bak]$ ll -h
total 0
drwxr-xr-x 2 oracle oinstall 92 Jul 21 15:13 cap
drwxr-xr-x 3 oracle oinstall 19 Jul 21 15:12 capfiles
[oracle@source-db bak]$
[oracle@source-db bak]$ cd cap
[oracle@source-db cap]$ ls
wcr_cr.html wcr_cr.text wcr_fcapture.wmd wcr_scapture.wmd
[oracle@source-db cap]$
[oracle@source-db cap]$ cd ../capfiles/
[oracle@source-db capfiles]$ ls
inst1
[oracle@source-db capfiles]$ cd inst1/
[oracle@source-db inst1]$ ls
aa ab ac ad ae af ag ah ai aj
[oracle@source-db inst1]$ cd aa/
[oracle@source-db aa]$ ls
wcr_ggk6th0000000.rec wcr_ggk8ch0000001.rec
至此源库捕获工作完成,剩下的在目标库执行
适用于较低版本的目标库,可参考 Mandatory Patches for Database Testing Functionality for Current and Earlier Releases
例如 11.2.0.3版本需要安装17411249补丁,19.3版本则无需安装
安装过程与普通补丁无异,参考readme.txt即可
mkdir /data/bak
chown ora.dba -R /data/bak/
#上传文件后
[oracle@dest-db bak]$ ls
cap capfiles
将捕获文件转换为重演文件,此步骤耗时耗资源,请在目标库进行,不要在生产库上进行。注意要让SYSAUX有足够的空间剩余,不然会报错ORA-1658。
BEGIN
DBMS_WORKLOAD_REPLAY.PROCESS_CAPTURE (capture_dir => 'TEST_DIR');
END;
/
预处理后会生成一个pp19.3.0.0.0文件夹,里面是待重演文件
[oracle@dest-db bak]$ ls
cap capfiles pp19.3.0.0.0
[oracle@dest-db bak]$ cd pp19.3.0.0.0/
[oracle@dest-db pp19.3.0.0.0]$ ls
capfiles wcr_conn_data.extb wcr_login.extb wcr_references.extb wcr_seq_data.extb
wcr_calibrate.xml wcr_data.extb wcr_login.pp wcr_schema_info.extb wcr_sqltext.extb
wcr_commits.extb wcr_dep_graph.extb wcr_process.wmd wcr_scn_order.extb wcr_xa.extb
wrc(Workload Replay Client)用于模拟将原生产库上的客户端的负载请求,模拟到测试库上。
wrc mode=calibrate replaydir=/home/oracle/bak
[oracle@dest-db bak]$ wrc mode=calibrate replaydir=/home/oracle/bak
Workload Replay Client: Release 19.3.0.0.0 - Production on Wed Jul 21 16:51:04 2021
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
Report for Workload in: /home/oracle/bak
-----------------------
Recommendation:
Consider using at least 1 clients divided among 1 CPU(s)
You will need at least 3 MB of memory per client process.
If your machine(s) cannot match that number, consider using more clients.
Workload Characteristics:
- max concurrency: 1 sessions
- total number of sessions: 2
Assumptions:
- 1 client process per 100 concurrent sessions
- 4 client processes per CPU
- 256 KB of memory cache per concurrent session
- think time scale = 100
- connect time scale = 100
- synchronization = TRUE
BEGIN
DBMS_WORKLOAD_REPLAY.INITIALIZE_REPLAY (replay_name => 'peak_120s',
replay_dir => 'TEST_DIR');
END;
/
-- 映射连接
select conn_id,capture_conn,replay_conn from dba_workload_connection_map where replay_id=1;
-- 修改为测试库连接
-- 改HOST, PORT, SERVICE_NAME
select 'exec dbms_workload_replay.remap_connection('||conn_id||', ''(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.80.99)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME= PDBREPLAY)))'');' from dba_workload_connection_map where replay_id=1;
执行上面拼接出来的语句
-- synchronization 是否完全按捕获时间线replay;connect_time_scale,think_time_scale 将时间设置为源库的50%,加大压测压力
BEGIN
dbms_workload_replay.PREPARE_REPLAY(synchronization => false,connect_time_scale => 50,think_time_scale => 50);
END;
/
wrc system mode=replay replaydir=/home/oracle/bak
另开一个窗口
BEGIN
DBMS_WORKLOAD_REPLAY.START_REPLAY ();
END;
/
等待负载执行完或者手动结束
BEGIN
DBMS_WORKLOAD_REPLAY.CANCEL_REPLAY ();
END;
/
结束后回到wrc的窗口,会看到如下输出
[oracle@dest-db bak]$ wrc system mode=replay replaydir=/home/oracle/bak
Workload Replay Client: Release 19.3.0.0.0 - Production on Wed Jul 21 17:23:33 2021
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
Password:
Wait for the replay to start (17:23:40)
Replay client 1 started (17:23:59) <--------
Replay client 1 finished (17:27:10) <--------
select name,status from dba_workload_replays;
NAME STATUS
------------- ----------------------------
peak_120s COMPLETED
也可以通过检查数据验证
-- 源库
SQL> select count(*) from mytab;
COUNT(*)
----------
100000
-- 目标库
SQL> select count(*) from mytab;
COUNT(*)
----------
100000
set pagesize 0 long 30000000 longchunksize 1000
select dbms_workload_replay.report(1,'TEXT') from dual;
-- 输出结果
DB Replay Report for test_replay_1
---------------------------------------------------------------------------
| DB Name | DB Id | Release | RAC | Replay Name | Replay Status |
---------------------------------------------------------------------------
| JCREPLAY | 147275354 | 11.1.0.5.0 | NO | test_replay_1 | COMPLETED |
---------------------------------------------------------------------------
Replay Information
--------------------------------------------------------------------------------------------------
| Information | Replay | Capture |
--------------------------------------------------------------------------------------------------
| Name | test_replay_1 | test_capture_2 |
--------------------------------------------------------------------------------------------------
| Status | COMPLETED | COMPLETED |
--------------------------------------------------------------------------------------------------
| Database Name | JCREPLAY | V11B5 |
--------------------------------------------------------------------------------------------------
| Database Version | 11.1.0.5.0 | 11.1.0.5.0 |
--------------------------------------------------------------------------------------------------
| Start Time | 25-JUL-07 16:19:27 | 25-JUL-07 14:09:49 |
--------------------------------------------------------------------------------------------------
| End Time | 25-JUL-07 16:20:31 | 25-JUL-07 14:12:11 |
--------------------------------------------------------------------------------------------------
| Duration | 1 minute 4 seconds | 2 minutes 22 seconds |
--------------------------------------------------------------------------------------------------
| Directory Object | MY_WORKLOAD_DIR | MY_WORKLOAD_DIR |
--------------------------------------------------------------------------------------------------
| Directory Path | /home/%usernm%/my_workload_directory | /home/%usernm%/my_workload_directory |
--------------------------------------------------------------------------------------------------
Replay Options
---------------------------------------------------------
| Option Name | Value |
---------------------------------------------------------
| Synchronization | TRUE |
---------------------------------------------------------
| Connect Time | 100% |
---------------------------------------------------------
| Think Time | 100% |
---------------------------------------------------------
| Think Time Auto Correct | TRUE |
---------------------------------------------------------
| Number of WRC Clients | 1 (1 Completed, 0 Running ) |
---------------------------------------------------------
Replay Statistics
------------------------------------------------
| Statistic | Replay | Capture |
------------------------------------------------
| DB Time | 932061 | 1006294 |
------------------------------------------------
| Average Active Sessions | .01 | .01 |
------------------------------------------------
| User calls | 46 | 50 |
------------------------------------------------
| Network Time | 2724 | . |
------------------------------------------------
| Think Time | 17159449 | . |
------------------------------------------------
| Elapsed Time Difference | 148907 | . |
------------------------------------------------
| New Errors | 0 | . |
------------------------------------------------
| Mutated Errors | 0 | . |
------------------------------------------------
---------------------------------------------------------------------------------------------------
Workload Profile Top Events (+) Show (-) Hide
--------------------------------------------------
| No data exists for this section of the report. |
--------------------------------------------------
Top Service/Module/Action (+) Show (-) Hide
--------------------------------------------------
| No data exists for this section of the report. |
--------------------------------------------------
Top SQL with Top Events (+) Show (-) Hide
--------------------------------------------------
| No data exists for this section of the report. |
--------------------------------------------------
Top Sessions with Top Events (+) Show (-) Hide
--------------------------------------------------
| No data exists for this section of the report. |
--------------------------------------------------
Replay Divergence Session Failures By Application (+) Show (-) Hide
--------------------------------------------------
| No data exists for this section of the report. |
--------------------------------------------------
Error Divergence By Application (+) Show (-) Hide
--------------------------------------------------
| No data exists for this section of the report. |
--------------------------------------------------
By SQL (+) Show (-) Hide
--------------------------------------------------
| No data exists for this section of the report. |
--------------------------------------------------
By Session (+) Show (-) Hide
--------------------------------------------------
| No data exists for this section of the report. |
--------------------------------------------------
DML Data Divergence By Application (+) Show (-) Hide
--------------------------------------------------
| No data exists for this section of the report. |
--------------------------------------------------
By SQL (+) Show (-) Hide
--------------------------------------------------
| No data exists for this section of the report. |
--------------------------------------------------
SELECT Data Divergence By Application (+) Show (-) Hide
--------------------------------------------------
| No data exists for this section of the report. |
--------------------------------------------------
End of Report.
最后,对比分析监控及AWR数据,这就属于性能优化方面的内容了,这里不再多说。
参考
11g新特性-重演(replay) – OracleBlog
Oracle 19c迁移前,做好RAT回放测试有多重要? - 云+社区 - 腾讯云
【RAT】Oracle Real Application Testing(真用应用测试)介绍_ITPUB博客
Master Note for Real Application Testing Option (Doc ID 1464274.1)
Database Testing: Best Practices (Doc ID 1535885.1)
Mandatory Patches for Database Testing Functionality for Current and Earlier Releases (Doc ID 560977.1)
Using Workload Capture and Replay (Doc ID 445116.1)
How to Setup and Run a Database Testing Replay in an Oracle Multitenant Environment (Real Application Testing - RAT) (Doc ID 1937920.1)