我们可以捕获生产环境的工作量,在测试环境上重放,从而在不影响生产环境的前提下做一些改动测试。

捕获:需要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();

<h1 id="2">2. 重放工作量(Workload Replay)</h1>
## 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';

<h1 id="3">3. 分析和报告(Analysis and Reporting)</h1>
## 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值进行删除。

另,在确定不需要的时候可以系统删除重放目录下文件。

<h1 id="4">Reference</h1>
- [Database Replay in Oracle Database 11g Release 1](https://oracle-base.com/articles/11g/database-replay-11gr1)
- OCP 认证考试指南 (1Z0-053)[M]. 清华大学出版社, 2010.

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

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

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

  2. 基于Oracle数据库登陆界面及功能实现 Java版

    首先要在Oracle数据库创建表文件,包括建立表头以及关键字(唯一标识符),此次程序所用的表名称为SW_USER_INFO,表头有UNAME.UKEY.USEX等,关键字为UCC,然后添加一条记录,用 ...

  3. 开启和关闭oracle数据库中的审计功能

    第1步:查看审计功能是否开启?SQL> show parameter audit;NAME                                 TYPE        VALUE-- ...

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

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

  5. 利用oracle数据库闪回功能将oracle数据库按时间点恢复

    oracle更新脚本把原数据冲了,并且没有备份,急煞我也         解决办法:         oracle数据库有闪回功能:   select * from tab 可以查出已被删除的表    ...

  6. Database Replay和Consolidated Database replay

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

  7. C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志

    C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...

  8. Oracle数据库备份、灾备的23个常见问题

    为了最大限度保障数据的安全性,同时能在不可预计灾难的情况下保证数据的快速恢复,需要根据数据的类型和重要程度制定相应的备份和恢复方案.在这个过程中,DBA的职责就是要保证数据库(其它数据由其它岗位负责) ...

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

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

随机推荐

  1. Smart3D系列教程3之 《论照片三维重建中Smart3D几个工作模块的功能意义》

    [摘要] 近年来,倾斜摄影测量技术是国际测绘遥感领域近年发展起来的一项高新技术,利用照片进行三维重建成为一项关键性的技术.Smart3D软件,是照片三维重建主流软件之一,本文将就Smart3D建模软件 ...

  2. How Long Does It Take

    好长时间没写博客了,真心惭愧啊! 废话少说,原题链接:https://pta.patest.cn/pta/test/1342/exam/4/question/24939 题目如下: Given the ...

  3. 关于兼容IE的一些策略

    --css 盒子模型下的 box-sizing 属性,只兼容到ie8: -moz-box-sizing: border-box; -webkit-box-sizing: border-box; -o- ...

  4. GDB调试汇编分析

    GDB调试汇编分析 代码 本次实践我参照了许多先做了的同学的博客,有卢肖明,高其,张梓靖同学.代码借用的是卢肖明同学的代码进行调试运行. GCC编译 使用gcc -g gdbtest.c -o gdb ...

  5. Unity_UGUI知识点思维导图

    转自 http://blog.csdn.net/qq_34134078/article/details/51772568 个人总结的UGUI学习知识要点思维导图,四张部分图及最后一张整体图 1.UI基 ...

  6. 【实战Java高并发程序设计 2】无锁的对象引用:AtomicReference

    AtomicReference和AtomicInteger非常类似,不同之处就在于AtomicInteger是对整数的封装,而AtomicReference则对应普通的对象引用.也就是它可以保证你在修 ...

  7. JavaScript 事件 编程练习

    编程练习 使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除. 提示:获取元素的值设置和获取方法为:例:赋值:document.getElement ...

  8. 仿花田:相亲网站 意中人 已在GitHub上开源

    在园友的强烈呼唤下,我还是负责任的分享给大家,因为对代码比较熟悉一下,还是有些问题要说明,不然别人看起来会比较费劲.说实话除了这个bootstrap的界面风格和这件事情本身对大家有吸引力之外,内部的逻 ...

  9. Java多线程系列--“JUC锁”10之 CyclicBarrier原理和示例

    概要 本章介绍JUC包中的CyclicBarrier锁.内容包括:CyclicBarrier简介CyclicBarrier数据结构CyclicBarrier源码分析(基于JDK1.7.0_40)Cyc ...

  10. [OpenGL][SharpGL]用Polygon Offset解决z-fighting和stitching问题

    [OpenGL][SharpGL]用Polygon Offset解决z-fighting和stitching问题 本文参考了(http://www.zeuscmd.com/tutorials/open ...