写点什么

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:031851

评论

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

公众号关联【排队助手】小程序

天天预约

小程序 工具 SaaS设计 排队

《第四期(2021-2022)传统行业云原生技术落地调研报告——央国企篇》正式发布

York

云原生 数字化转型 国企 央企

【排队助手】投屏模式-使用指南

天天预约

小程序 SaaS应用 生活服务工具 排队工具

C 语言入门(四)

逝缘~

7月月更

《Linux设备驱动开发详解》读书笔记

贾献华

7月月更

开鸿智谷 Niobe 407 正式并入OpenHarmony代码主干

科技汇

8K字详细解析实现Redis的高可用(主从、哨兵、集群)

了不起的程序猿

Java 高可用 Redis 数据结构

小程序容器技术让混合App开发效率提升

Geek_99967b

小程序容器

Web安全之Java反序列漏洞总结

网络安全学海

网络安全 安全 信息安全 渗透测试 漏洞挖掘

干货!6K字彻底弄明白ZooKeeper,面试再也不用怕了!

了不起的程序猿

Java zookeeper java程序员

StarRocks 成都见!企业如何打造极速统一的数据分析新范式,助力业务全方位升级

StarRocks

数据库 大数据 数据分析 国产数据库

如何系统进行学习web前端开发工程师技术

小谷哥

java零基础入门-继承

喵手

Java 7月月更

【云计算】企业上云后需要避免的几个错误

行云管家

云计算 企业上云 堡垒机

高效实战|航空业海量日志数据的智能化分析

云智慧AIOps社区

运维 数据分析 日志分析 日志管理 运维技术

小程序在产业互联网中的作用

Geek_99967b

小程序

你不会还在用Xshell吧?这款开源的终端工具才是yyds!

了不起的程序猿

Java 工具 java程序员 后端开发

小程序在电商中的优势

Geek_99967b

小程序

Python 入门指南之标准库浏览 – Part II

海拥(haiyong.site)

7月月更

还不了解进程吗?就这一篇!

C++后台开发

网络编程 进程 通信 linux开发 C++开发

千亿IT运维市场,来到凭「效果」说话的时代

ToB行业头条

新版网络安全等级保护测评报告模板包含哪些内容?哪里可以找到?

行云管家

等保 等保测评 等保测评报告

【排队助手】投屏模式-使用指南

天天预约

小程序 SaaS 生活服务工具 排队工具 离线提醒

焱融全闪 X NVIDIA InfiniBand:打造 AI 时代 GPU 计算的高性能存储技术

焱融科技

存储 文件存储 分布式文件存储 全闪

软件开发中的DevOps

力软低代码开发平台

新一代云原生消息队列 (二)

技术小生

pulsar Apache Pulsar 消息系统 7月月更

哪个年龄段学习web前端培训比较好

小谷哥

如何系统学习web前端技术知识

小谷哥

新书上市 | C 语言经典教材配套“习题解答”,原书累计印数 10 万 +

图灵教育

C语言

Apache Flink ML 2.1.0 发布公告

Apache Flink

机器学习 大数据 flink 流计算 实时计算

重磅发新 | 尚硅谷C4D三维设计实战教程发布

小谷哥

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