Oracle 11g数据库数据库重放.docx
《Oracle 11g数据库数据库重放.docx》由会员分享,可在线阅读,更多相关《Oracle 11g数据库数据库重放.docx(40页珍藏版)》请在冰豆网上搜索。
![Oracle 11g数据库数据库重放.docx](https://file1.bdocx.com/fileroot1/2022-12/16/c1c65de3-a1fa-4598-a044-eeefae4841f6/c1c65de3-a1fa-4598-a044-eeefae4841f61.gif)
Oracle11g数据库数据库重放
OracleDBA很早就盼望能够在生产环境中捕获应用程序的负载,然后通过在测试环境中重放捕获的负载来判断数据库或应用程序的改动对数据库性能的影响,Oracle11g数据库新的数据库重放特性使DBA可以捕获,处理负载,然后有选择性地或跨大范围的数据库环境和平台全部重放,
本文为在日益不稳定的数据库环境中使用Oracle11g数据库重放有效地快速预报应用程序的改变对性能的影响提供一个入门。
如果我在IT行业这几年教会了我一切,那它是继墨菲定律(凡事只要有可能出错,那就一定会出错)之后的又一真理了,过去的几年里,我认识到了多个墨菲定律推论的正确性,包括“替代的零件往往不能代用”及特别是“墨菲实际上是一个乐观主义者”的回答,我希望有一天我自己的推论也能通过长期的观察被添加到这些严格的定律中,我的推论就是:
“没有东西能够象在测试环境那样在生产环境中运转”。
OracleDBA面临一个严峻的挑战:
如何准确预报下一组对数据库或应用程序,甚至是硬件配置的改动对整个数据库环境产生的负面影响。
这里所说的整个环境字面上的意思是:
任何应用程序运行时执行的每一条SQL语句,不管它仅仅是一个简单的查询语句还是包括大量DML语句的批处理作业,都必须捕获。
这个挑战目前变得更加尖锐,因为当前的应用程序负载大都是跨多个技术产生的:
N层应用程序服务器、webfarms、甚至传统的客户端/服务器模式应用程序。
况且,当某个应用程序执行速度慢下来时,要跟踪追捕检查性能下降的根本原因几乎不可能的。
它可能是因不正确的网络配置、不正确的应用程序服务器配置、甚至可能是因为应用程序客户端环境变量设置不正确引起的。
目前实现这个艰巨的目标唯一的选择是“捕获/重放”应用程序负载产品套件,这类应用程序是专门设计用于捕获当前生产环境数据库已经执行过的完整负载(p+0),然后重放该负载(p+1)。
然而,以我多年的经验看来,这意味着公司要尽早购买第三方较昂贵的解决方案(如HP的LoadRunner工具)。
软件的许可成本和服务器的配置成本需要集中精力考虑,特别是人力资源配置的考虑,可能在捕获/重放负载开始之前很容易就会达到六位数美金的投入了。
这就是为什么许多IT机构放弃了这个想法,因为测试应用程序性能倒退的成本因素使其变得不太可能。
性能倒退之外的因素
我之前写的关于Oracle11g新的SQL语句性能调试特性:
SQL性能分析器(SPA)和SQL计划管理器(SPM)已经讨论过Oracle11g是如何让DBA定位因应用程序环境改变引起的性能提升、保持原样、性能倒退的SQL语句的,所有捕获/重放工具都必须要能捕获并能比较源(p+0)和未来(p+1)系统、应用程序、数据库性能统计,特别是当前性能较低的SQL语句。
但这里我还要提出另外两个需要标记的回归类型:
错误回归:
在重放捕获的负载时,常常会遇到错误,事实上这个错误几乎就是一个想要的结果,例如:
我想校验一个预期中的异常,如违背引用完整性(如主键、外键、唯一键、CHECK、NOT NULL约束)出现时能被正确地捕获,同时,我还希望有违背重要的事务规则的情况出现能被捕获到,如在检查职员工资单时发现基本工资与总工资扣除所有费用后不平衡的情况,我希望这种异常能被当作错误一样被捕获到。
因此,任何强大的捕获/重放工具都必须能够监视下面三种类型的错误回归:
所有预期的错误都发生了吗?
有不是预期的错误状态出现吗?
很显然,这表明严格的因系统或应用程序改变的错误回归是可能的。
预期的错误有没有出现的吗?
这种情况更复杂了,因为这表明在系统或应用程序内某些不祥的事情已经发送变化了,也可能是重要的事务规则被滥用或没有应用到所有事务上。
数据回归:
所有捕获/重放工具在重放完成后,如果数据本身出现了差异还必须发出提醒信号,例如,在测试一个关键任务的金融系统时,我必须确保相同的金融业务安装合理的顺序完成,在p+1环境所有帐户总和都应该象p+0环境中达到平衡,如果结果不一样,我必须考虑在我的应用程序、数据库或环境中是什么改变导致了重放不精确的情况出现。
捕获和重放套件的另一个关键特性是:
在p+1环境上重放捕获的负载前,必须确保负载捕获启动时P+0环境被复位,否则可能会误诊为数据回归,而实际上应用程序,数据库和环境都没有发送任何改变。
从属的事务需要捕获并重放,这好比钢琴家演奏完一段曲子后,磁带记录不仅记录了记录信息,还记录了每个按键被按下的频率信息,本质上,它给听众提供了一份艺术大师演奏风格的精确复本,包括所有复杂的演奏停顿(对于小于25岁的年轻读者而言,可能没有看到过钢琴演奏磁带,可以用mp3或wav文件替换,或询问一下年长的同事当年听磁带的事情。
)
数据库重放:
功能摘要
感谢Oracle11g新的数据库重放(DBR)套件为我们提供了所有讨论到的功能,DBR允许允许DBA:
捕获在生产系统上产生的负载,这包括跨多个会话同时收集所有依赖的事务时捕获并行执行的相同SQL语句的能力。
捕获的数据在测试系统上执行前先要做一些处理,这允许DBA调整负载重放的频率,以及重新映射到不同用户会话,不同服务的连接,或--在Oracle11gRAC测试系统中重放时,是一个或多个数据库实例。
在测试系统上重放捕获的经过处理过的负载,测试系统的配置符合p+1配置的要求,因此DBA可以准确地判断任何系统改变(包括应用程序改变,软件补丁,甚至硬件升级)对负载的影响,测试系统可以是测试或QA数据库环境,也可以是一个快照备用数据库(关于备用数据库后面的文章有更多的说明)。
执行回归分析突出p+0和p+1模拟负载之间的差异,DBR会自动识别和分析错误回归,数据回归和SQL语句回归的向量。
数据库重放的美妙之处是它消除了创建执行回归分析的模拟负载的必要性,相反,DBA可以准确地执行记录下来的SQL语句,因此这倾向于提供更准确的系统回归实况录像,因为其他外部因素(如网络等待时间)减少了或没有了,所有记录下来的SQL语句组成了重放的负载,实际上看起来几乎不会出现无用的或很少执行的代码,这些代码可能会被忽略,如果应用程序是在一个RAC集群数据库环境中的话这是很关键的。
本文接下来的4小节提供了数据库重放功能的高级入门指南,实现它们的通用目标:
在从p+0到p+1迁移一个生产系统时准确判断需要回归到什么程度,本系列后面的文章中,我会介绍如何利用数据库重放功能捕获、预处理、重放和分析重放结果。
第一步:
录制负载
Oracle11g企业管理数据库控制台提供了一个非常直观的管理数据库重放功能的接口,如启用负载捕获,预处理,回归分析等,每一步它都提供了良好的状态反馈信息,图1显示了初始的数据库重放控制台界面:
(点击查看大图)图1:
数据库重放控制台主界面
这一步看到的全部负载就是对生产数据库捕获和录制的内容,DBA只需要保证在生产系统上有足够的负载,DBR做了其他所有事情(捕获所有外部客户端发起执行的SQL语句),这包括:
SQL查询,DML语句和DDL语句。
PL/SQL块和远程过程调用(RPCs)。
对象导航请求和OCI调用。
注意DBS捕获操作执行过程中,Oracle11g不会停止任何后台运行中的作业,所有内部客户端也可以继续产生请求。
DBR通过一系列影子进程记录负载,这些影子进程过滤出必要的信息准确地复制系统负载,最后将这些元数据写入一系列XML文件,后面重放时就是使用的这些XML文件,Oracle11gDBA只需要关心文件系统上是否有足够的存储空间来重放这些XML文件。
第二步:
“整理”负载
当DBR负载录制完毕后,在重放前,总是需要对其进行一些细微的调整。
例如:
重新映射外部客户端的连接,以便在p+1环境中能准确地重放,在这一步中,DBR为它最后重放准备具体的元数据,所有影响重放结果的参数也是在这一步进行修改的。
在相同数据库版本上重放时这个预处理过程必须存在,当只要数据库版本匹配,就可以在一个生产、测试或其他数据库系统上执行擦除操作,实际上,Oracle强烈建议在一个非生产服务器上执行这个元数据的“整理”操作,以不影响生产服务器的性能或健康为宜。
第三步:
重放负载
负载已经整理好了,可以启动重放操作了,完成元数据擦除后,选定的DBR重放客户端就可以随需重放负载了。
复位测试环境:
在启动重放前,DBA首先必须复位用于测试的目标数据库和主机环境,因为在应用改变前,测试服务器的关键部位需要与生产服务器匹配,否则,可能引发非预期的回归,幸运的是,随Oracle10g数据库出现的闪回数据库(FLASHBACKDATABASE)特性帮助我们简单完成这个任务,其他可选的包括通过RMAN恢复到一个时间点,或使用数据泵导出导入,一旦测试环境正确地复位完毕,接下来,DBA应用所有的改变到测试服务器上的生产系统,使其现在的状态变为p+1,然后传送前面捕获的负载给这个p+1服务器。
通过重放驱动重放负载:
当在p+1服务器上最后一次重放前面捕获的负载时,一个叫做重放驱动的应用程序向目标数据库系统发送请求,因为重放驱动是客户端不可知论的,对Oracle11g而言最初发送请求的客户端类型是没有区别的,重放驱动消灭了录制的负载和向p+1系统发送请求的过程,就象是外部客户端发送的请求一样。
因为它将在所有重放客户端之间分配所有的负载捕获流,重放驱动可能会考虑网络带宽、cpu和内存容量,重放驱动也可能充分利用重新映射连接字串,使它们建立起一对一(如单实例到单实例)或多对一(如单节点到多个RAC节点)的关系,意味着连接负载均衡可能需要考虑,同样重要的是,重放驱动会忽略最初由外部客户端产生的活动(如EM数据库控制),不会重放这种活动,同时,它还会忽略通过数据库连接连接到外部数据库或访问目录对象的活动记录。
另一个使用数据库重放吸引人的优点是:
可以同步模式或异步模式重放捕获的负载。
在同步模式下,每一个事务都按照录制时的顺序准确地重放,然而,DBR也可以异步重放负载,如不考虑事务的同步性,因此可以产生比录制时更大的负载,这在试图执行一个“测试到破坏”新的或修改过的数据库环境时特别有用。
DBR负载重放的范围:
Oracle11gR1数据库重放功能可以准确地评估下面几类对数据库环境的改变。
数据库升级
数据库打补丁
改变数据库模式
改变初始化参数
修改一个或多个RAC节点及其内连配置
操作系统平台的概念,包括从32位转移到64位
改变服务器内存或cpu配置
改变数据库的存储配置,包括在文件系统(如ext3,ntfs)、ASM存储、和/或RAW存储之间迁移数据库文件
DBR负载重放限制:
数据库重放模拟能力有一些显着的(且合理的)限制:
SQL*Loader直接路径装入不能重放,常规路径SQL*Loader操作可以重放
导入导出操作,不管是通过传统的方式还是数据泵的方式,都不能重放
Oracle共享服务器会话不能跟踪
闪回数据库恢复和Flashback查询操作不能重放
Oracle数据流,包括非基于PL/SQL的高级查询,不能重放
分布式事务处理,包括远程COMMIT操作,只能当作本地事务重放
基于Oracle调用接口(OCI)对象导航不能重放
对于大多数部分,这些限制有意义,例如:
闪回数据库本质上是一个不完全的数据库恢复操作,因此它不是正常事务处理的范畴,我也不会考虑它是否会使性能倒退,虽然限制对于共享服务器会话有意义,但仍然有一些数据库是使用共享服务器作为连接池的,因此这是一个小小的遗憾。
第四步:
回归分析
负载重放完毕后,数据库重放将提供多个有关在p+1环境和p+0环境下负载性能不同的分析,正如我在本文最前面提到的,任何好的回归测试套件都有能力捕获和分析性能回归、数据回归和错误回归,DBR在这些方面没有让我们失望。
例如:
DBR能够通过它的一套捕获重放报告立即检测到任何性能差异,通过这些报告,可以下钻到存储在ADDM(自动数据库诊断监视器)、AWR(自动负载仓库)和活动会话历史(ASH)报告中更详细的分析。
无论问题出自哪里,DBR都能识别并处理下列两种类型的问题:
联机问题象征DBR可能做了一些误操作,应该先暂停,否则重放的结果变得没什么意义
脱机问题实际上是数据库重放操作成功的预期结果,这种类型的问题通常是在重放操作结束后被检测到的
下一步
理论知识具备了,在本系列的下一篇文章中,我将阐述:
在Oracle11gR1数据库单实例上捕获一个简单的负载
预处理捕获的负载
在一个双节点的Oracle11gR1RAC集群数据库上重放预处理过的负载
标识出在转移到类型目标环境过程中可能出现的问题
Oracle11gR1提供了捕获生产环境中应用程序的负载,并在测试环境中重放负载的能力,利用这种技术判断当对系统、数据库或应用程序修改后在性能方面的影响有多大,在本文中,我将描述Oracle11g数据库重放功能如何从当前的生产数据库中(p+0环境)捕获和准备负载,
以及如何在一个Oracle11g测试环境(作为下一个p+1数据库系统)重放相同的负载,这种技术使OracleDBA有机会分析和隔离对性能有害的改变。
这篇文章主要集中讲述如何:
◆从一个Oracle11g数据库捕获一个真实的负载
◆捕获对应的自动负载仓库(AWR)数据
◆为最后的负载重放准备测试数据库环境
◆传输生产环境配置到测试环境
◆预处理生产负载
◆在测试系统上重放负载
◆分析发现的任何性能问题和分歧
模拟应用程序环境
本文中关于我的测试环境有一点需要说明:
为了简化过程,捕获和重放操作都使用相同的数据库。
我使用的是最基本的Oracle11g种子数据库和默认安装的样本方案。
数据库将运行在带闪回日志功能的ARCHIVELOG模式下,以便需要重放时可以快速地利用FLASHBACKDATABASE命令回退到某个初始点。
第一阶段:
录制负载
◆为了建立一个捕获/重放情景,我建立了一个新用户、表、索引和相关的PL/SQL对象:
◆一个新用户ADMIN,它将被用作存储所有管理对象的一个仓库,同时,我还创建了一个表存储主键的值。
创建该用户和表的代码请参考附件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_GENERATOR,它的说明文件和主体文件分别参考附件E:
pkg_load_generator.spc和附件F:
pkg_load_generator.bdy。
◆最后,APInitialization.sql中的代码用几百行模拟数据填充了表AP.VENDORS,并在表AP.INVOICES中创建了25条发票记录,在表AP.INVOICE_ITEMS中创建了与之对应的发票详细信息条目,收集了ADMIN和AP方案下所有对象的原始统计信息,它还创建了一个目录对象DBRControl,用于数据库重放时存储结果脚本和捕获负载期间产生的XML文件。
建立一个负载捕获
至此,我们的源数据库环境初始化好了,我将启动一个真实的负载捕获,下面的图2.1.1显示了数据库重放的初始窗口,它是通过访问EM数据库控制软件的【软件和支持】标签上的【真正应用程序测试】小节下的【数据库链接】得到的。
点击查看大图
(点击查看大图)图2.1.1:
负载捕获设置:
初始化界面
如果我选择了第一个任务,在我的捕获会话执行前必须先确认所有在检查列表中列出的先决条件都已具备才行。
点击查看大图
(点击查看大图)图2.1.2:
负载捕获设置:
计划环境检查列表
接下来的界面让我选择在正式捕获负载之前是否重启数据库,并过滤不需要的会话活动(如EM本身),注意我会按照Oracle11g的最佳实践建议“清除捕获”:
我会接受EM的建议停止并重启数据库以建立一个有效的捕获启动时间。
点击查看大图
(点击查看大图)图2.1.3:
负载捕获设置:
选项
接下来的界面显示的是给捕获会话命名和指定存储重放脚本的目录。
点击查看大图
(点击查看大图)图2.1.4:
负载捕获设置:
设置参数
接下来要求为任务调度命名,图2.1.5和图2.1.6显示了最终的任务确认设置界面。
点击查看大图
(点击查看大图)图2.1.5:
负载捕获设置:
指定EM任务名
点击查看大图
(点击查看大图)图2.1.6:
负载捕获设置:
最终的任务视图
最后,Oracle11g请求最后一次确认。
点击查看大图
(点击查看大图)图2.1.7:
负载捕获设置:
任务提交
捕获就启动了,只要Oracle11g显示这个屏幕,它实际上是等我再次在源数据库上启动代表性的负载。
捕获一个真实的负载
为了通过不同用户模拟相似代码的并行执行过程,我准备了一个简单的shell脚本(参考附录G:
RandomLoadGenerator.sh),它做一些CPU密集型计算的简单查询,在AP方案上产生的查询,同时在AP方案的表中插入上千行记录,我已经将我的源数据库环境配置为使用多个服务名,每一个对应一种用户,内容参考附录H:
SI_Services_tnsnames.ora,我将这些服务名添加到我的数据库配置文件TNSNAMES.ORA中作为可选的连接别名。
我在我的p+0数据库环境中启动了这个负载,执行完毕后,我回到EM数据库控制台查看执行的结果,如图2.2.1所示,然后点击“停止捕获”按钮结束负载捕获。
点击查看大图
(点击查看大图)图2.2.1:
负载捕获:
回顾捕获任务状态
这时,Oracle11g会要求你确认是否结束捕获过程,并显示一个计时表直到捕获完成。
点击查看大图
(点击查看大图)图2.2.2:
负载捕获:
确定终止捕获
点击查看大图
(点击查看大图)图2.2.3:
负载捕获:
结束捕获
当终止捕获后,Oracle11g会询问是否捕获录制的负载对应的自动负载仓库(AWR )数据,如图2.2.4所示,我选择了捕获所有有关的AWR快照,以便于后面进行报告对比。
点击查看大图
(点击查看大图)图2.2.4:
负载捕获:
请求生成AWR快照
一旦捕获结束,就可以查看捕获结果看捕获是否成功,以及是否包含了足够的数据,如果发现数据不足,FLASHBACKDATABASE命令允许我回到捕获开始前的数据库状态再重新开始捕获,我也选择了“查看负载捕获报告”按钮生成一个完整的数据库捕获报告(报告链接:
第二阶段:
准备重放
尽管在p+0数据库环境中成功完成了一个足够的数据库负载捕获,当在p+1环境中重放负载之前还有许多事情要做。
复位p+0环境
因为我的源和目标环境是同一个数据库,因此首先我需要将环境复位到捕获负载之前的状态,我的数据库工作在闪回日志模式,因此我只需要使用FLASHBACKDATABASE命令将其回退到初始状态:
$>rmantarget/
RMAN>shutdownimmediate;
RMAN>startupmount;
RMAN>resetdatabasetoincarnation6;
RMAN>flashbackdatabasetoscn=4162947;
转移到p+1环境
接下来,我要做的是应用必要的改变,将我的数据库环境转到p+1状态,简单说明一下,我将做两个改变,它们对p+1环境的性能有显着的影响:
对存储过程ADMIN.PKG_SEQUENCING.NEXT_ID做了特殊处理,使用序列代替了表ADMIN.NEXT_IDS来确定AP方案中表的下一个主键值,这应该会显着提升存储过程AP.PKG_LOAD_GENERATOR.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显示了从“数据库重放”面板选择了“预处理负载”后的结果。
点击查看大图
(点击查看大图)图2.3.1:
预处理捕获的负载:
选择一个捕获的负载
当我选择了想要的负载后,Oracle11g会提醒我是在同一个数据库版本上进行数据库重放...
点击查看大图
(点击查看大图)图2.3.2:
预处理捕获的负载:
数据库版本警告
然后启动一个新的EM调度任务完成预处理。
点击查看大图
(点击查看大图)图2.3.3:
预处理捕获的工作量:
调度预处理任务
Oracle11g提示要进行最后的确认,以提交调度任务,然后开始执行。
点击查看大图
(点击查看大图)图2.3.4:
预处理捕获的负载:
最后确认
第三阶段:
重放负载
因为我的目标数据库已经复位到捕获负载之前的状态了,并且我所有的p+1改动现在已经准备就绪,至少我已经准备好负载重放了,我将使用EM控制台进行重放,如图2.4.1所示:
点击查看大图
(点击查看大图)图2.4.1:
负载重放:
起点
我选择了一个包含有捕获负载文件的目录后,Oracle11g会确认我已经检查过成功重放所要求的先决条件,包括处理之前需要解决的外部引用(如外部文件和外部目录),如图2.4.2和2.4.3所示:
点击查看大图
(点击查看大图)图2.4.2:
负载重放:
确认先决条件
点击查看大图
(点击查看大图)图2.4.3:
负载重放:
确认对外部系统的引用
一旦所有的先决条件都得到确认了,可以开始真实地执行重放任务了,图2.4.4显示了我设置的关于这个任务的基本信息:
点击查看大图
(点击查看大图)图2.4.4:
负载重放:
设置重放任务
图2.4.5显示我重新映射当前的连接以便重放时也可以使用它。
点击查看大图
(点击查看大图)图2.4.5:
负载重放:
设置连接字符串
正如我在数据库重放入门那篇文章中描述的,Oracle11g允许我改变重放负载的频率,为了保持简洁,我选择了默认的选项,如图2.4.6所示:
点击查看大图
(点击查看大图)图2.4.6:
负载重放:
自定义重放选项
现在可以启动负载重放客户端(WRC)开始重放之前捕获的负载了,如图2.4.7展示的那样。
接下来,我用适当的参数启动WRC,然后返回这个屏幕选择“下一步”按钮开始自动重放负载。
点击查看大图
(点击查看大图)图2.4.7:
负载重放:
启动负载重放客户端
我将打开一个终端启动重放会话,启动WRC客户端执行,注意在开始之前,我将当前的工作目录修改为/home/oracle/DBRControl。
$> wrcsystem/oracle@orclmode=replayreplaydir=.