写点什么

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

  • 2020-07-28
  • 本文字数:4115 字

    阅读完需:约 14 分钟

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

本文由 dbaplus 社群授权转载。

背景

某客户的核心系统数据库一直是 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 sysdbaSQL> 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)开启捕捉


BEGINDBMS_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;
复制代码



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 即可。


映射后:



4)准备回放


exec dbms_workload_replay.prepare_replay(synchronization=>FALSE);
复制代码



我们这里使用了默认的参数,如果需要加大或减少回放的压力,可以适当配置 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
复制代码



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


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


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


参考脚本如下:


for ((i=1;i<=30;i++)) donohup 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 代码等多个方面的问题。幸而,通过测试可以及早发现并予以早期的干预和修复,未将问题留到系统割接以后。


作者介绍


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


原文链接


https://mp.weixin.qq.com/s?__biz=MzI4NTA1MDEwNg==&mid=2650792246&idx=2&sn=6ed285a7024827895ab5fa9671bfe017&chksm=f3f954a3c48eddb572eec6a2f725fc4333a1d088c0f79d5f9b416778448d568df2737fbdb900&scene=27#wechat_redirect


2020-07-28 10:031821

评论

发布
暂无评论
发现更多内容

Guide to UUID in Java

OutOfMemory1024

Java

低开销获取时间戳

捉虫大师

Java

Zip和7-zip谁更强,如何选择?

麦洛

ZIP格式 ZIP zip4j

低代码真能做到“让人人都能做开发者”吗?

优秀

低代码

微服务架构核心基础讲解

麦洛

微服务

Ubuntu 20.04 启用休眠(Hibernate)配置过程

OutOfMemory1024

Ubuntu20.04

专访阿里巴巴研究员吴翰清 | 安全的持续运营之道

架构精进之路

4月日更 调查采访能力考核 人物访谈

TO B产品从0到1:从项目中走出来

菜根老谭

产品孵化

话题讨论|To B & To G,互联网公司的下一主战场

程序员架构进阶

话题讨论 28天写作 4月日更 To B业务 领域思考

基于mysqldump聊一聊MySQL的备份和恢复

麦洛

MySQL MySQL 运维 数据备份

轻松搞定XML和对象之间的互转,就它了!

麦洛

xml XStream

如何打造更为精准的个性化推荐?Amazon Personalize 有独门技术秘籍!

亚马逊云科技 (Amazon Web Services)

如何从零开始学Python:(5)如何处理列表中嵌套多个列表?

广之巅

Python 4月日更

Go Channel

escray

学习 极客时间 Go 语言 4月日更

Linux nslookup 命令

一个大红包

Linux linux命令 4月日更

警惕数据泄露!快给你的数据加上安全密钥!

亚马逊云科技 (Amazon Web Services)

JVM 读书笔记(一) 内存划分

U2647

JVM 4月日更

专访前美篇首席架构师张超|从工程师到CTO的蜕变

Aldeo

程序员 采访 调查采访能力考核

架构师实战营 模块一总结

代廉洁

架构实战营

Linux OOM Killer

OutOfMemory1024

Linux

运动的这两个价值,你知道吗?|靠谱点评

无量靠谱

独家对话阿里云函数计算负责人不瞋:你所不知道的 Serverless

阿里巴巴云原生

Serverless 容器 微服务 开发者 云原生

如何缓解低代码开发的安全风险

YonBuilder低代码开发平台

小程序云开发 开发者 低代码 APP开发 APICloud

如何批评下属?

石云升

团队建设 28天写作 职场经验 管理经验 4月日更

Open Source Load Testing Tool Review 2020

OutOfMemory1024

Load Testing Open Source

云洲链硬核支撑!济南标识解析二级节点解析量全国第一

云计算

采访彩食鲜 CTO乔新亮:程序员如何持续的登上新台阶

风翱

4月日更 采访提纲

Redis - 跳表以及其内部结构

insight

redis 4月日更

乘“云”加速疾病诊断研发,亚马逊云科技新阶段“诊断开发计划”已开启!

亚马逊云科技 (Amazon Web Services)

不惧业务规模与复杂性,实现敏捷的云转型“三步走”就对了 | 云途专栏

亚马逊云科技 (Amazon Web Services)

百度南渡,护航泉州水务的产业智能化征程

脑极体

Oracle 19c迁移前,做好RAT回放测试有多重要?_软件工程_dbaplus社群_InfoQ精选文章