分类: Oracle
2008-04-24 21:17:30
对我而言,我最关心的是更改是否会带来“破坏性”风险。即使微小的改动也有可能引发多米诺骨牌效应,最终导致严重后果。
为了将这种风险降至最低,许多厂商在类似于生产环境的控制环境中进行更改,应用类似于生产系统的负载并观察随之产生的影响。复制生产系统非常简单(至少从技术层面上讲),但再现负载却是另一回事。说起来容易做起来难。
多数机构会采用一些可自动运行以模拟真实用户活动的第三方负载生成工具进行尝试。在大多数情况下,这种方法是可以的,但其始终无法真正忠实地再现生产数据库负载。这些第三方工具只是通过不同参数执行预编写的查询若干次;您必须向这些工具提供查询并给定其可以随机使用的参数范围。这并不能代表您的生产系统负载,而仅仅是运行了一小部分执行了若干次的生产负载,因此,这只是对 1% 的应用程序代码进行了测试。最糟糕的是,这些工具要求您自己提供所有来自生产负载的查询,对于小型应用程序而言,这可能需要数周或数月,对于复杂些的而言,则可能需要多达一年的时间。
如果可以,在数据库本身内记录所有数据库操作(与 DML 相关的操作及其它),而后按这些操作出现的真实顺序进行重放,难道不是一种更好的方法吗?
Oracle 数据库 11g 将为您带来诸多好处。新的数据库重放工具好似数据库内的 DVR。使用该独特的方法,可如实地以二进制文件格式捕获 SQL 级别以下的所有数据库活动,然后在同一数据库或不同数据库内进行重放(这正是在进行数据库更改之前您希望做的)。您还可以自定义捕获流程,以包括或排除某些特定类型的活动。
数据库重放与另一个工具 SQL 性能分析器共同构成了 Oracle 数据库 11g 的“真正应用测试”选件。这两个工具之间的主要不同在于涉及的范围:数据库重放适用于捕获和重放数据库内的所有(符合某些筛选条件)活动,而 SQL 性能分析器可用于捕获特定的 SQL 语句并对其进行重放。(在数据库重放中,您无法查看或访问捕获到的特定 SQL,而在 SQL 性能分析器中则可以)。后者的一个显著优势是 SQL 调整,因为您可以调整由应用程序执行的 SQL 语句并评估其影响。(本系列即将推出有关 SQL 性能分析器介绍的文章。)
理论上,数据库重放的工作顺序如下图所示。
因此,数据库重放可以提供哪些第三方工具不能提供的优势?一些工具仅仅重放若干您提供的复合语句。而数据库重放不需要您提供 SQL 语句。由于它将捕获 SQL 之下的所有活动,因此您不会遗漏任何可能导致性能问题的关键操作。此外,您可以有选择地(针对特定用户、程序等)进行捕获,还可在捕获负载时指定时间期限,可以重放导致问题的特定负载,而不是整个数据库。
例如,您注意到月末利息计算程序导致问题出现,并猜想更改参数将简化流程。您必须做的是捕获月末程序运行期间内的负载,在测试系统上对参数进行更改,然后在该测试系统上重放捕获文件。如果性能有所提升,则表明此解决方案可行。如果性能没有提升,这也仅仅是个测试系统而已。您不会妨碍到生产数据库的运行。
在我看来,单为了使用该工具,也值得升级到 Oracle 数据库 11g。下面将介绍该工具的工作原理。
第一个任务是捕获数据库中的负载。所有任务都可通过命令行或 Oracle 企业管理器数据库控制完成,但此处将使用后者。
$ cd /home/oracle $ mkdir dbcapture
SQL> create directory dbcapture as '/home/oracle/dbcapture';
下面是一个可完成此任务的小的 PL/SQL 代码片断。该代码片断将生成 1,000 个插入语句并进行执行。(注意,此代码片段将生成 1,000 个不同的插入语句,而不是在同样的语句或程序中执行 1,000 次插入操作。)
declare l_stmt varchar2(2000); begin for ctr in 1..1000 loop l_stmt := 'insert into trans values ('|| trans_id_seq.nextval||','|| ''''||dbms_random.string('U',20)||''','|| 'sysdate - '|| round(dbms_random.value(1,365))||','|| round(dbms_random.value(1,99999999),2)||','|| round(dbms_random.value(1,99))||')'; dbms_output.put_line(l_stmt); execute immediate l_stmt; commit; end loop; end;
SQL> create restore point gold;
现在,准备开始捕获。导航到 Oracle Enterprise Manager Database Control 中的 Database Replay 主页面。在该主页中,选择 Software and Support(如下图所示,标记为“1”)
启动捕获流程后,可能会有一些正处于运行中的事务,其中并非所有都可进行捕获。重启数据库将使这些正处于运行中的事务无效。此外,共享池可能具有数个 SQL 语句,其中一些可缓存和固定。这可能会与捕获的负载相冲突。重启数据库可清除这些“干扰”。而且,重启数据库可以为您提供一个干净备份在测试系统上进行恢复,从而确保您在与生产系统的 SCN 号相同的系统上重放活动。
出于以上这些原因,特别是第一个,Oracle 建议在捕获之前重启数据库(该选项为默认设置)。但这不是必须的。如果不希望重启,请选择另一个单选按钮。
您也可以添加其它过滤器。例如,要添加排除所有 Perl 程序的过滤器,可单击 Add Another Row 并在域“Filter Name”和“Value”中分别输入“perl”和“%perl%”。同样,纠正默认参数中的小错误 — Oracle Management Agent 过滤器的值应是“%emagent%”,而不是“emagent%”。
或者,假设您希望排除所有 SYS 用户操作。那么,您需要从 Session Attribute 下拉框中选择 USER,并在“Value”列中输入 SYS。
SQL> connect scott/tiger SQL> @add_trans