Procwatcher: Useful Script to Monitor Oracle Processes

也许总在某个时候,作为Oracle DBA的你心里会想,这进程到底在干什么呢?为什么占用这么高的CPU?为什么写这么多数据到磁盘上产生这么大的IO?

当然,我们有各种各样的诊断方法来确认这些进程在做什么,不过,也很有可能在初步的诊断之后,还是一无所获,这时候也许类似于oradebug short_stack这样的命令或者是操作系统级别的debug命令能够让我们在重重迷雾中找到一些指路的明灯。不能否认,在某些时候,只是灵光一闪,从某些特征上忽然醒悟了该从哪个方向入手,就能帮助我们最终解决问题。

这里介绍的Procwatcher是一个shell脚本,运行在UNIX/LINUX操作系统级别,帮助我们给指定的Oracle Clusterware后台进程(比如crsd.bin, evmd.bin等)以及Oracle RDBMS后台进程(比如dbwr, smon, pmon等)进行定期的debug跟踪,将收集的stack traces按照进程和日期存储在磁盘上。

不要期望能够完全看明白stack trace的内容,那些是给专业的Oracle Support人员看的,但是我们至少可以知道在一个进程非常缓慢或者非常忙碌的时候,它被hang在了什么地方,也许是一个类似于kslwait这样的函数,这些就是蛛丝马迹,可以通过这些关键字去Metalink中找寻更有价值的信息。或者把这些trace内容上传给Oracle Support人员,也对解决疑难问题有很大帮助。

此脚本的内部注释非常完整,基本上所有的帮助信息都可以从脚本注释中找到。

启动和关闭脚本的命令分别是:

./prw.sh start 
./prw.sh stop

注意点:
1. 获取stack trace通常会对被debug的进程有短暂的suspend操作,比如ocssd.bin如果被suspend过长(超过css misscount时间),则会导致节点被重启。可以修改脚本中的CRSPROCS参数,将不需要trace的进程去除。

2. 在AIX平台上慎用EXAMINE_CRS=true,也就是在AIX平台上最好不要用这个脚本去获取Oracle Clusterware后台进程的stack trace,可能造成程序被hang住。

3. 默认保留2天的trace记录,可以通过下面的语法修改为3天或者更多。

./prw.sh start 3

可以登录Metalink的朋友可以在Note:459694.1中下载该脚本。
没有Metalink帐号的朋友在这里下载脚本。

How to use query in EXPDP

在datapump export中Oracle提供了query参数,允许只导出满足query条件的记录。

在Oracle 10gR2的官方文档中,提到的语法是:

QUERY = [schema.][table_name:] query_clause

并且给出了例子:

QUERY=employees:'”WHERE department_id > 10 AND salary > 10000″‘

但是实际上这个例子是错误的,按照例子中的语法,则会碰到ORA-06502错误。

D:\Temp>type emp_query.par
QUERY=emp:'"WHERE rownum<4"'
NOLOGFILE=y
DIRECTORY=DATA_PUMP_DIR
DUMPFILE=exp1.dmp

D:\Temp>expdp scott/tiger parfile=emp_query.par

Export: Release 11.1.0.6.0 - Production on Thursday, 26 February, 2009 18:07:24

Copyright (c) 2003, 2007, Oracle.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, Oracle Label Security, OLAP, Oracle Database Vault
and Real Application Testing options
Starting "SCOTT"."SYS_EXPORT_SCHEMA_01":  scott/******** parfile=emp_query.par
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 192 KB
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type SCHEMA_EXPORT/POST_SCHEMA/PROCACT_SCHEMA
. . exported "SCOTT"."DEPT"                              5.937 KB       4 rows
ORA-31693: Table data object "SCOTT"."EMP" failed to load/unload and is being skipped due to error:
ORA-06502: PL/SQL: numeric or value error
ORA-31605: the following was returned from LpxXSLSetTextVar in routine kuxslSetParam:
LPX-314: an internal failure occurred
. . exported "SCOTT"."SALGRADE"                          5.867 KB       5 rows
. . exported "SCOTT"."BONUS"                                 0 KB       0 rows
Master table "SCOTT"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SCOTT.SYS_EXPORT_SCHEMA_01 is:
  D:\ORACLE\ADMIN\ORCL11G\DPDUMP\EXP1.DMP
Job "SCOTT"."SYS_EXPORT_SCHEMA_01" completed with 1 error(s) at 18:08:04

这份文档错误在Oracle 11gR1的官方文档中已经修正了。正确的语法,是去除掉例子中query字串的前后单引号:QUERY=emp:”WHERE rownum<4"

D:\Temp>type emp_query.par
QUERY=emp:"WHERE rownum<4"
NOLOGFILE=y
DIRECTORY=DATA_PUMP_DIR
DUMPFILE=exp1.dmp

D:\Temp>expdp scott/tiger parfile=emp_query.par reuse_dumpfiles=y

Export: Release 11.1.0.6.0 - Production on Thursday, 26 February, 2009 18:16:59

Copyright (c) 2003, 2007, Oracle.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, Oracle Label Security, OLAP, Oracle Database Vault
and Real Application Testing options
Starting "SCOTT"."SYS_EXPORT_SCHEMA_01":  scott/******** parfile=emp_query.par reuse_dumpfiles=y
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 192 KB
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type SCHEMA_EXPORT/POST_SCHEMA/PROCACT_SCHEMA
. . exported "SCOTT"."DEPT"                              5.937 KB       4 rows
. . exported "SCOTT"."EMP"                               8.125 KB       3 rows
. . exported "SCOTT"."SALGRADE"                          5.867 KB       5 rows
. . exported "SCOTT"."BONUS"                                 0 KB       0 rows
Master table "SCOTT"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SCOTT.SYS_EXPORT_SCHEMA_01 is:
  D:\ORACLE\ADMIN\ORCL11G\DPDUMP\EXP1.DMP
Job "SCOTT"."SYS_EXPORT_SCHEMA_01" successfully completed at 18:17:32

更详细的Query用法可以参看Metalink Note:277010.1。

Delete Expired VS. Delete Obsolete

今天有朋友问,到底RMAN里面的命令delete expired和delete obsolete有什么区别?

先来看一下官方文档中的解释。via Backup and Recovery User Guide

delete exipired

If you run CROSSCHECK, and if RMAN cannot locate the files, then it updates their records in the RMAN repository to EXPIRED status. You can then use the DELETE EXPIRED command to remove records of expired backups and copies from the RMAN repository.

delete obsolete

The RMAN DELETE command supports an OBSOLETE option, which deletes backups that are no longer needed to satisfy specified recoverability requirements. You can delete files obsolete according to the configured default retention policy, or another retention policy that you specify as an option to the DELETE OBSOLETE command. As with other forms of the DELETE command, the files deleted are removed from backup media, deleted from the recovery catalog, and marked as DELETED in the control file.

delete expired删除的是那些本来RMAN以为存在但是实际上在磁盘或者磁带上已经被删除了的信息,删除的只是RMAN资料库中的记录;delete obsolete则删除旧于备份保留策略定义的备份数据同时也更新RMAN资料库以及控制文件。

那么再形象一点儿解释的话,就是“在不在”和“要不要”的区别。expired是不在了,obsolete是不要了。

不在的并不一定是不需要的。
不需要的也不一定就不在了。

外一句:数据库管理的时候,痛苦的是不需要的还在,还占据着资源;比这更痛苦的是,需要的已经不在了,想恢复却找不到备份集。 😀

How to use Files in place of Real Disk Devices for ASM

个人测试ASM的好方法。参看以下几个链接。

在Linux操作系统中:
How to use Files in place of Real Disk Devices for ASM – (Linux)

在Windows操作系统中:
How to use Files in place of Real Disk Devices for ASM – (Windows)
在这份文档中使用到了perl脚本,实际上就是创建一个文件填满0,每次循环写1024*1024(2的20次方)个0,循环100次就是写了100M的文件。
或者
Windows环境下ASM磁盘虚拟工具ASMTOOL

在Solaris操作系统中:
How to use Files in place of Real Disk Devices for ASM – (Solaris)

Implementing and Using the PL/SQL Profiler

在公司内部有时候会给其它的同事进行一些内部的培训,这里大部分的同事都在用PL/SQL写程序,因此关于PL/SQL程序的性能调整是很多人关心的话题。

对于一大段PL/SQL程序,如何快速找到这段程序里面最耗费时间的部分在哪里?如何快速地定位改程序的bottleneck?这时候需要dbms_profiler包。

1. 首先需要检查dbms_profiler包有没有安装。如果没有则需要通过sys用户运行$ORACLE_HOME/admin/profload.sql来创建该包。

2. 将该包的执行权限赋予待优化的PL/SQL程序属主。

3. 使用PL/SQL程序属主登录数据库,运行$ORACLE_HOME/rdbms/admin/proftab.sql来创建repository tables,包含PLSQL_PROFILER_RUNS,PLSQL_PROFILER_UNITS,PLSQL_PROFILER_DATA这三张表。

4. 在待优化的PL/SQL程序前后加上运行dbms_profiler包的代码,如下:

BEGIN
  DBMS_PROFILER.START_PROFILER('any comment');
  ...'your pl/sql code'
  DBMS_PROFILER.STOP_PROFILER;
  ...
END;
/

5. 运行该PL/SQL程序,之后检查PLSQL_PROFILER_DATA表内容,从中就可以看到每一行代码的执行次数,每行代码总共的执行时间。

另外从Metalink上Note:243755.1中可以下载PROF.zip,包含的程序可以用来生成直观的profiler结果报告,一个html样式的报告。

From Drop Box

该报告可以列出Top 10最消耗时间的代码,强烈推荐使用。

CBO need more human brains?

从Oracle8中引入的CBO和统计信息收集功能在8i,9i,10g,11g中一直在发展,CBO的设计理想是美好的,但是一直以来也受到用户的质疑,CBO的不够智能,或者说某些时候过于笨,有些时候又过于自作聪明,引发了很多问题。

11g推出之后,Oracle在完善CBO自身功能的同时,又添加了很多允许用户参与的功能,也许言下之意是,CBO的完善还有很长的路要走,但是面对各种现实问题,还是先允许更加聪明的人类用户来参与影响SQL的执行计划吧。

看看新提供的DBMS_STATS.COPY_TABLE_STATS功能,该功能可以改善对于使用range方式来分区的大分区表的统计信息生成方式,这种表往往统计信息更新赶不上数据更新。通过copy statistics可以将一个已经存在的分区统计信息复制到新生成的分区中,该方法基于的理念是每个业务分区的统计信息在数据条数,数据分布,NDV值等等方面都是基本相同的。

再加上之前介绍的SPM功能,也同样是允许用户来决定最终使用哪个执行计划的举措。

数据库管理越来越智能,并不意味着数据库管理员的工作越来越少了。

How To Integrate Statspack with EM 10G

说过要写一篇如何将10g之前版本的statspack整合到EM 10g中的文章,但是最近没有相应的环境,不方便截图,因此给出metalink上的相应文章链接,有兴趣的朋友可以自行阅读,很详细的step by step操作。

Doc ID. 359374.1 How to Configure a Database Target for Complete Monitoring
Doc ID. 274436.1 How To Integrate Statspack with EM 10G
Bug No. 5599831 NOT ABLE TO MANAGE 9I STATSPACK USING 10G GRID

不能登录Metalink的朋友请下载包含这三篇文档的zip文件

SPM default feature in Oracle 11g

在Oracle 11g中,为了方便用户对CBO产生的执行计划进行干预,防止像10g中那样频繁而不可预知的执行计划变更,加入了SQL Plan Management(SPM)功能,Oracle优化器小组的weblog上最近发表了连载文章对SPM功能做了详尽的描述。

那么在Oracle 11g中,SPM的默认功能是怎样的?

SQL> show parameter baseline

NAME TYPE VALUE
———————————— ———– ———
optimizer_capture_sql_plan_baselines boolean FALSE
optimizer_use_sql_plan_baselines boolean TRUE

以上的两个参数表示,Oracle 11g默认将不会抓取任何SQL的Plan Baseline,但是如果一旦人为产生了Baseline,那么Oracle将会自动使用。这在很大程度上简化了以往为了固定执行计划所需要做的Stored Outline工作。

Oracle and Cloud

Oracle的CEO拉里·埃里森(Larry Ellison)在Oracle Open World上对云计算的攻击言犹在耳。

有趣的是,云计算概念已经被我们扭曲了,现在的云计算概念几乎包括了我们要做的一切。你甚至找不到一家不宣称自己是云计算的。计算机行业是唯一一个比女性时装界还要追逐概念和潮流的行业。也许我是个笨蛋,但是我真的搞不懂他们在说些什么。到底什么是云计算呢?完全是胡扯。这很荒唐,这种愚蠢什么时候能够停下来呢?

好吧,(假如)我们也宣称我们是云计算,我们不跟云计算对着干。但是,我们真的不知道,我们每天做的有什么不同,云计算对我们顶多是个广告概念。这就是我对云计算的看法。

然而如今,我们已经可以使用Cloud中的Oracle Enterprise Edition 11g和Oracle Weblogic Server了,这是Oracle跟Amazon联手的成果。

"Oracle in the Cloud" AWS Webinar

View SlideShare presentation or Upload your own. (tags: amazon aws)

Amazon是云计算概念浪潮中的第一个实干家,EC2和S3分别了提供了前端运算和后端存储的云计算解决方案,而Oracle则是Amazon在云计算方面的第一个Partner,将Oracle Database 11g部署在Amazon EC2中,通过Oracle Secure Backup将数据库备份到Amazon S3中。这样的架构让Oracle和Amazon简直可以称为天作之合,我的意思是至少在宣传中是这样的。

云计算以其弹性、可扩展性和付费即用模式等特性在提供了灵活的高吞吐量同时又给了客户很大的成本节约空间。而使用部署在云计算中的Oracle数据库,又进一步让客户从繁琐的数据库规划和数据库备份管理的工作中解脱出来,让客户将更多的精力放在业务拓展而非IT管理上。

当然,云计算目前还存在着很多问题,最突出的就是数据安全性,将具有隐私性的数据存放在一个第三方提供的空间内,首先是否合乎法规,其次是否真的可以保证安全,这已经不单单是技术层面的问题,还牵涉到了政策法规以及消费者的心理因素。

其实,Oracle早在1995年就致力于推广NC(Netowrk Computer)的概念,并且宣称在2000年NC将大行其道,可惜这个计划在1998年的时候以失败告终。而当今的所谓云计算概念看上去正是NC的翻版,只是随着诸如网络带宽、网络速率、存储容量等近年来长足发展的技术条件的成熟,过去阻碍NC发展的障碍已经不存在了,所以这个理念又重新浮出水面并且炒得有声有色。

一个合适的概念要出生在一个合适的年代,落后注定失败,而过于超前也几乎同样意味着失败。

Larry在Open World上炮轰云计算,可能是出于他个人标新立异藐视一切的性格,对于N年后一个炒自己冷饭的概念居然甚受欢迎表达了自己的愤慨;另外则也可能是当时并没有发现很好的合作伙伴,也没有在云计算中发现属于Oracle公司自己的商业价值,甚至从类似于Amazon SimpleDB这样的云计算产品中感受到了对自己的压力。

但是,商场如战场,没有永远的盟友也没有永远的敌人,当发现了云计算中的商业价值,迅速地切入并且尝试成为领头羊无疑是明智的选择。这是Larry Ellison的个人风格,也同样是Oracle公司的企业形象,如果有可能就挑起纷争,如果有可能就抛开纷争,而所有可能的目的就是为了利益最大化