《Oracle 11g数据库:数据库重放.docx》由会员分享,可在线阅读,更多相关《Oracle 11g数据库:数据库重放.docx(42页珍藏版)》请在三一办公上搜索。
1、Oracle DBA很早就盼望能够在生产环境中捕获应用程序的负载,然后通过在测试环境中重放捕获的负载来判断数据库或应用程序的改动对数据库性能的影响,Oracle 11g数据库新的数据库重放特性使DBA可以捕获,处理负载,然后有选择性地或跨大范围的数据库环境和平台全部重放,本文为在日益不稳定的数据库环境中使用Oracle 11g数据库重放有效地快速预报应用程序的改变对性能的影响提供一个入门。 如果我在IT行业这几年教会了我一切,那它是继墨菲定律(凡事只要有可能出错,那就一定会出错)之后的又一真理了,过去的几年里,我认 识到了多个墨菲定律推论的正确性,包括“替代的零件往往不能代用”及特别是“墨菲实
2、际上是一个乐观主义者”的回答,我希望有一天我自己的推论也能通过长期 的观察被添加到这些严格的定律中,我的推论就是:“没有东西能够象在测试环境那样在生产环境中运转”。Oracle DBA面临一个严峻的挑战:如何准确预报下一组对数据库或应用程序,甚至是硬件配置的改动对整个数据库环境产生的负面影响。这里所说的整个环境字面上的意思是:任何应用程序运行时执行的每一条SQL语句,不管它仅仅是一个简单的查询语句还是包括大量DML语句的批处理作业,都必须捕获。这个挑战目前变得更加尖锐,因为当前的应用程序负载大都是跨多个技术产生的:N层应用程序服务器、web farms、甚至传统的客户端/服务器模式应用程序。况
3、且,当某个应用程序执行速度慢下来时,要跟踪追捕检查性能下降的根本原因几乎不可能的。它可能是因不正确的网络配置、不正确的应用程序服务器配置、甚至可能是因为应用程序客户端环境变量设置不正确引起的。目前实现这个艰巨的目标唯一的选择是“捕获/重放”应用程序负载产品套件,这类应用程序是专门设计用于捕获当前生产环境数据库已经执行过的完整负载(p+0),然后重放该负载(p+1)。然而,以我多年的经验看来,这意味着公司要尽早购买第三方较昂贵的解决方案(如HP的LoadRunner工具)。软件的许可成本和服务器的配置成本需要集中精力考虑,特别是人力资源配置的考虑,可能在捕获/重放负载开始之前很容易就会达到六位数
4、美金的投入了。这就是为什么许多IT机构放弃了这个想法,因为测试应用程序性能倒退的成本因素使其变得不太可能。性能倒退之外的因素我之前写的关于Oracle 11g新的SQL语句性能调试特性:SQL性能分析器(SPA)和SQL计划管理器(SPM)已经讨论过Oracle 11g是如何让DBA定位因应用程序环境改变引起的性能提升、保持原样、性能倒退的SQL语句的,所有捕获/重放工具都必须要能捕获并能比较源(p+0) 和未来(p+1)系统、应用程序、数据库性能统计,特别是当前性能较低的SQL语句。但这里我还要提出另外两个需要标记的回归类型:错误回归:在 重放捕获的负载时,常常会遇到错误,事实上这个错误几乎
5、就是一个想要的结果,例如:我想校验一个预期中的异常,如违背引用完整性(如主键、外键、唯一键、 CHECK、NOT NULL约束)出现时能被正确地捕获,同时,我还希望有违背重要的事务规则的情况出现能被捕获到,如在检查职员工资单时发现基本工资与总工资扣除所有费用 后不平衡的情况,我希望这种异常能被当作错误一样被捕获到。因此,任何强大的捕获/重放工具都必须能够监视下面三种类型的错误回归:所有预期的错误都发生了吗?有不是预期的错误状态出现吗?很显然,这表明严格的因系统或应用程序改变的错误回归是可能的。预期的错误有没有出现的吗?这种情况更复杂了,因为这表明在系统或应用程序内某些不祥的事情已经发送变化了,
6、也可能是重要的事务规则被滥用或没有应用到所有事务上。数据回归:所有捕获/重放工具在重放完成后,如果数据本身出现了差异还必须发出提醒信号,例如,在测试一个关键任务的金融系统时,我必须确保相同的 金融业务安装合理的顺序完成,在p+1环境所有帐户总和都应该象p+0环境中达到平衡,如果结果不一样,我必须考虑在我的应用程序、数据库或环境中是什么 改变导致了重放不精确的情况出现。捕获和重放套件的另一个关键特性是:在p+1环境上重放捕获的负载前,必须确保负载捕获启动时P+0环境被复位,否则可能会误诊为数据回归,而实际上应用程序,数据库和环境都没有发送任何改变。从属的事务需要捕获并重放,这好比钢琴家演奏完一段
7、曲子后,磁带记录不仅记录了记录信息,还记录了每个按键被按下的频率信息,本质上,它给听众提供 了一份艺术大师演奏风格的精确复本,包括所有复杂的演奏停顿(对于小于25岁的年轻读者而言,可能没有看到过钢琴演奏磁带,可以用mp3或wav文件替 换,或询问一下年长的同事当年听磁带的事情。)数据库重放:功能摘要感谢Oracle 11g新的数据库重放(DBR)套件为我们提供了所有讨论到的功能,DBR允许允许DBA:捕获在生产系统上产生的负载,这包括跨多个会话同时收集所有依赖的事务时捕获并行执行的相同SQL语句的能力。捕获的数据在测试系统上执行前先要做一些处理,这允许DBA调整负载重放的频率,以及重新映射到不
8、同用户会话,不同服务的连接,或-在Oracle 11g RAC测试系统中重放时,是一个或多个数据库实例。在测试系统上重放捕获的经过处理过的负载,测试系统的配置符合p+1配置的要求,因此DBA可以准确地判断任何系统改变(包括应用程序改变,软件补丁,甚至硬件升级)对负载的影响,测试系统可以是测试或QA数据库环境,也可以是一个快照备用数据库(关于备用数据库后面的文章有更多的说明)。执行回归分析突出p+0和p+1模拟负载之间的差异,DBR会自动识别和分析错误回归,数据回归和SQL语句回归的向量。数据库重放的美妙之处是它消除了创建执行回归分析的模拟负载的必要性,相反,DBA可以准确地执行记录下来的SQL
9、语句,因此这倾向于提供更准确的 系统回归实况录像,因为其他外部因素(如网络等待时间)减少了或没有了,所有记录下来的SQL语句组成了重放的负载,实际上看起来几乎不会出现无用的或很 少执行的代码,这些代码可能会被忽略,如果应用程序是在一个RAC集群数据库环境中的话这是很关键的。本文接下来的4小节提供了数据库重放功能的高级入门指南,实现它们的通用目标:在从p+0到p+1迁移一个生产系统时准确判断需要回归到什么程度,本系列后面的文章中,我会介绍如何利用数据库重放功能捕获、预处理、重放和分析重放结果。第一步:录制负载Oracle 11g企业管理数据库控制台提供了一个非常直观的管理数据库重放功能的接口,如
10、启用负载捕获,预处理,回归分析等,每一步它都提供了良好的状态反馈信息,图1显示了初始的数据库重放控制台界面:(点击查看大图)图1:数据库重放控制台主界面这一步看到的全部负载就是对生产数据库捕获和录制的内容,DBA只需要保证在生产系统上有足够的负载,DBR做了其他所有事情(捕获所有外部客户端发起执行的SQL语句),这包括:SQL查询,DML语句和DDL语句。PL/SQL块和远程过程调用(RPCs)。对象导航请求和OCI调用。注意DBS捕获操作执行过程中,Oracle 11g不会停止任何后台运行中的作业,所有内部客户端也可以继续产生请求。DBR通过一系列影子进程记录负载,这些影子进程过滤出必要的信
11、息准确地复制系统负载,最后将这些元数据写入一系列XML文件,后面重放时就是使用的这些XML文件,Oracle 11g DBA只需要关心文件系统上是否有足够的存储空间来重放这些XML文件。第二步:“整理”负载当DBR负载录制完毕后,在重放前,总是需要对其进行一些细微的调整。例如:重新映射外部客户端的连接,以便在p+1环境中能准确地重放,在这一步中,DBR为它最后重放准备具体的元数据,所有影响重放结果的参数也是在这一步进行修改的。在相同数据库版本上重放时这个预处理过程必须存在,当只要数据库版本匹配,就可以在一个生产、测试或其他数据库系统上执行擦除操作,实际上,Oracle强烈建议在一个非生产服务器
12、上执行这个元数据的“整理”操作,以不影响生产服务器的性能或健康为宜。第三步:重放负载负载已经整理好了,可以启动重放操作了,完成元数据擦除后,选定的DBR重放客户端就可以随需重放负载了。复位测试环境:在启动重放前,DBA首先必须复位用于测试的目标数据库和主机环境,因为在应用改变前,测试服务器的关键部位需要与生产服务器匹配,否则,可能引发非预期的回归,幸运的是,随Oracle 10g数 据库出现的闪回数据库(FLASHBACK DATABASE)特性帮助我们简单完成这个任务,其他可选的包括通过RMAN恢复到一个时间点,或使用数据泵导出导入,一旦测试环境正确地复位完毕,接 下来,DBA应用所有的改变
13、到测试服务器上的生产系统,使其现在的状态变为p+1,然后传送前面捕获的负载给这个p+1服务器。通过重放驱动重放负载:当在p+1服务器上最后一次重放前面捕获的负载时,一个叫做重放驱动的应用程序向目标数据库系统发送请求,因为重放驱动是客 户端不可知论的,对Oracle 11g而言最初发送请求的客户端类型是没有区别的,重放驱动消灭了录制的负载和向p+1系统发送请求的过程,就象是外部客户端发送的请求一样。因为它将在所有重放客户端之间分配所有的负载捕获流,重放驱动可能会考虑网络带宽、cpu和内存容量,重放驱动也可能充分利用重新映射连接字串,使它们建立起一对一(如单实例到单实例)或多对一(如单节点到多个R
14、AC节点)的关系,意味着连接负载均衡可能需要考虑,同样重要的是,重放驱动会忽略最初由外部客户端产生的活动(如EM数据库控制),不会重放这种活动,同时,它还会忽略通过数据库连接连接到外部数据库或访问目录对象的活动记录。另一个使用数据库重放吸引人的优点是:可以同步模式或异步模式重放捕获的负载。在同步模式下,每一个事务都按照录制时的顺序准确地重放,然而, DBR也可以异步重放负载,如不考虑事务的同步性,因此可以产生比录制时更大的负载,这在试图执行一个“测试到破坏”新的或修改过的数据库环境时特别有 用。DBR负载重放的范围:Oracle 11gR1数据库重放功能可以准确地评估下面几类对数据库环境的改变
15、。数据库升级数据库打补丁改变数据库模式改变初始化参数修改一个或多个RAC节点及其内连配置操作系统平台的概念,包括从32位转移到64位改变服务器内存或cpu配置改变数据库的存储配置,包括在文件系统(如ext3,ntfs)、ASM存储、和/或RAW存储之间迁移数据库文件DBR负载重放限制:数据库重放模拟能力有一些显着的(且合理的)限制:SQL*Loader直接路径装入不能重放,常规路径SQL*Loader操作可以重放导入导出操作,不管是通过传统的方式还是数据泵的方式,都不能重放Oracle共享服务器会话不能跟踪闪回数据库恢复和Flashback查询操作不能重放Oracle数据流,包括非基于PL/S
16、QL的高级查询,不能重放分布式事务处理,包括远程COMMIT操作,只能当作本地事务重放基于Oracle调用接口(OCI)对象导航不能重放对于大多数部分,这些限制有意义,例如:闪回数据库本质上是一个不完全的数据库恢复操作,因此它不是正常事务处理的范畴,我也不会考虑它是否会使性能倒退,虽然限制对于共享服务器会话有意义,但仍然有一些数据库是使用共享服务器作为连接池的,因此这是一个小小的遗憾。第四步:回归分析负载重放完毕后,数据库重放将提供多个有关在p+1环境和p+0环境下负载性能不同的分析,正如我在本文最前面提到的,任何好的回归测试套件都有能力捕获和分析性能回归、数据回归和错误回归,DBR在这些方面
17、没有让我们失望。例如:DBR能够通过它的一套捕获重放报告立即检测到任何性能差异,通过这些报告,可以下钻到存储在ADDM(自动数据库诊断监视器)、AWR(自动负载仓库)和活动会话历史(ASH)报告中更详细的分析。无论问题出自哪里,DBR都能识别并处理下列两种类型的问题:联机问题象征DBR可能做了一些误操作,应该先暂停,否则重放的结果变得没什么意义脱机问题实际上是数据库重放操作成功的预期结果,这种类型的问题通常是在重放操作结束后被检测到的下一步理论知识具备了,在本系列的下一篇文章中,我将阐述:在Oracle 11gR1数据库单实例上捕获一个简单的负载预处理捕获的负载在一个双节点的Oracle 11
18、gR1 RAC集群数据库上重放预处理过的负载标识出在转移到类型目标环境过程中可能出现的问题Oracle 11gR1提供了捕获生产环境中应用程序的负载,并在测试环境中重放负载的能力,利用这种技术判断当对系统、数据库或应用程序修改后在性能方面的影响有多大,在本文中,我将描述Oracle 11g数据库重放功能如何从当前的生产数据库中(p+0环境)捕获和准备负载,以及如何在一个Oracle 11g测试环境(作为下一个p+1数据库系统)重放相同的负载,这种技术使Oracle DBA有机会分析和隔离对性能有害的改变。 这篇文章主要集中讲述如何:从一个Oracle 11g数据库捕获一个真实的负载捕获对应的自
19、动负载仓库(AWR)数据为最后的负载重放准备测试数据库环境传输生产环境配置到测试环境预处理生产负载在测试系统上重放负载分析发现的任何性能问题和分歧模拟应用程序环境本文中关于我的测试环境有一点需要说明:为了简化过程,捕获和重放操作都使用相同的数据库。我使用的是最基本的Oracle 11g种子数据库和默认安装的样本方案。数据库将运行在带闪回日志功能的ARCHIVELOG模式下,以便需要重放时可以快速地利用FLASHBACK DATABASE命令回退到某个初始点。第一阶段:录制负载为了建立一个捕获/重放情景,我建立了一个新用户、表、索引和相关的PL/SQL对象:一个新用户ADMIN,它将被用作存储所
20、有管理对象的一个仓库,同时,我还创建了一个表存储主键的值。创建该用户和表的代码请参考附件A:ADMINSetup.sql。PL/SQL包ADMIN.PKG_SEQUENCING控制指定新的主键值,该包的说明参考附件B:pkg_sequencing.spc,该包最初的版本内容参考附件C:pkg_sequencing_v1.bdy。另一个用户AP,它将封装一个帐户支付系统的方案,包括新的表AP.VENDORS,AP.INVOICES和AP.INVOICE_ITEMS,创建这个方案及其相关的对象脚本参考附件D:APSetup.sql。为了填充AP方案的对象,我创建了一个包AP.PKG_LOAD_GE
21、NERATOR,它的说明文件和主体文件分别参考附件E:pkg_load_generator.spc和附件F:pkg_load_generator.bdy。最后,APInitialization.sql中的代码用几百行模拟数据填充了表AP.VENDORS,并在表AP.INVOICES中创建了 25条发票记录,在表AP.INVOICE_ITEMS中创建了与之对应的发票详细信息条目,收集了ADMIN和AP方案下所有对象的原始统计信息,它还 创建了一个目录对象DBRControl,用于数据库重放时存储结果脚本和捕获负载期间产生的XML文件。建立一个负载捕获至此,我们的源数据库环境初始化好了,我将启动一
22、个真实的负载捕获,下面的图2.1.1显示了数据库重放的初始窗口,它是通过访问EM数据库控制软件的【软件和支持】标签上的【真正应用程序测试】小节下的【数据库链接】得到的。点击查看大图(点击查看大图)图2.1.1:负载捕获设置:初始化界面如果我选择了第一个任务,在我的捕获会话执行前必须先确认所有在检查列表中列出的先决条件都已具备才行。点击查看大图(点击查看大图)图2.1.2:负载捕获设置:计划环境检查列表接下来的界面让我选择在正式捕获负载之前是否重启数据库,并过滤不需要的会话活动(如EM本身),注意我会按照Oracle 11g的最佳实践建议“清除捕获”:我会接受EM的建议停止并重启数据库以建立一个
23、有效的捕获启动时间。点击查看大图(点击查看大图)图2.1.3:负载捕获设置:选项接下来的界面显示的是给捕获会话命名和指定存储重放脚本的目录。点击查看大图(点击查看大图)图2.1.4:负载捕获设置:设置参数接下来要求为任务调度命名,图2.1.5和图2.1.6显示了最终的任务确认设置界面。点击查看大图(点击查看大图)图2.1.5:负载捕获设置:指定EM任务名点击查看大图(点击查看大图)图2.1.6:负载捕获设置:最终的任务视图最后,Oracle 11g请求最后一次确认。点击查看大图(点击查看大图)图2.1.7:负载捕获设置:任务提交捕获就启动了,只要Oracle 11g显示这个屏幕,它实际上是等我
24、再次在源数据库上启动代表性的负载。捕获一个真实的负载为了通过不同用户模拟相似代码的并行执行过程,我准备了一个简单的shell脚本(参考附录G:RandomLoadGenerator.sh),它做一些CPU密 集型计算的简单查询,在AP方案上产生的查询,同时在AP方案的表中插入上千行记录,我已经将我的源数据库环境配置为使用多个服务名,每一个对应一种用 户,内容参考附录H:SI_Services_tnsnames.ora,我将这些服务名添加到我的数据库配置文件TNSNAMES.ORA中作为可选的 连接别名。我在我的p+0数据库环境中启动了这个负载,执行完毕后,我回到EM数据库控制台查看执行的结果,
25、如图2.2.1所示,然后点击“停止捕获”按钮结束负载捕获。点击查看大图(点击查看大图)图2.2.1:负载捕获:回顾捕获任务状态这时,Oracle 11g会要求你确认是否结束捕获过程,并显示一个计时表直到捕获完成。点击查看大图(点击查看大图)图2.2.2:负载捕获:确定终止捕获点击查看大图(点击查看大图)图2.2.3:负载捕获:结束捕获当终止捕获后,Oracle 11g会询问是否捕获录制的负载对应的自动负载仓库(AWR)数据,如图2.2.4所示,我选择了捕获所有有关的AWR快照,以便于后面进行报告对比。点击查看大图(点击查看大图)图2.2.4:负载捕获:请求生成AWR快照一旦捕获结束,就可以查看
26、捕获结果看捕获是否成功,以及是否包含了足够的数据,如果发现数据不足,FLASHBACK DATABASE命令允许我回到捕获开始前的数据库状态再重新开始捕获,我也选择了“查看负载捕获报告”按钮生成一个完整的数据库捕获报告(报告链接: 第二阶段:准备重放尽管在p+0数据库环境中成功完成了一个足够的数据库负载捕获,当在p+1环境中重放负载之前还有许多事情要做。复位p+0环境因为我的源和目标环境是同一个数据库,因此首先我需要将环境复位到捕获负载之前的状态,我的数据库工作在闪回日志模式,因此我只需要使用FLASHBACK DATABASE命令将其回退到初始状态:$ rman target /RMAN s
27、hutdown immediate;RMAN startup mount;RMAN reset database to incarnation 6;RMAN flashback database to scn= 4162947;转移到p+1环境接下来,我要做的是应用必要的改变,将我的数据库环境转到p+1状态,简单说明一下,我将做两个改变,它们对p+1环境的性能有显着的影响:对存储过程ADMIN.PKG_SEQUENCING.NEXT_ID做了特殊处理,使用序列代替了表ADMIN.NEXT_IDS来确定 AP方案中表的下一个主键值,这应该会显着提升存储过程AP.PKG_LOAD_GENERATO
28、R.RANDOMDML的性能,在重放过程中,它在 AP.INVOICES和AP.INVOICE_ITEMS表中创建随机数据项目。删除了在AP.INVOICES.CUSTOMER_ID上的索引,并重新计算了AP方案的统计数值,因为存储过程 AP.PKG_LOAD_GENERATOR.RANDOMQUERY在视图AP.RV_INVOICE_DETAILS上产生随机查询时经常使用这个索 引高效地选择行,在重放时应该看到性能会如预期那样显着回退。“整理”负载至此,我的p+1工作环境搭建好了,可以开始为重放做一下负载预处理了,再说一次,我会使用EM数据库控制台启动预处理序列,图2.3.1显示了从“数据库
29、重放”面板选择了“预处理负载”后的结果。点击查看大图(点击查看大图)图2.3.1:预处理捕获的负载:选择一个捕获的负载当我选择了想要的负载后,Oracle 11g会提醒我是在同一个数据库版本上进行数据库重放.点击查看大图(点击查看大图)图2.3.2:预处理捕获的负载:数据库版本警告然后启动一个新的EM调度任务完成预处理。点击查看大图(点击查看大图)图2.3.3:预处理捕获的工作量:调度预处理任务Oracle 11g提示要进行最后的确认,以提交调度任务,然后开始执行。点击查看大图(点击查看大图)图2.3.4:预处理捕获的负载:最后确认第三阶段:重放负载因为我的目标数据库已经复位到捕获负载之前的状
30、态了,并且我所有的p+1改动现在已经准备就绪,至少我已经准备好负载重放了,我将使用EM控制台进行重放,如图2.4.1所示:点击查看大图(点击查看大图)图2.4.1:负载重放:起点我选择了一个包含有捕获负载文件的目录后,Oracle 11g会确认我已经检查过成功重放所要求的先决条件,包括处理之前需要解决的外部引用(如外部文件和外部目录),如图2.4.2和2.4.3所示: 点击查看大图(点击查看大图)图2.4.2:负载重放:确认先决条件点击查看大图(点击查看大图)图2.4.3:负载重放:确认对外部系统的引用一旦所有的先决条件都得到确认了,可以开始真实地执行重放任务了,图2.4.4显示了我设置的关于
31、这个任务的基本信息:点击查看大图(点击查看大图)图2.4.4:负载重放:设置重放任务图2.4.5显示我重新映射当前的连接以便重放时也可以使用它。点击查看大图(点击查看大图)图2.4.5:负载重放:设置连接字符串正如我在数据库重放入门那篇文章中描述的,Oracle 11g允许我改变重放负载的频率,为了保持简洁,我选择了默认的选项,如图2.4.6所示:点击查看大图(点击查看大图)图2.4.6:负载重放:自定义重放选项现在可以启动负载重放客户端(WRC)开始重放之前捕获的负载了,如图2.4.7展示的那样。接下来,我用适当的参数启动WRC,然后返回这个屏幕选择“下一步”按钮开始自动重放负载。点击查看大
32、图(点击查看大图)图2.4.7:负载重放:启动负载重放客户端我将打开一个终端启动重放会话,启动WRC客户端执行,注意在开始之前,我将当前的工作目录修改为/home/oracle/DBRControl。$ wrc system/oracleorcl mode=replay replaydir=.Workload Replay Client: Release 11.1.0.6.0 - Production on Thu May 22 19:28:59 2008Copyright (c) 1982, 2007, Oracle. All rights reserved.Wait for the rep
33、lay to start (19:28:59).回到EM数据库控制台,我只需要点击“下一步”按钮,Oracle11g会回答我所有活动的数据库重放操作都在控制之中。点击查看大图(点击查看大图)图2.4.8:负载重放:控制重放操作同时也反应到终端会话本身中了:Wait for the replay to start (19:28:59).Replay started (19:31:17)返回EM数据库控制台,数据库重放操作始终都被监视着。 点击查看大图(点击查看大图)图2.4.9:负载重放:监视活动的重放操作直到重放操作完成。 Wait for the replay to start (19:28
34、:59).Replay started (19:31:17)Replay finished (19:37:02)点击查看大图(点击查看大图)图2.4.10:负载重放:完成的重放操作第四阶段:回归分析Oracle 11g给我们提供了许多用于对比捕获的与重放的负载,如图2.5.1和2.5.2所示,重放操作成功执行完毕后会提供大部分对比结果:点击查看大图(点击查看大图)图2.5.1:重放回归分析(一)点击查看大图(点击查看大图)图2.5.2:重放回归分析(二)正如这些图示,我对数据库对象所做的改动产生了正面的影响,因为执行捕获的负载的时间比重放同一负载的时间要长得多,同时表明对系统的修改明显增加 了
35、数据库的吞吐量,最值得注意的是这里没有产生有害的影响,这从图2.5.2中很容易看出来,因为在产生的数据之间绝对没有分歧,也没有异常错误产生。报告分析最后,数据库重放提供了多个HTML格式的报告用于分析执行完毕的重放操作结果。DB Replay Report这个报告比较捕获负载和重放负载的执行过程,它查找任何可能的数据或错误回归的源。AWR Report这个报告提供自动工作负载信息库(AWR)报告,它简要地分析了在重放操作开始到结束这段时间周期内的数据库的整体性能。ASH Report它通过查看在重放期间的活动会话历史记录(ASH)的内容,找出对性能影响最大的SQL语句和等待事件。Oracle数
36、据库11gR1新的数据库重放(DBR)功能允许Oracle DBA从一个Oracle 10gR2环境捕获负载,然后在Oracle 11gR1环境中重放这个负载,以分析如何将现有数据库迁移到新版本,并分析对系统整体性能的影响。这是本系列最后一篇文章,将描述如何使用这些特性从现有的Oracle 10gR2单实例数据库环境捕获并预处理负载,然后在一个Oracle 11gR1 RAC测试环境中重放同样的负载。这给Oracle DBA提供了一个史无前例的机会标识出在迁移到RAC环境时任何潜在的性能瓶颈。 前面的文章描写的是一个相对简单的场景:如何在当前运行Oracle 11g生产环境中(p+0)捕获一个
37、模拟的应用程序负载,然后在相同的p+1环境重放,这篇文章处理稍微更有难度一点的任务,因为:从一个单实例Oracle 10gR2数据库捕获和记录应用程序负载,包括对应的自动工作负载信息库(AWR)数据。将模拟负载转移到Oracle 11gR1 RAC测试环境。预处理负载,包括重新映射到不同负载均衡服务的连接。在Oracle 11gR1 RAC测试环境中重放负载。标识应用程序性能问题,数据分歧和错误分歧。我将使用Oracle 11gR1提供的PL/SQL包DBMS_WORKLOAD_CAPTURE和DBMS_WORKLOAD_REPLAY来完整这些任务。第一阶段:录制一个单实例环境下的负载为了使捕
38、获和重放情景简单 - 同时因为我痛恨浪费任何有用的东西 - 我将使用前面文章中使用的PL/SQL对象来完成在单实例Oracle 10gR2上的负载捕获,因为捕获负载要求最低的Oracle10gR2版本是10.2.0.4,首先我使用数据库升级助手(DBUA)将现有数据库(名 叫DB10G)升级到10.2.0.4,在我的Oracle 10gR2生产环境中花了30分钟来升级,中间很顺利。然后我执行同样的脚本和PL/SQL代码创建并启动一个合适的环境用于捕获负载。(具体脚本和代码请参考本系列前面的文章)准备捕获负载: 现在我们的源数据库环境已经就绪了,我将启动一个真实的负载捕获,Listing 3.1
39、(见附件)显示了我如何使用存储过程DBMS_WORKLOAD_CAPTURE.ADD_FILTER应用一些过滤器来排除那些产生“不感兴趣” 活动的用户会话以及在捕获过程中可以忽略的会话,在本例中,我比想捕获EM控制台自身的活动。开始捕获:Listing 3.2(见附件)显示了我是如何使用存储过程DBMS_WORKLOAD_CAPTURE.START_CAPTURE启动负载捕获的,这个存储过程首先 检查目标目录(DBRCONTROL)中是否有以前执行负载捕获的文件,如果有,它会返回一个错误,并且不允许捕获继续,然而,只要捕获启动成功, DB10G数据库的警报日志将会识别出一个DBR捕获操作正在进
40、行:. . .Mon Jun 23 19:40:41 2008ALTER SYSTEM SET pre_11g_enable_capture=TRUE SCOPE=BOTH;Mon Jun 23 19:40:44 2008DBMS_WORKLOAD_CAPTURE.START_CAPTURE(): Starting database capture at 06/23/2008 19:40:44. . . 因为我正在一个Oracle 10gR2数据库上捕获,在开始捕获前,我将动态初始化参数PRE_11G_ENABLE_CAPTURE设置为TRUE。生成负载:为了模拟不同用户相似代码的并行执行,我
41、准备一个shell脚本(10gSI_RandomLoadGenerator.sh),它与本系列前面文章中的shell脚本类似,它启动大约80个用户会话随机执行一些简单的CPU密集型计算的查询,在AP方案上生成复杂的查询,执行往AP方案表中插入几千行数据的DML操作。同时,我将DB10G数据库配置为 只使用一个服务名(DB10G),不考虑操作的类型,并且在我的TNSNAMES.ORA配置文件中添加了这个服务名。(在后面的步骤中,在Oracle 11gR1 RAC环境中我将描述如何使用DBMS_WORKLOAD_REPLAY.REMAP_CONNECTION重新映射这个连接到不同的服务名)暂停负载
42、捕获:为了暂停捕获,我执行存储过程DBMS_WORKLOAD_CAPTURE.FINISH_CAPTURE停止负载捕获操作(参考Listing 3.3,见附件),注意DBR捕获成功的结论也会记录在数据库DB10G的警报日志中: . . .Mon Jun 23 19:42:21 2008Thread 1 advanced to log sequence 43 (LGWR switch)Current log# 3 seq# 43 mem# 0: /u01/app/oracle/oradata/db10g/redo03.logMon Jun 23 19:44:35 2008DBMS_WORKLOA
43、D_CAPTURE.FINISH_CAPTURE(): Stopped database capture successfully at 06/23/2008 19:44:32查看捕获结果:为了查看负载捕获真实的结果,我执行存储过程DBMS_WORKLOAD_CAPTURE.REPORT生成一个摘要报告(参考 Listing 3.4,见附件),这个报告的输出文本格式请查看Report 3.1(见附件)或HTML格式(http: /第二阶段:准备重放当我成功地完成从Oracle10gR2单实例数据库上捕获负载后,开始准备我的目标环境 - Oracle11gR1 RAC集群数据库:我配置了一个双节
44、点RAC(RACNODE1和RACNODE2),使用使用Oracle clusterware 11.1.0.6.0配置和管理集群环境。我在集群中每个节点上部署了一个Oracle 11.1.0.6.0 ASM实例,在共享磁盘存储上为数据库文件创建了两个ASM磁盘组+DATA,+FRA。我使用Oracle 11gR1的标准种子数据库模板创建一个新的RAC数据库RACDB,部署了两个RAC实例RACDB1和RACDB2,每个节点上一个,通过一个监听器提供服务。我部署了一个新的RAC服务TESTLBA作为这两个节点对外提供的服务,并将连接数调整为最大,使用负载均衡顾问程序(LBA)跨这两个实例分配连接
45、以模拟一个OLTP环境,Listing 3.5(见附件)显示了srvctl命令调用DBMS_SERVICE.MODIFY_SERVICE和为TESTLBA服务配置的TNSNAMES.ORA网络配置项目。最后,我在RACDB集群数据库严格地创建了与之前在DB10G数据库上创建的一样的表,索引和PL/SQL包。然后执行APInitialization.sql脚本初始化表AP.VENDORS,AP.INVOICES和AP_INVOICE_DETAILS。准备负载:至此我的数据库重放目标环境已经就绪了,下面为在RAC环境重放做最后的准备的工作:在节点RACNODE1和RACNODE12上添加新的目录/
46、home/oracle/DBRControl。在RACDB数据库中创建一个新的目录对象DBRCONTROL,同时在每个节点上也在其物理位置创建了响应的目录,并给这个目录对象授予了合适的权限。我将在DB10G数据库上捕获负载时产生的文件分别复制到这两个节点的相同目录下了,注意也可以将这些文件只复制到其中一个节点,因为在RAC集群环境中,任何一个节点都可以管理重放负载。最后,我执行存储过程DBMS_WORKLOAD_REPLAY.PROCESS_CAPTURE为重放对先前捕获的负载做预处理工作,这个存储过程解析在DB10G数据库上的用户会话操作,为在RACDB上重放做预处理。Listing 3.6
47、(见附件)显示了我在集群节点上创建物理目录和在RACDB数据库中创建对应的目录对象的命令,以及(在将所有文件复制到合适的物理目录下后)如何 执行存储过程DBMS_WORKLOAD_REPLAY.PROCESS_CAPTURE进行负载预处理的。第三阶段:重放负载现在我的RAC数据库已经准备好可以接受执行重放先前捕获的负载了,如前面的文章谈到的那样,使用Oracle 11g EM进行重放时必须按照严格的顺序执行,调用存储过程DBMS_WORKLOAD_REPLAY执行重放时这些步骤也必须按步骤执行,重新映射所有的连接,调整所有自定义重放频率设置,收集重放性能,回归统计报表收集。 启动数据库负载重放:为了启动数据库重放,我将使用存储过程DBMS_WORKLOAD_REPLAY.INITIATE_REPLAY,它将吧 RACDB数据库置为INIT FOR REPLAY状态,是通过存