我们可以捕获生产环境的工作量,在测试环境上重放,从而在不影响生产环境的前提下做一些改动测试。
捕获:需要Oracle版本为10.2.0.4或更高.
重放:需要Oracle版本为11g Release 1或更新.

本文环境:RHEL6.4 + Oracle 11.2.0.4
下面介绍一下执行Database Replay的Workflow。

1. 捕获工作量(Workload Capture)

1.1 开始捕获

-- 创建目录replay_dir存放捕获信息
create or replace directory replay_dir as '/oradata/replay_dir';

-- 开始捕获工作量,10分钟后停止
begin
  dbms_workload_capture.start_capture(name => 'jydb_replay_1', dir => 'REPLAY_DIR', duration => 600);
end;
/

注:如果duration参数不指定,那么就在执行finish_capture成功后停止捕获。

1.2 模拟工作量

conn system/oracle@productDB

-- 数据表空间
create tablespace dbs_d_jingyu datafile size 30M autoextend off;
-- 临时表空间
create temporary tablespace temp_jingyu tempfile size 30M autoextend off;
-- 索引表空间(可选)
create tablespace dbs_i_jingyu datafile size 30M autoextend off;

-- 假设创建用户 jingyu 密码 jingyu,默认临时表空间 temp_jingyu, 默认数据表空间 dbs_d_jingyu。
CREATE USER jingyu IDENTIFIED BY jingyu
  TEMPORARY TABLESPACE temp_jingyu
  DEFAULT TABLESPACE dbs_d_jingyu
  QUOTA UNLIMITED ON dbs_d_jingyu;

-- 赋予普通业务用户权限
grant resource, connect to jingyu;
-- 赋予DBA用户权限
grant dba to jingyu;

-- 业务用户登录
conn jingyu/jingyu@productDB
-- 删除T1,T2两张表
drop table t1 cascade constraints purge;
drop table t2 cascade constraints purge;
-- 创建T1,T2两张表
create table t1( id number not null, n number, contents varchar2(4000) ) tablespace dbs_d_jingyu;
create table t2( id number not null, t1_id number not null, n number, contents varchar2(4000) ) tablespace dbs_d_jingyu;
-- 初始化向T1,T2表插入随机测试数据
execute dbms_random.seed(0);
set timing on
insert into t1  select rownum, rownum, dbms_random.string('a',50)   from dual   connect by level <= 100   order by dbms_random.random;
commit;
insert into t2  select rownum, rownum, rownum, dbms_random.string('b',50)  from dual  connect by level <= 10000  order by dbms_random.random;
commit;
-- 查询T1,T2表数据量
select count(1) from t1;
select count(1) from t2;

begin
  for i in 1..1000
    loop
      execute immediate 'select t1.id from t1, t2 where t1.id = t2.t1_id and t1.n = 19';
    end loop;
end;
/

-- 查询v$sql信息
select t.EXECUTIONS, t.SQL_TEXT from v$sql t where sql_text like 'select t1.id from t1, t2 where t1.id = t2.t1_id and t1.n = 19';

1.3 完成捕获

-- 停止捕获工作量
exec dbms_workload_capture.finish_capture();

2. 重放工作量(Workload Replay)

2.1 测试环境准备

首先将目录中生成的文件全部迁移到测试环境B目录/u02/replay_dir中。

-- 以下步骤是在测试环境B执行

-- 创建目录replay_dir
create or replace directory replay_dir as '/u02/replay_dir';

2.2 预处理工作量

-- 预处理工作量
begin
  dbms_workload_replay.process_capture(capture_dir => 'REPLAY_DIR');
  dbms_workload_replay.initialize_replay('jydb_replay_1', 'REPLAY_DIR');
  dbms_workload_replay.PREPARE_REPLAY();
end;
/

2.3 重放工作量

-- 重放工作量 (发现有问题)
exec dbms_workload_replay.start_replay();

-- 报错信息
*
ERROR at line 1:
ORA-20223: No replay clients have connected yet! Please issue START_REPLAY()
after one or more WRC replay clients have been started!
ORA-06512: at "SYS.DBMS_WORKLOAD_REPLAY", line 5748
ORA-06512: at line 1

--查询
SELECT * FROM v$option WHERE parameter = 'Real Application Testing'; 

上述报错因为没有WRC重放客户端,至少有1个WRC重放客户端。

2.3.1 需要WRC模拟重演客户端

wrc mode=calibrate replaydir=/u02/replay_dir

[oracle@JY-DB01 replay_dir]$ wrc mode=calibrate replaydir=/u02/replay_dir

wrc system/oracle@testDB mode=replay replaydir=/u02/replay_dir

[oracle@JY-DB01 admin]$ wrc system/oracle@testDB mode=replay replaydir=/u02/replay_dir

2.3.2 开始/暂停/继续/终止重放

-- 开始重放
exec dbms_workload_replay.start_replay();

-- 暂停重放
exec dbms_workload_replay.pause_replay();
-- 继续重放
exec dbms_workload_replay.resume_replay();
-- 终止重放
exec dbms_workload_replay.cancel_replay();

2.3.3 验证重放结果

-- t1表数量 应该是100
select count(1) from jingyu.t1;
-- t2表数量 应该是10000
select count(1) from jingyu.t2;
-- 查询v$sql信息 应该是1000
select t.EXECUTIONS, t.SQL_TEXT from v$sql t where sql_text like 'select t1.id from t1, t2 where t1.id = t2.t1_id and t1.n = 19';

3. 分析和报告(Analysis and Reporting)

3.1 productDB部分

-- 查询捕获信息
SELECT DBMS_WORKLOAD_CAPTURE.get_capture_info('REPLAY_DIR') FROM dual;

-- 提取报告
BEGIN
  DBMS_WORKLOAD_CAPTURE.export_awr (capture_id => 18);
END;
/

-- 查询dba_workload_captures
select id, name from dba_workload_captures;

-- 删除捕获信息
exec dbms_workload_capture.delete_capture_info(&i);
输入上面查询dba_workload_captures的id值进行删除。

3.2 testDB部分

-- 查询dba_workload_replays
COLUMN name FORMAT A30
SELECT id, name FROM dba_workload_replays;

-- 收集报告
declare
  capture_dir_id number;
  curr_replay_id number;
  replay_report clob;
begin
  capture_dir_id := dbms_workload_replay.get_replay_info(dir => 'REPLAY_DIR');
  select max(id) into curr_replay_id from dba_workload_replays where capture_id = capture_dir_id;
  replay_report := dbms_workload_replay.report(replay_id => curr_replay_id, format => DBMS_WORKLOAD_REPLAY.TYPE_HTML);
end;
/

--删除重放信息
exec dbms_workload_replay.delete_replay_info(&i);
输入上面查询dba_workload_replays的id值进行删除。
另,在确定不需要的时候可以系统删除重放目录下文件。

Reference

随机推荐

  1. javascript中BOM部分基础知识总结

    一.什么是BOM      BOM(Browser Object Document)即浏览器对象模型.      BOM提供了独立于内容 而与浏览器窗口进行交互的对象:      由于BOM主要用于管 ...

  2. FileZillaFTP使用教程

    FileZillaServer.exe服务启动和关闭程序 FileZilla Server Interface.exe 服务 管理程序 配置ftp服务器的用户名,密码,目录,目录读写权限 启动File ...

  3. 30天轻松学习javaweb_打包web项目成war

    jar -cvf news.war news 打包成 war 包后复制到webapps下,Tomcat将会解压.

  4. 转载:监控每个节点(Indices部分)

    集群的健康只是一个方面,它是对整个集群所有方面的一个很高的概括.节点状态的api是另外一个方面,它提供了关于你的集群中每个节点令你眼花缭乱的统计数据. 节点的状态提供了那么多的统计数据,在你很熟悉它们 ...

  5. vm上安装ubuntu

    图解演示环境版本: 本机系统: WIN7 虚拟机:VMware Workstation 8 (英文版) 安装目标:Ubuntu Desktop 12.04 LTS  (请点击这里)先下载好iso镜像文 ...

  6. 更换手机号或者更换手机后QQ设备锁的设置问题

    更换手机号 一步到位,更改密保手机号,OK了 更换手机 老卡插入 登录QQ,OK了 更换手机号和手机 老卡插入新手机 登录QQ 新卡插入新手机 更改密保手机号,OK了

  7. mac下的改装人生——制作mac os 启动盘

    我即将开始对我的mac进行彻底的改造,现在还需要的是一个mac的启动盘或者启动光盘.由于没钱买mac的安装光盘或者安装盘,只能网上下了一个镜像自己做启动盘~ 需要:装有Mac Os的电脑,至少8g的u ...

  8. python 正则空格\xa0实录 与xpath取 div 里面的含多个标签的所有文字

    业余玩爬虫时,由原先的原生写法 改为 scrapy框架了,使用自带的selector时,xpath配合正则来抓取回复数和阅读数的时候,遇到的小问题,mark下. 首先获取到 我需要的数据块,(我用sc ...

  9. POJ-1068 Parencodings---模拟括号的配对

    题目链接: https://vjudge.net/problem/POJ-1068 题目大意: 给出一种括号序列的表示形式名叫P序列,规则是统计出每个右括号之前的左括号个数作为序列每项的值.然后要求你 ...

  10. numpy array分割-【老鱼学numpy】

    有合并,就有分割. 本节主要讲述如何通过numpy对数组进行横向/纵向分割. 横向/纵向分割数组 首先创建一个6行4列的数组,然后我们对此数组按照横向进行切割,分成3块,这样每块应该有2行,见例子: ...