简介

在数据库的迁移和升级场景中,我们经常会遇到一个问题:在做压力测试时,如何模拟真实的业务压力,解决这个问题的方法有很多,比如:应用方开发模拟程序或者使用压力测试工具模拟,如load runner,但是,如果要说哪种方法能最大限度地模拟真实业务压力,我认为还是Oracle的Database Replay(数据库重放)功能,Database Replay功能是Real Application Testing的一部分,它的基本原理图如下:

简单说,Database Replay可以在生产数据库上“捕获”负载(workload capture),保存成一定格式的二进制文件。将保存的负载文件复制到测试环境,经过一定的处理后,就可以在测试环境“重放”负载(workload replay),从而达到模拟真实压力,进行压力测试的目的。

Database Replay是11g才有的特性,但是,负载的捕获,支持10.2.0.4之后的数据库,这一点也正好符合国内很多客户的需求,因为国内还有相当一部分客户,因为稳妥起见,系统还都一直运行在10gR2版本的Oracle数据库上,都有升级的需求。

Consolidated Database Replay 是11.2.0.2之后才出现的功能,字面意思是整合的数据库重放,它可以将不同系统“捕获”的负载,整合到一起重放,适用于数据库整合测试和Scale-Up测试。

后面我们用实验来详细介绍一下Database Replay的相关功能,实验采用10.2.0.5作为负载的捕获端,用12.1.0.2作为负载的重放端。

准备工作(安装Database Replay相关补丁)

首先要根据文档 Mandatory Patches for Database Testing Functionality for Current and Earlier Releases (Doc ID 560977.1),检查该打的补丁是否打过了。捕获端和重放端都要打。

负载的捕获

捕获端是一个安装在OL5.9上的10.2.0.5,数据库SID是test1.

创建目录

在OS创建目录并创建相应的数据库目录对象,用于保存负载数据:

$ cd /u01/app/oracle

$ mkdir wrc_dir1

SQL>CREATE OR REPLACE DIRECTORY wrc_dir1 AS '/u01/app/oracle/wrc_dir1/';

打开10gR2的Workload Capture 支持

虽然Database Replay支持10.2.0.4以上的版本进行负载“捕获”,但是10gR2的数据库要想正常使用这个功能,需要对数据库设置一个初始化参数,联机文档上讲需要运行脚本$ORACLE_HOME/rdbms/admin/wrrenbl.sql,其实这个脚本只做一件事,就是设置初始化参数PRE_11G_ENABLE_CAPTURE=true。

[oracle@test10g ~]$ sqlplus "/ as sysdba"

SQL*Plus: Release 10.2.0.5.0 - Production on Fri Dec 23 10:57:26 2016

Copyright (c) 1982, 2010, Oracle. All Rights Reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> @?/rdbms/admin/wrrenbl.sql

SQL> SET FEEDBACK 1

SQL> SET NUMWIDTH 10

SQL> SET LINESIZE 80

SQL> SET TRIMSPOOL ON

SQL> SET TAB OFF

SQL> SET PAGESIZE 100

SQL> alter system set PRE_11G_ENABLE_CAPTURE=true sid='*';

System altered.

修改后需要重启数据库,不仅仅为了让参数生效,也是为了让所有会话都重新连接。

创建实验用户和对象

创建数据库用户app1,并在app1 schema中创建表test_table1:

SQL>create table test_table1 (col1 number, col2 varchar2(20));

开始捕获负载

使用sys用户执行:

BEGIN

DBMS_WORKLOAD_CAPTURE.start_capture (name => 'test1_cap',

dir => 'WRC_DIR1',

duration => NULL);

END;

/

模拟负载

使用app1 用户登录数据库,执行:

begin

for i in 1..10000 loop

insert into test_table1 values(i,'test1:'||i);

end loop;

commit;

end;

/

在test_table1表中插入10000条记录。

然后断开会话。

停止捕获负载

SQL>exec dbms_workload_capture.finish_capture;

负载的重放

重放端是一个安装在OL7.1上的12.1.0.2数据库,数据库SID是test3。

准备工作

创建目录及数据库对象:

$ mkdir –p /u01/app/oracle/con_dir/wrc_dir1

SQL>CREATE OR REPLACE DIRECTORY wrc_dir1 AS '/u01/app/oracle/con_dir/wrc_dir1/';

复制捕获的负载文件到/u01/app/oracle/con_dir/wrc_dir1下。

在重放端创建app1用户,并创建和捕获端相同结构的表test_table1。

处理负载文件

用SYS用户执行:

BEGIN

DBMS_WORKLOAD_REPLAY.PROCESS_CAPTURE (capture_dir => 'WRC_DIR1', parallel_level=>1);

END;

/

BEGIN

DBMS_WORKLOAD_REPLAY.INITIALIZE_REPLAY (replay_name => 'replay1',

replay_dir => 'WRC_DIR1');

END;

/

exec dbms_workload_replay.prepare_replay ;

启动WRC客户端

WRC客户端是负责读取负载文件,重放负载的程序主体。重放除了在SQL环境中发出指令,还需要WRC客户端的配合。启动WRC客户端的命令:

$ wrc system/welcome1 mode=replay replaydir=./wrc_dir1

启动重放

SQL> exec dbms_workload_replay.start_replay;

WRC客户端退出才标志重放完成,下面是实际执行的输出:

[oracle@ol71vm1 con_dir]$ wrc system/welcome1 mode=replay replaydir=./wrc_dir1

Workload Replay Client: Release 12.1.0.2.0 - Production on Sun Jan 1 20:46:15 2017

Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved.

Wait for the replay to start (20:46:15)

Replay client 1 started (20:46:45)

Replay client 1 finished (20:50:27)

这时我们能够看到重放端app1用户test_table1表中被插入了10000条记录,说明负载被正确地重放了。

另外,完成后可以查看重放报告,取得报告的命令:

SQL>set pagesize 0 long 30000000 longchunksize 2000 linesize 155

SQL>select DBMS_WORKLOAD_REPLAY.REPORT(replay_id => 71, format => 'HTML') from dual;

当然,要想做更详细的分析,还是看相应时间段的AWR报告比较好。

Consolidated Database Replay
整合场景

比如有两个APP,分别运行在不同的数据库上,客户希望将两个应用整合到一个数据库上,但是不知道新数据库是否能承受住压力。那么就可以用Consolidated Database Replay来模拟测试一下。

捕获端准备工作

前面的例子我们做的捕获是从数据库test1上做的,我们再创建另一个10.2.0.5的数据库叫test2,在test2上也捕获一份负载。

$ cd /u01/app/oracle

$ mkdir wrc_dir2

在test2数据库中执行:

SQL>CREATE OR REPLACE DIRECTORY wrc_dir2 AS '/u01/app/oracle/wrc_dir2/';

创建数据库用户app2,并在app2 schema中创建表test_table2:

SQL>create table test_table2 (col1 number, col2 varchar2(20));

修改初始化参数,重启test2数据库。

开始捕获

用户SYS用户执行:

BEGIN

DBMS_WORKLOAD_CAPTURE.start_capture (name => 'test2_cap',

dir => 'WRC_DIR2',

duration => NULL);

END;

/

模拟压力

用app2用户登录数据库test2,执行下面的脚本模拟压力:

begin

for i in 1..10000 loop

insert into test_table2 values(i,'test2:'||i);

end loop;

commit;

end;

/

然后断开连接。

停止捕获

SQL>exec dbms_workload_capture.finish_capture;

重放端准备工作

我们还是使用前面实验用过的OL7.1上的12.1.0.2的这个环境,使用test3这个数据库。

创建Consolidated database replay目录:

SQL>CREATE OR REPLACE DIRECTORY con_dir AS '/u01/app/oracle/con_dir/';

创建存放test2负载的目录wrc_dir2。(wrc_dir1在前面的实验里已经创建过了。)

$ cd /u01/app/oracle/con_dir

$ mkdir wrc_dir2

SQL>CREATE OR REPLACE DIRECTORY wrc_dir2 AS '/u01/app/oracle/con_dir/wrc_dir2/';

WRC_DIR1和WRC_DIR2都是CON_DIR的子目录。

在数据库test3上创建app2用户,并创建和捕获端相同结构的表test_table2。

(app1用户和test_table1已经在上个实验中创建在数据库test3上了)

处理负载并设置重放时间表

使用SYS用户执行:

SQL>exec dbms_workload_replay.set_replay_directory('CON_DIR');

SQL>exec dbms_workload_replay.begin_replay_schedule('S1'); -- S1是给时间表起的名字

SQL>select dbms_workload_replay.add_capture('WRC_DIR1') from dual;

SQL>select dbms_workload_replay.add_capture('WRC_DIR2') from dual;

SQL>exec dbms_workload_replay.end_replay_schedule; -- 保存重放时间表

SQL>exec dbms_workload_replay.initialize_consolidated_replay('CR1','S1');

SQL>exec dbms_workload_replay.prepare_consolidated_replay (synchronization => 'OBJECT_ID');

-- 参数synchronization决定replay重放负载的方式,OBJECT_ID代表replay重放负载时,对象上的操作顺序,在对象及被引用的对象范围内,保证和捕获时的顺序一致。

启动WRC客户端

因为是2个不同的负载,所以需要启动至少2个WRC客户端

$ wrc system/welcome1 mode=replay replaydir=/u01/app/oracle/con_dir &

$ wrc system/welcome1 mode=replay replaydir=/u01/app/oracle/con_dir &

启动重放

用SYS用户执行:

SQL>exec dbms_workload_replay.start_consolidated_replay;

完成重放后,我们可以看到,在数据库test3中app1和app2两个用户下的test_table1和test_table2表中都被插入了10000条记录,证明负载被正确地重放了。

Scale-Up场景

有的时候,我们想知道未来业务量增长了,数据库是否能承受的了,比如模拟测试未来业务增加一倍的情况,也可以使用Consolidated Database Replay。这样使用的最简单方式就是一份捕获,复制多份,同时replay。

比如上面的实验,从test1库上捕获的负载,我们可以复制2份,分别放在WRC_DIR1和WRC_DIR2中,其他步骤完全一样,当我们重放时,就是执行了双份的test1上捕获的负载。

实际效果就是,app1用户下的test_table1表中被插入了20000条记录。

当然,Scale-Up并不只是这么简单,相应的还有Time Shifting,就是通过调整时间,让多个负载的高峰重合到一起,还有Workload Folding,就是将一个负载,分成不同的时间段,然后将不同时间段的负载并行执行。篇幅有限,留待大家自己研究了。

常见问题:

如果出现没有任何报错,但是重放端不重放负载的情况,可能是WRC客户端有问题,可以尝试在重放端,重新编译WRC客户端:

$ cd $ORACLE_HOME/rdbms/lib

$ make -f ins_rdbms.mk iwrc

Database Replay和Consolidated Database replay的更多相关文章

  1. Mac 下locate命令使用问题WARNING: The locate database (/var/db/locate.database) does not exist.

    想在Mac下使用locate时,提醒数据库没创建: WARNING: The locate database (/var/db/locate.database) does not exist. To ...

  2. 使用RMAN DUPLICATE...FROM ACTIVE DATABASE创建物理standby database

    Applies to: Oracle Server - Enterprise Edition - Version 11.1.0.6 to 11.2.0.4 [Release 11.1 to 11.2] ...

  3. CREATE DATABASE permission denied in database 'master'.

    EF Code first 建立数据库时报这个错误 CREATE DATABASE permission denied in database 'master'. 解决方法: 打开 Sql Serve ...

  4. 转载:Restore SQL Server database and overwrite existing database

    转载自:https://www.mssqltips.com/sqlservertutorial/121/restore-sql-server-database-and-overwrite-existi ...

  5. Azure SQL Database (23) Azure SQL Database Dynamic Data Masking动态数据掩码

    <Windows Azure Platform 系列文章目录> 我们在使用关系型数据的时候,有时候希望: - 管理员admin,可以查看到所有的数据 - 普通用户,某些敏感字段,比如信用卡 ...

  6. 解决spring-boot启动中碰到的问题:Cannot determine embedded database driver class for database type NONE

    问题 如下: 2017-07-16 08:50:57.436  INFO 13524 --- [           main] c.p.p.web.PointshopWebApplication   ...

  7. Cannot determine embedded database driver class for database type NONE

    springboot+jpa使用自定义配置文件连接数据库报错:Cannot determine embedded database driver class for database type NON ...

  8. Caused by: org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Cannot determine embedded database driver class for database type NONE. If you want an embe

    Caused by: org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationEx ...

  9. 深入Spring Boot:怎样排查 Cannot determine embedded database driver class for database type NONE

    ref:https://www.journaldev.com/13830/spring-boot-cannot-determine-embedded-database-driver-class-for ...

随机推荐

  1. 将表里的数据批量生成INSERT语句的存储过程 增强版

    将表里的数据批量生成INSERT语句的存储过程 增强版 有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件 ...

  2. 关于全局ID,雪花(snowflake)算法的说明

    上次简单的说一下:http://www.cnblogs.com/dunitian/p/6041745.html#uid C#版本的国外朋友已经封装了,大家可以去看看:https://github.co ...

  3. 一起学微软Power BI系列-使用技巧(1)连接Oracle与Mysql数据库

    说起Oracle数据库,以前没用过Oracle不知道,但是这1年用Oracle后,发现真的是想狂吐槽,特别是那个.NET驱动和链接字符串,特别奇葩.总归是和其他数据库不一样,标新立异,不知道为何.另外 ...

  4. .NET CoreCLR开发人员指南(上)

    1.为什么每一个CLR开发人员都需要读这篇文章 和所有的其他的大型代码库相比,CLR代码库有很多而且比较成熟的代码调试工具去检测BUG.对于程序员来说,理解这些规则和习惯写法非常的重要. 这篇文章让所 ...

  5. MySQL 系列(二) 你不知道的数据库操作

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 本章内容: 查看\创建\使用\删除 数据库 用户管理及授权实战 局域网 ...

  6. js学习之变量、作用域和内存问题

    js学习之变量.作用域和内存问题 标签(空格分隔): javascript 变量 1.基本类型和引用类型: 基本类型值:Undefined, Null, Boolean, Number, String ...

  7. [原] 利用 OVS 建立 VxLAN 虚拟网络实验

    OVS 配置 VxLAN HOST A ------------------------------------------ | zh-veth0(10.1.1.1) VM A | | ---|--- ...

  8. HTML简单入门内容

    常用属性: Width=宽度 Height=高度 Size=大小 Color=颜色 Align=布局方向,值包括(top,bottom,left,right,center)上,下,左,右,中. Bor ...

  9. android手机登录时遇到“QQ安全登录发现病毒”解决

    android手机作为开源系统非常容易感染病毒,有时候我们会经常遇到手机QQ登录时检测到app被感染,一般情况是由手机感染病毒所引起的,安装腾讯管家后只能检测病毒和卸载感染病毒的软件,不能清除病毒.解 ...

  10. atitit.管理学三大定律:彼得原理、墨菲定律、帕金森定律

    atitit.管理学三大定律:彼得原理.墨菲定律.帕金森定律 彼得原理(The Peter Principle) 1 彼得原理解决方案1 帕金森定律 2 如何理解墨菲定律2 彼得原理(The Pete ...