我们可以捕获生产环境的工作量,在测试环境上重放,从而在不影响生产环境的前提下做一些改动测试。
捕获:需要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

Oracle 数据库重放(Database Replay)功能演示的更多相关文章

  1. Oracle数据库的版本变迁功能对比

    Oracle数据库自发布至今,也经历了一个从不稳定到稳定,从功能简单至强大的过程.从第二版开始,Oracle的每一次版本变迁,都具有里程碑意义. 1979年的夏季,RSI(Oracle公司的前身,Re ...

  2. Oracle数据库如何创建DATABASE LINK?

    Oracle数据库如何创建DATABASE LINK? 2011-08-09 14:54 taowei20061122 CSDN博客  http://blog.csdn.net/taowei20061 ...

  3. Database Replay和Consolidated Database replay

    简介 在数据库的迁移和升级场景中,我们经常会遇到一个问题:在做压力测试时,如何模拟真实的业务压力,解决这个问题的方法有很多,比如:应用方开发模拟程序或者使用压力测试工具模拟,如load runner, ...

  4. C#DbHelperOra,Oracle数据库帮助类 (转载)

    主要功能如下数据访问抽象基础类 主要是访问Oracle数据库主要实现如下功能 .数据访问基础类(基于Oracle),主要是用来访问Oracle数据库的. .得到最大值:是否存在:是否存在(基于Orac ...

  5. [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了

    [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 本文首发自:博客园 文章地址: https://www.cnblogs.com/yilezhu/p/ ...

  6. CentOS以及Oracle数据库发展历史及各版本新功能介绍, 便于构造环境时有个对应关系

    CentOS版本历史 版本 CentOS版本号有两个部分,一个主要版本和一个次要版本,主要和次要版本号分别对应于RHEL的主要版本与更新包,CentOS采取从RHEL的源代码包来构建.例如CentOS ...

  7. Oracle数据库11g各版本介绍及功能比较

    .标准版和企 业版.所有这些版本都使用相同的通用代码库构建,这意味着企业的数据库管理软件可以轻松地从规模较小的单一处理器服务器扩展到多处理器服务器集 群,而无需更改一行代码.Oracle数据库11g企 ...

  8. oracle数据库基础功能

    一.oracle基本常用的数据类型 varchar(长度) 字符串char(长度) 字符number(x,y) x表示总位数 y表示保留小数点后几位数 eg面试题:number(5,3)最大的数是99 ...

  9. EF中创建、使用Oracle数据库的Sequence(序列)功能

    ** 背景 ** 项目中订单号原来的生成规则由日期加随机数组成,后期需求决定将订单号生成规则更改为生成日期加当天当前订单数. 每天的订单数都是从0开始的,每生成一个订单,订单数就应该加1.订单数应该是 ...

随机推荐

  1. Linux 用户添加sudo 权限

    编辑/etc/sudoers 搜索root 添加 账号 ALL=(ALL) ALL

  2. Metro 页面间跳转报错、打包和安装一个本地的Metro类型应用

    1.模板页面间传值跳转报错误 参照:http://www.cnblogs.com/dagehaoshuang/archive/2012/08/31/2665166.html#2862480 强烈推荐, ...

  3. Ubuntu在下面LAMP(Linux+Apache+MySQL+PHP) 开发环境的搭建

    LAMP在行业是一个非常流行的词.此4字母代表Linux.Apache,MySQL和PHP. LAMP其高效.灵活的特点已经成为中小企业的首选. 它已经推出了快速构建LAMP道路. 1 在Ubuntu ...

  4. 网卡name-eth1如何修改为eth0

    正常来说,Linux在识别网卡时第一张会是eth0,第二张才是eth1. 有时候我们使用虚拟机克隆技术后网卡的信息就会改变,新克隆出来的虚拟主机网卡名字可能变为eth1.无论我们怎么修改都无法改变,这 ...

  5. Java多线程之interrupt()的深度研究

    近期学习Java多线程的中断机制,网上的帖子说得很浅,并没深究其原理.看了Java源码,对Java的中断机制有了略深入的理解,在这篇文章中向感兴趣的网友分享下.这篇文章主要通过一个典型例子对中断机制进 ...

  6. solr参数之facet

    facet就像sql语句中的group一样,是对某一个字段进行group并count,即能够按照Facet的字段进行分组并统计. 一.基本使用: 必须属性:facet=true&facet.f ...

  7. Linux-vim文本编辑器

    [Vim文本编辑器] vim的三种模式:一般模式.编辑模式.命令模式. * 一般模式: 当你vim filename 编辑一个文件时,一进入该文件就是一般模式了.在这个模式下,你可以做的操作有,上下移 ...

  8. Ubuntu16.04安装OpenCV3.2以及PCL1.8

    最近在学习slam14讲,需要配置一些环境<视觉slam十四讲> 这本书中已经给出如何配置相关环境的比较详细的说明,但是有些环境并无卵用,比如OpenCV以及PCL 这里给出自己屡试不爽的 ...

  9. max_element(C++)求数组最大元素

    #include<iostream> #include<vector> #include<algorithm> using namespace std; int m ...

  10. kbmmw 的HTTPSmartService 上传文件到服务器端

    前面我写过了 HTTPSmartService 使用介绍,可以参见以前的文章. 前一向有同学问如何在http 页面表单上上传文件.一直没有时间回答,自己简单做了例子, 发现无法实现功能,今天花了一天时 ...