诡异的遭遇

将Oracle ERP产品环境克隆到一个新的测试环境,是Oracle ERP DBA的日常工作。
但是这次一个环境克隆到今天也没成功,遭遇了一波又一波的问题,只能用诡异来形容。

我们的产品环境服务器在各个省会城市,而测试环境服务器则全部在北京,所以平时的操作是晚上业务可以停顿的时候,关闭数据库,然后将所有数据文件和客户化程序tar到磁带上,第二天省里面将磁带用快递送到北京,然后我们开始克隆测试环境。

关闭数据库,往磁带中tar文件,完毕以后再重新启动环境,这些都是通过脚本和crontab自动完成的。同样的操作已经成功运行了无数次。

但是这次:
1。第一天拿到磁带,作数据库clone的时候,报错说undo01.dbf找不到,然后发现磁带中根本没有没有这个文件,也就是备份的时候就出了问题,这个文件没有tar成功。最后发现原因是,HP的tar最多只能支持单个文件8G,而那个undo01.dbf在这次备份前因为需要导入大量数据而扩大到了10G,所以tar失败。

2。此时是第二天白天,无法down库,只能等到晚上12点以后,开始用FTP直接从产品环境传输数据文件到测试环境。临晨4点登录系统发现FTP异常中止了,然后查看测试环境的文件系统,发现几乎100%空间占用,但是用du -sk却显示只使用了50G而已。
bdf的结果
/dev/hbvg01/lvhbdevdata 102432768 100529536 1888536 98% /heuat/data
du -sk 的结果
56461752 /heuat/data
反复检查,结果发现是删除原来测试环境中的数据文件时没有关闭Oracle的instance,导致磁盘空间没有释放。此时,不禁想,如果是Windows系统,那么instance打开的时候根本就不会允许删除数据文件,也就没这个问题了,所以,事务总有好和坏的两面。

3。kill掉后台oracle进程,重新FTP剩余的数据文件,到早上8点,成功传输完毕,开始clone,将近10点的时候,clone结束,正在作最后的打扫工作,忽然登录数据库报错,查看数据文件,竟然发现有一堆数据文件的属主发生了变化,当时脑袋已经比较混沌了,蒙了几分钟,然后ps后台的进程,结果发现有一个mv的进程,正在把其它位置的数据文件转移到我正在clone的这个环境中,立刻打电话给同事。。。他的误操作覆盖掉了我刚刚做完的新数据库,彻底崩溃,我一个晚上的工作啊,又白费了,这个环境仍旧宣告clone失败。两个字评语,诡异!我不由又有些怀念Windows了。

然后就是一通疯狂的电话联系,跟这个人说明情况,跟那个人商量解决方法,一直搞到中午11点多,洗澡,睡觉。

如何将UNIX Shell作为Concurrent Program来运行

通常在Oracle ERP系统中需要有数据导入的工作,比如各个模块的期初数据。这些数据导入的工作都是由客户方的人员在Oracle ERP系统中运行特定的Concurrent Program来执行的,也就是操作人员点几下鼠标,提交一个请求的事情。

那么如何实现数据导入功能变为Concurrent Program呢?

1。将数据导入功能写成一个UNIX Shell,允许接受参数,在其中调用sql loader,这个脚本如何写不是本文的内容

2。比如这个数据导入是总帐模块需要用的,那么通常我们就把这个Shell脚本放在$CGL_TOP/bin目录下,假设脚本的名字的为hostprog.prog,扩展名为prog这是必须的。

3。在相同目录下生成link,注意此处生成的link名称为去掉了prog扩展名的文件名,这同样是必须的。
link -s $FND_TOP/bin/fndcpesr $CGL_TOP/bin/hostprog

4。在ERP系统中注册Concurrent Program Executable,注意选择Type为host

5。在ERP系统中注册Concurrent Program Define,此时可以设置Shell脚本需要接受的外部参数的默认值。注意,当请求调用脚本的时候,会往脚本中传输4个参数值,依次是 orauser/pwd, userid, username, request_id,分别表示数据库用户/密码,ERP用户ID,ERP用户名,当前请求编号,这是我们在写脚本时可以使用的$1-$4这4个参数,而额外自定义的参数一定要从$5开始。

6。找到需要执行这个脚本的ERP用户所拥有的职责,然后将该Program加入职责的请求组中。

7。切换到相应职责,提交请求。

可以参看Metalink上的文章:Note:147455.1
Running a Shell Script as a Concurrent Program

解决Oracle ERP死锁的方法

今天,功能顾问说客户在作付款的时候忽然客户端掉电,然后再次登录以后就无法继续付款了,报错界面如下。

付款报错

明显是意外掉电导致的客户端进程没有释放,所以产生了始终不释放的lock。

如果对于业务比较熟悉,知道这是哪个form,问清楚客户使用的什么职责,通常从v$lock和v$session中就可以得到足够的信息,然后kill掉产生lock的会话就可以了。

但是如果对于业务不熟悉就只能依靠Oracle RDBMS的知识一点点检查了,我的解决方法基本上是这样。

1。为发生错误的Form加上跟踪

2。重现错误,在udump目录下查看trace文件

3。找到这样的报错
PARSING IN CURSOR #70 len=120 dep=0 uid=44 oct=3 lid=44 tim=2502449707361 hv=3320467580 ad=’99f21c88′
SELECT LAST_DOCUMENT_NUM + 1 FROM AP_CHECK_STOCKS WHERE CHECK_STOCK_ID = :b1 FOR UPDATE OF LAST_DOCUMENT_N
UM NOWAIT
END OF STMT
PARSE #70:c=0,e=2425,p=0,cr=2,cu=0,mis=1,r=0,dep=0,og=0,tim=2502449707353
WAIT #70: nam=’SQL*Net message to client’ ela= 2 p1=1952673792 p2=1 p3=0
WAIT #70: nam=’SQL*Net message from client’ ela= 356 p1=1952673792 p2=1 p3=0
BINDS #70:
bind 0: dty=2 mxl=23(22) mal=00 scl=00 pre=00 oacflg=03 oacfl2=0 size=24 offset=0
bfp=800003fb8005b6f8 bln=23 avl=04 flg=05
value=10094
EXEC #70:c=0,e=1159,p=0,cr=7,cu=1,mis=0,r=0,dep=0,og=4,tim=2502449709034
ERROR #70:err=54 tim=256250850

4。确认err=54是资源繁忙的错误
$ oerr ora 54
00054, 00000, “resource busy and acquire with NOWAIT specified”
// *Cause: Resource interested is busy.
// *Action: Retry if necessary.

5。查看dba_objects和v$locked_object,找到对SQL中的表加锁的SESSION_ID,然后kill这个会话。
这一步需要注意的是,Oracle ERP系统中使用了大量的带有CLIENT_INFO环境参数的视图,比如本例中的AP_CHECK_STOCKS就是一个视图,所以直接从v$locked_object里面是查不到锁定视图的会话的,所以通常我们还需要找到这个视图的定义,然后查询视图使用的基表。

如何给OracleERP报表添加Excel查看方式

pic1

如何实现如上图在查看Oracle ERP报表时可以选择Microsoft Excel类型?很简单,作下面的设置就可以了。

用sysadmin登录Oracle ERP系统,选择Install -> Viewer Options,然后添加一条新记录。新纪录的File Format为”Text”,Mime Type为”application/vnd.ms-excel”,Description为”Microsoft Excel”,保存。

pic2

记在这里,作个备忘。

Oracle Apps DBA工作小结

开始Oracle Apps DBA的工作到现在差不多有2周了,为了清理思路作个小的总结。

日常需要做的工作包括:
1。Oracle Apps的克隆,复制,因为有各个省份的生产环境,测试环境,开发环境,所以克隆,复制的需求量很大,这是个熟能生巧的事情,同时也是个比较无聊的工作,没什么技术含量。

2。Oracle Apps的troubleshooting,通过对Oracle Forms做trace,再加上反应不算快速的Metalink支持,基本上也可以应付。但是看见旁边的同事疲于应付各种求助,感觉上也有些烦躁。

3。数据库的备份,使用HP OpenView Storage Data Protector+RMAN,以前没有用过omni,但是仍然属于熟能生巧的事情,而且有HP工程师作技术支持,也不是什么问题。目前需要做的是备份策略还没有完全测试过,这是这周的主要工作。

4。编写文档,文档的模版比较正规,但是内容仍然需要改善,各个省份的文档都是Ctl+C, Ctl+V,然后全局替换的产物。

5。SQL Tuning,一般是对于客户化开发功能的SQL调优,目前我对于应用还很不熟悉,所以这部分工作还没有开始。

需要接触的技术:
HP主机 + Oracle数据库 + Oracle Apps 11i + HP OpenView Storage Data Protector

工作之外需要进一步学习IT管理,也许今年内可以把ITIL认证拿下。

Oracle Applications – Concepts

根据自己制定的Study Plan [Flickr Image],今天浏览完了Concepts文档,总算在脑子里面有个Oracle EBS大致的轮廓了。

1. Oracle Applications Architecture
典型三层结构,Desktop Tier + Application Tier + Database Tier
Desktop Tier通过浏览器,利用Oracle自己的JVM – JInitiator跟Application Tier通讯,将表单以JAR文件的形式缓存在本地。
Application Tier是业务层,通过自带的Oracle806数据库(Net8)跟底层Database Tier中的Oracle9i通讯,包含这么几个服务:Web server, Forms server, Concurrent Processing server, Reports server, Discoverer server (optional), Admin server。
Database Tier不用多说,业务数据都保存在这个数据库中,EBS11.5.9默认安装Oracle9201,需要手动打patch到9206。

2. Release 11i Enhancements
因为从来没有接触过以前的版本,所以这个Enhancements部分对我而言没什么意义。
只需要登录一次E-Business Suite Home就可以了,不再需要单独登录其它的工具或者产品。
提供了Oracle Applications Manager(OAM)工具来配置,监控,诊断Oracle Applications系统。
Application Tier部分使用了Oracle9iAS。
Database Tier支持且为cost-based optimization (CBO)做了优化,支持Database Resource Manager,支持Partitioned Tables,启用了Invoker Rights功能保证大部分的包都只安装在APPS用户下以节省维护成本,支持实体化视图(MV),支持RAC。

3. Internationalization Support
因为开始支持UTF8字符集,所以不再需要特殊的处理方法,在一个实例中就可以解决多语种问题了。
在任何一层如果选用了UTF8字符集,那么其它层也必须使用此字符集。
在安装的时候就应该筹划好字符集的选择,否则事后再修改是一件困难的工作。

4. File System
这一部分花了一段时间去学习,并且登录了四川移动的开发Portal来比对文档中提到的目录结构,基本上还算明朗,最后自己用SmartDraw画了一个Oracle Application File System Map [Flickr Image] 来清理思路。

还有不少environment setup files以及其中的环境变量需要以后慢慢去熟悉。

5. Data Model
各个产品的数据对象,比如表,索引,约束,序列等,都存在自己的产品用户下,我现在使用的系统中有220个用户,粗略估计一下大概有200个用户是Oracle Applications产品相关的。

SQL> select count(*) from dba_users;

COUNT(*)
----------
220

所有产品的编码对象,比如视图,包,存储过程,函数,触发器等,都保存在APPS用户下,同时每个产品用户都授权给APPS用户访问自己数据的权限,所以我们只需要通过APPS用户就可以直接访问各个产品用户的数据。很明显这个特点让维护成本大大降低。

多组织(Multiple Organization)构架通过分区表来实现,正常情况下,用户访问的是根据分区关键字返回的视图(通过FND_CLIENT_INFO包?),而不会去访问后缀为”_ALL”的基表。

这边没有用到多币种报表(Multiple Reporting Currencies),跳过。

推荐的Release 11i的Oracle9i Server Tablespaces包含:SYSTEM, Rollback, Temporary以及每个产品使用自己的表空间,每个产品有两个表空间,一个给数据用,一个给索引用,通常命名规则是’产品简称+D’表示数据表空间,’产品简称+X’表示索引表空间,比如HRD和HRX。我使用的这个测试环境中,表空间有371个。

SQL> select count(*) from dba_tablespaces;

COUNT(*)
----------
371

Release 11i要求Database Block Size最少是8K。

最后提到了”Sizing Factor”,这里有个奇怪的问题,既然前面已经提到全部产品表空间都是LMT,为什么还要提单个Object的NEXT参数设定?对于LMT的表空间来说NEXT参数还有什么意义?并且居然还强调“Do not use a sizing factor of 0%.”,哪位可以给我一个解答

以上只是很简单的一个印象,文档中的很多东西一时还无法理解,不过感觉有Oracle RDBMS基础,对于理解Oracle Applications会有很大帮助,不管如何,它只是一个应用程序,最终去读取存储在Oracle Database中的数据而已。

BTW:我们的测试环境是IBM AIX。

SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.6.0 - 64bit Production
PL/SQL Release 9.2.0.6.0 - Production
CORE 9.2.0.6.0 Production

TNS for IBM/AIX RISC System/6000: Version 9.2.0.6.0 - Production
NLSRTL Version 9.2.0.6.0 - Production

再BTW,我现在周围的情景是,前后左右的女孩儿不停地从抽屉里翻出各种各样的零食塞进嘴里,然后满足地发出“啊哟,好撑啊”的感慨。Cool,下班!