Oracle 数据库重放(Database Replay)功能演示
我们可以捕获生产环境的工作量,在测试环境上重放,从而在不影响生产环境的前提下做一些改动测试。
捕获:需要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)功能演示的更多相关文章
- Oracle数据库的版本变迁功能对比
Oracle数据库自发布至今,也经历了一个从不稳定到稳定,从功能简单至强大的过程.从第二版开始,Oracle的每一次版本变迁,都具有里程碑意义. 1979年的夏季,RSI(Oracle公司的前身,Re ...
- 基于Oracle数据库登陆界面及功能实现 Java版
首先要在Oracle数据库创建表文件,包括建立表头以及关键字(唯一标识符),此次程序所用的表名称为SW_USER_INFO,表头有UNAME.UKEY.USEX等,关键字为UCC,然后添加一条记录,用 ...
- 开启和关闭oracle数据库中的审计功能
第1步:查看审计功能是否开启?SQL> show parameter audit;NAME TYPE VALUE-- ...
- Oracle数据库如何创建DATABASE LINK?
Oracle数据库如何创建DATABASE LINK? 2011-08-09 14:54 taowei20061122 CSDN博客 http://blog.csdn.net/taowei20061 ...
- 利用oracle数据库闪回功能将oracle数据库按时间点恢复
oracle更新脚本把原数据冲了,并且没有备份,急煞我也 解决办法: oracle数据库有闪回功能: select * from tab 可以查出已被删除的表 ...
- Database Replay和Consolidated Database replay
简介 在数据库的迁移和升级场景中,我们经常会遇到一个问题:在做压力测试时,如何模拟真实的业务压力,解决这个问题的方法有很多,比如:应用方开发模拟程序或者使用压力测试工具模拟,如load runner, ...
- 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 重点: 实现多级子目录的压缩, ...
- Oracle数据库备份、灾备的23个常见问题
为了最大限度保障数据的安全性,同时能在不可预计灾难的情况下保证数据的快速恢复,需要根据数据的类型和重要程度制定相应的备份和恢复方案.在这个过程中,DBA的职责就是要保证数据库(其它数据由其它岗位负责) ...
- C#DbHelperOra,Oracle数据库帮助类 (转载)
主要功能如下数据访问抽象基础类 主要是访问Oracle数据库主要实现如下功能 .数据访问基础类(基于Oracle),主要是用来访问Oracle数据库的. .得到最大值:是否存在:是否存在(基于Orac ...
随机推荐
- 【http代理报文】通过发包实现代理请求网页内容
工作中,我们难免需要通过TCP/IP协议发送报文来直接请求网页内容(比如爬虫工具),有同学问如何通过HTTP代理来请求网页,其实我们只需要把报文稍稍修改下,发送给代理服务器即可实现. 基础不过关的朋友 ...
- 快速定位性能瓶颈,检查出所有资源(CPU、内存、磁盘IO等)的利用率(utilization)、饱和度(saturation)和错误(error)度量,即USE方法
命令:uptime说明:查看机器分别在1分钟.5分钟.15分钟的平均负载情况,显示的数字表示等待cpu资源的进程和阻塞在不可中断io进程的数量,如果1分钟的平均负载很高,而15分钟的平均负载很低,说明 ...
- html5 炫酷的字幕雨
<!DOCTYPE html> <html> <head> <script src="http://tj.gamee456.com/jquery.1 ...
- python奇偶数求和
#求100内奇数和while\for..in循环 sum = 0 i = 1 while i <= 100: sum += i i += 2 print(sum) sum = 0 for i i ...
- Building Modern Web Apps-构建现代的 Web 应用程序(一些感想)
<iframe src="http://channel9.msdn.com/Series/MVA-China/Web20140611A01/player?h=540&w=960 ...
- .NET Core与.NET Framework、Mono之间的关系
随着微软的.NET开源的推进,现在在.NET的实现上有了三个.NET Framework,Mono和.NET Core.经常被问起Mono的稳定性怎么样,后续Mono的前景如何,要回答这个问题就需要搞 ...
- 【nginx配置】nginx做非80端口转发
一个场景 最近在使用PHP重写一个使用JAVA写的项目,因为需要查看之前的项目,所以要在本地搭建一个Tomcat来跑JAVA的项目.搭建成功后,因为Tomcat监听的端口是8080,因此,访问的URL ...
- 搭建 SVN 服务器
安装.启动 SVN 服务器 在 Windows 下,可以使用以下命令将 SVN 服务注册到 windows 服务中去: sc create svnserver binPath= "drive ...
- MySQL 分析服务器状态
标签:MYSQL/数据库/性能优化/调优 概述 文章简单介绍了通过一些查询命令分析当前服务器的状态. 目录 概述 获取服务器整体的性能状态 SQL操作计数 总结 步骤 获取服务器整体的性能状态 首先对 ...
- 基于GIS的旅游辐射区人口统计
在旅游规划中,考虑旅游景点周边的人口负载量是很重要的一个方面,这将直接影响资源的投入和配置,开发潜力和规模等.基于GIS可以将人口信息进行空间化的展示,还可以通过空间分析的方法计算出旅游景点辐射区的人 ...