分类:
2008-10-16 19:10:00
数据库11gR1新的数据库重放(DBR)功能允许 DBA从一个Oracle 10gR2环境捕获负载,然后在Oracle 11gR1环境中重放这个负载,以分析如何将现有数据库迁移到新版本,并分析对系统整体性能的影响。这是本系列最后一篇文章,将描述如何使用这些特性从现有的Oracle 10gR2单实例数据库环境捕获并预处理负载,然后在一个Oracle 11gR1 RAC环境中重放同样的负载。这给Oracle DBA提供了一个史无前例的机会标识出在迁移到RAC环境时任何潜在的性能瓶颈。
前面的文章描写的是一个相对简单的场景:如何在当前运行Oracle 11g生产环境中(p+0)捕获一个模拟的应用程序负载,然后在相同的p+1环境重放,这篇文章处理稍微更有难度一点的任务,因为:
从一个单实例Oracle 10gR2数据库捕获和记录应用程序负载,包括对应的自动工作负载信息库(AWR)数据。
将模拟负载转移到Oracle 11gR1 RAC环境。
预处理负载,包括重新映射到不同负载均衡服务的连接。
在Oracle 11gR1 RAC测试环境中重放负载。
标识应用程序性能问题,数据分歧和错误分歧。
我将使用Oracle 11gR1提供的PL/SQL包DBMS_WORKLOAD_CAPTURE和DBMS_WORKLOAD_REPLAY来完整这些任务。
第一阶段:录制一个单实例环境下的负载
为了使捕获和重放情景简单 —— 同时因为我痛恨浪费任何有用的东西 —— 我将使用前面文章中使用的PL/SQL对象来完成在单实例Oracle 10gR2上的负载捕获,因为捕获负载要求最低的Oracle10gR2版本是10.2.0.4,首先我使用数据库升级助手(DBUA)将现有数据库(名叫DB10G)升级到10.2.0.4,在我的Oracle 10gR2生产环境中花了30分钟来升级,中间很顺利。
然后我执行同样的脚本和PL/SQL代码创建并启动一个合适的环境用于捕获负载。(具体脚本和代码请参考本系列前面的文章)
准备捕获负载:现在我们的源数据库环境已经就绪了,我将启动一个真实的负载捕获,Listing 3.1(见附件)显示了我如何使用过程DBMS_WORKLOAD_CAPTURE.ADD_FILTER应用一些过滤器来排除那些产生“不感兴趣”活动的用户会话以及在捕获过程中可以忽略的会话,在本例中,我比想捕获EM控制台自身的活动。
开始捕获:Listing 3.2(见附件)显示了我是如何使用过程DBMS_WORKLOAD_CAPTURE.START_CAPTURE启动负载捕获的,这个存储过程首先检查目标目录(DBRCONTROL)中是否有以前执行负载捕获的文件,如果有,它会返回一个错误,并且不允许捕获继续,然而,只要捕获启动成功,DB10G数据库的警报日志将会识别出一个DBR捕获操作正在进行:
. . . |
因为我正在一个Oracle 10gR2数据库上捕获,在开始捕获前,我将动态初始化参数PRE_11G_ENABLE_CAPTURE设置为TRUE.生成负载:为了模拟不同用户相似代码的并行执行,我准备一个shell脚本(10gSI_RandomLoadGenerator.sh),它与本系列前面文章中的shell脚本类似,它启动大约80个用户会话随机执行一些简单的CPU密集型计算的查询,在AP方案上生成复杂的查询,执行往AP方案表中插入几千行数据的DML操作。
同时,我将DB10G数据库配置为只使用一个服务名(DB10G),不考虑操作的类型,并且在我的TNSNAMES.ORA配置文件中添加了这个服务名。(在后面的步骤中,在Oracle 11gR1 RAC环境中我将描述如何使用DBMS_WORKLOAD_REPLAY.REMAP_CONNECTION重新映射这个连接到不同的服务名)
暂停负载捕获:为了暂停捕获,我执行存储过程DBMS_WORKLOAD_CAPTURE.FINISH_CAPTURE停止负载捕获操作(参考Listing 3.3,见附件),注意DBR捕获成功的结论也会记录在数据库DB10G的警报日志中:
. . . |
查看捕获结果:为了查看负载捕获真实的结果,我执行存储过程DBMS_WORKLOAD_CAPTURE.REPORT生成一个摘要报告(参考Listing 3.4,见附件),这个报告的输出文本格式请查看Report 3.1(见附件)或HTML格式()。
[1]