Oracle 19c迁移前,做好RAT回放测试有多重要?

Wesley13
• 阅读 1064

作者介绍

梁铭图,新炬网络首席架构师,十多年数据库运维、数据库设计、数据治理以及系统规划建设经验,拥有Oracle OCM、Togaf企业架构师(鉴定级)、IBM CATE等认证,曾获dbaplus年度MVP以及华为云MVP等荣誉,并参与数据资产管理国家标准的编写工作。在数据库运维管理和架构设计、运维体系规划、数据资产管理方面有深入研究。

背景

某客户的核心系统数据库一直是IBM AIX小型机和Oracle 11g R2,这个数据库已修修补补用了近十年。最近计划迁移到x86环境下的Oracle 19G,在之前的迁移测试以及应用测试中,做的都是一些简单的测试,没有试过模拟现网的压力。这可能会导致应用连接到新库之后,在出现各种未知问题时无法及时处理。

于是考虑使用RAT中的Database Replay,模拟现网的运行,来发现数据迁移、兼容性、性能等各种问题。

RAT介绍

Oracle Real Application Testing(简称RAT)是11gR2的一个重要的feature,其推出的初衷是为了满足数据中心变更后,有很好的方法和工具去衡量这些变更对于生产环境的应用带来的影响,更好地评估诸如硬件升级、软件升级、架构变化等等对于客户应用程序的影响。

Real Application Testing其实有两个解决方法,分别是Database Replay和SPA(SQL Performance Analyzer)。以前有用过SPA就不做介绍了,本次主要介绍RAT的使用以及我在使用过程中遇到的问题。

Database Replay,数据库回放顾名思义可以理解为一个录像机,通过在源系统上把实时应用产生的负载录制下来,并拿到变更后的环境进行播放,从而进行一个对比。数据库回放分为四个阶段完成:录制、预处理、回放、结果分析和报告。

测试环境

  • 源库主机:IBM 880

  • 源库操作系统:AIX

  • 源库版本:11.2.0.4.16

  • 是否RAC:是

  • 目标库主机:国产 x86服务器

  • 操作系统:Redhat 7

  • 目标库版本:19.7

  • 是否RAC:是

RAT测试过程

1、录制

1)目录准备

首先创建一个操作系统目录,用于存放录制的文件,由于是RAC环境,因此要求是一个双机共享的目标,例如我们这里用的是NFS目录挂接到两个节点上:

 

mkdir -p /datadump/rat_test

在数据库内创建一个DIRECTORY:

 

$ sqlplus / as sysdba

SQL> create directory DBRAT_0218 as '/home/oracle/rat_test';

SQL > grant read,write on directory DBRAT_0218 to public;

2)设置捕捉的条件

有时候我们需要限定只捕捉部分的工作负载,可以通过这个设置来达成,本次测试我们主要捕捉其中一个地市用户的负载:

 

exec dbms_workload_capture.ADD_FILTER(fname =>'FILTER_SYS',fattribute => 'USER',fvalue => 'NGCRM_ST');

3)开启捕捉

 

BEGIN

DBMS_WORKLOAD_CAPTURE.start_capture (name => 'DBREPLAY_0218',

dir => 'DBRAT_0218',

duration => 7200);

END;

/

  • name是本次捕捉任务的名称;

  • dir是上面创建的directory;

  • duration是捕捉时间,上面设置了7200,也就是捕捉2小时,该参数可以设置为NULL,就是无时间限制地录制,直到发起停止命令。

 

DBMS_WORKLOAD_CAPTURE.finish_capture;

遇到过的问题:在第一次接触并使用DBReplay的时候,在某个库发起了捕捉命令,使用的是一个共享目录,有时候无论怎样发起,过了1-2分钟就结束(并没有设置捕捉时间)。当时以为是业务量太小自动结束了进程,也没太注意。后来在业务繁忙时段有时候同样无法采集,找了各种资料均没有相关信息。后来换了一个目录就没有再出现过这样的问题。

4)监控捕捉状态

可用以下命令查看是否录制完成:

 

select id,name,status,start_time,end_time,connects,user_calls,dir_path from dba_workload_captures;

2、目标端装载数据

为了更准确模拟系统的压力和反馈,我们需要将现有数据库相关的数据装载到目标数据库当中。由于是测试环境,我们这里就采集最简便的Datapump的方式将源数据库的几个相关schema倒出,并装载到目标数据库。篇幅关系,这个步骤的操作过程就略过不谈。

3、负载预处理

1)负载预处理

在回放负载之前,需要对负载进行预处理。

创建一个目录的对象存放源数据录制后的文件,由于目标环境也是RAC,所以也需要使用共享目录:

 

SQL> create directory DBRAT_0218 as '/ACFS01/rat_0218';

SQL > grant read,write on directory DBRAT_0218 to public;

SQL> exec dbms_workload_replay.process_capture('DBRAT_0218');

遇到过的问题:在最开始的测试中,我们一直卡在这一步,语句一直不完成,一开始以为这个预处理需要很多的时间,于是一直等,几个小时甚至一天都不能完成,从来没有成功过,而且后台日志有如下错误:

 

DBMS_WORKLOAD_REPLAY.PROCESS_CAPTURE:WARNING:Preprocessing encountered a CORRUPT file wrc_5ph12b0010fu.rec in /ACFS01/dbreplay/inst1/aa.

DBMS_WORKLOAD_REPLAY.PROCESS_CAPTURE:WARNING:Preprocessing encountered a CORRUPT file wrc_5ph12b0010hr.rec in /ACFS01/dbreplay/inst1/aa.

DBMS_WORKLOAD_REPLAY.PROCESS_CAPTURE:WARNING:Preprocessing encountered a CORRUPT file wrc_5ph12b0032sd.rec in /ACFS01/dbreplay/inst1/aa.

DBMS_WORKLOAD_REPLAY.PROCESS_CAPTURE:WARNING:Preprocessing encountered a CORRUPT file wrc_5ph12b00154sb.rec in /ACFS01/dbreplay/inst1/aa.

DBMS_WORKLOAD_REPLAY.PROCESS_CAPTURE:WARNING:Preprocessing encountered a CORRUPT file wrc_5ph12b0010fu.rec in /ACFS01/dbreplay/inst1/aa.

DBMS_WORKLOAD_REPLAY.PROCESS_CAPTURE:WARNING:Preprocessing encountered a CORRUPT file wrc_5ph12b0010fu.rec in /ACFS01/dbreplay/inst1/aa.

后来提交MOS,官方建议在源库以及目标库都打上相应的补丁来修复bug。

目标库:one-off-patch,补丁:21117072,打完这个补丁之后,预处理的命令不再是一直等待卡着不动,如果文件有错误则直接退出。

源库:one-off-patch,补丁:17373277,修复了上图中出现文件错误的bug。

2)初始化回放

 

exec dbms_workload_replay.initialize_replay('DBREPLAY_0218','DBRAT_0218');

PS:第一个参数是捕捉任务的名称,第二个参数是文件存放的DIRECTORY。

3)连接配置映射

由于播放环境和捕捉环境数据库配置不同,需要进行一个映射的过程。

未映射:

 

select conn_id,capture_conn from dba_workload_connection_map order by 1;

Oracle 19c迁移前,做好RAT回放测试有多重要?

 

exec DBMS_WORKLOAD_REPLAY.REMAP_CONNECTION (connection_id =>  1 , replay_connection => '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xxx.xxx.xxx.xxx)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME= xxxx )))');

PS:connection_id就是上面语句查询出来的conn_id,有多少就需要改多少,replay_connection这里只需要修改IP、端口和SERVICE_NAME即可。

映射后:

Oracle 19c迁移前,做好RAT回放测试有多重要?

4)准备回放

 

exec dbms_workload_replay.prepare_replay(synchronization=>FALSE);

Oracle 19c迁移前,做好RAT回放测试有多重要?

我们这里使用了默认的参数,如果需要加大或减少回放的压力,可以适当配置connect_time_scale和think_time_scale这两个参数,这两个参数默认的值是100(百分比),也就是1:1重放,如果把connect_time_scale设置成50%,也就是两个连接的间隔时间缩短到原来的50%(10分钟的话就缩短到5分钟),从而加大数据库的压力。

例如:

 

exec dbms_workload_replay.prepare_replay(synchronization=>FALSE, connect_time_scale=>50, think_time_scale=>50);

4、重放

1)准备客户端

根据工作负载的强度大小,准备相应的客户端,可以使用wrc的评估模式来衡量大约需要多少客户端。

 

wrc mode=calibrate replaydir=/ACFS01/rat_0218

Oracle 19c迁移前,做好RAT回放测试有多重要?

可以看到上面有一句是Consider using at least 30 clients divided among 8 CPU(s),那么我们就需要准备至少30个客户端,否则会出现资源溢出而异常结束。

这个时候客户端属于就绪状态,等待播放开始(至少启动1个客户端,否则无法启动重放)。

由于这里需要30个,所以可以写一个脚本就在一台机for循环跑30个后台进程。

参考脚本如下:

 

for ((i=1;i<=30;i++))

do

nohup wrc system/oracle@NGCRM_ST mode=replay replaydir=/ACFS01/rat_0218 > /ACFS01/wrc_log/wrc_$i.log &

done

2)开始回放

 

exec dbms_workload_replay.start_replay;

当然,我们可以通过以下调用以下过程,控制回放作业:

 

DBMS_WORKLOAD_REPLAY.PAUSE_REPLAY (); ##暂停作业

DBMS_WORKLOAD_REPLAY.RESUME_REPLAY (); ##继续作业

DBMS_WORKLOAD_REPLAY.CANCEL_REPLAY (); ##取消作业

3)监控回放

在重演中,任何错误,或者出现在生产环境和测试环境之间的数据不符,都会被记录为分歧调用。获取这些分歧调用的信息,包括:SQL ID、SQL文本、绑定变量取值,都可以通过视图DBA_WORKLOAD_REPLAY_DIVERGENCE,以及GET_DIVERGENT_STATEMENT获取。例如:

 

SQL> SELECT REPLAY_ID,STREAM_ID,CALL_COUNTER FROM DBA_WORKLOAD_REPLAY_DIVERGENCE;

4)查看回放报告:

 

select dbms_workload_replay.report(139,'HTML') from dual;

也可以导出测试过程中的AWR报告与源系统相同时间段的AWR报告比较。

其他与回放相关的信息,可以参考以下的系统视图:

  • DBA_WORKLOAD_CAPTURES列出所有捕获到的负载;

  • DBA_WORKLOAD_FILTERS列出所有捕获的负载定义的过滤器;

  • DBA_WORKLOAD_REPLAYS列出所有已经重演过的负载;

  • DBA_WORKLOAD_REPLAY_DIVERGENCE列出所有分歧调用;

  • DBA_WORKLOAD_REPLAY_FILTER_SET列出所有重演的负载定义的过滤器;

  • DBA_WORKLOAD_CONNECTION_MAP列出所有重演使用的连接串的映射信息;

  • V$WORKLOAD_REPLAY_THREAD列出当前所有重演客户端的会话信息。

小结

本客户的Oracle 11g至19c迁移工程实施,实际历时数个月,其中经历了多次不同环境的测试、迁移以及割接过程。本次测试是这个重大工程之中比较早期的一环,经过这次测试,暴露了我们在数据库参数、结构迁移、SQL代码等多个方面的问题。幸而,通过测试可以及早发现并予以早期的干预和修复,未将问题留到系统割接以后。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
DOIS 2019 DevOps国际峰会北京站来袭~
DevOps国际峰会是国内唯一的国际性DevOps技术峰会,由OSCAR 联盟指导、DevOps时代社区与高效运维社区联合主办,共邀全球80余名顶级专家畅谈DevOps体系与方法、过程与实践、工具与技术。会议召开时间:2019070508:00至2019070618:00结束会议召开地点:北京主办单位:DevOps
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这