Oracle ACE Program FAQ

Oracle ACE项目从今年开始增加了一个新的入门级称号,Oracle ACE Associate,这为更多有志于在Oracle技术社区做出贡献的技术人员打开了一扇更大的门。收到很多朋友询问,获得这个入门级称号应该具备怎样的条件?又如何申请呢?所以干脆将Oracle官方对于ACE项目的问答翻译成中文。
本文翻译自Oracle ACE Program FAQ
另,也可以点击Oracle ACE项目的官方页面以获取更多的信息。

什么是Oracle ACE项目?

Oracle ACE 项目(Oracle ACE Program)旨在认可和表彰那些在Oracle技术社区或者Oracle应用社区中有贡献的人士。这些人的技术娴熟并且乐于分享他们的知识和经验。
该项目包含三个层次:Oracle ACE Associate(以下简称为ACE-A), Oracle ACE, 以及Oracle ACE Director(以下简称为ACE-D)。“Associate”是该项目的入门级,是那些在社区中刚刚开始活动但是渴望在更高的层次做出贡献的人士;“Oracle ACE”则是那些已经在社区中做出卓越贡献的人士;而“ACE Director”则不仅仅是分享知识(通常是那些喜闻乐见的方式)还应该主动地思考如何提高社区活跃度并积极地与Oracle共同寻找达成此目标的机会。

哪些人有资格?

候选者应该是相应技术领域的专家,并且有强烈的意愿分享知识和经验。分享活动包括但不限于以下领域:

  • Oracle讨论论坛
  • 以技术白皮书、文章、代码、工具等方式呈现的内部贡献
  • 撰写Oracle书籍
  • Oracle相关的个人博客
  • 在相关活动中作Oracle演讲
  • 在Oracle用户组中参与活动
  • 在Java用户组参与活动

哪些人是合格的ACE-A?

任何相对较新(与Oracle ACE相比)加入一个社区的成员,已经开始为社区作贡献(在上述的至少两个领域中),并且积极地致力于为自己建立一个更具影响的社区形象。

对于ACE-A有哪些期望?

极具热情的做出社区贡献,提高在社区中的参与程度,以期在一年(12个月)之后达到Oracle ACE的标准。

成为ACE-A有哪些好处?

好处包括:

  • 在Oracle网站中被标志和推荐为“Associate”成员
  • 个人资料将更新到Oracle ACE页面中
  • 在OTN的技术论坛发帖时,将在个人信息上增加Oracle ACE Associate的专属图标 Smaller icon
  • 一份欢迎加入的小礼物
  • 会被受邀参加Oracle ACE项目的活动

成为Oracle ACE有哪些好处?

好处包括:

  • 在Oracle网站中被标志和推荐为官方认可的专家
  • 个人资料将更新到Oracle ACE页面中
  • 在OTN的技术论坛发帖时,将在个人信息上增加Oracle ACE的专属图标 Smaller icon

  • 一份表示感谢的小礼物

  • 会被受邀参加Oracle ACE项目的活动

ACE-A和ACE有什么区别?

Oracle ACE Associate是入门级别的ACE,任何人新加入了社区并且在至少两个领域开始做出贡献,都可以申请成为ACE-A,而Oracle ACE则是已经在多个领域做出贡献并且已经拥有了受人尊敬的社区形象。

如何申请从ACE-A晋升为ACE?

当成为ACE-A以后,在社区中保持活跃的参与度,再经过1年(12个月),必须提供在社区中参与的领域有所增加的证据,如果你认为自己已经满足条件,那么就提交一份完整的Oracle ACE提名表到oracle-ace_ww@oracle.com邮箱。

对于Oracle ACE有哪些期望?

Oracle ACE称号是用来认可在社区中做出卓越贡献的人士,Oracle对于该称号获得者的唯一期望就是继续保持自己在社区中的活跃度。

什么是Oracle ACE校友(Alumnus)?

对于Oracle ACE每年都会有一个年度审查,来确认是否还在社区中保持活跃。如果一个Oracle ACE不再在社区中保持活跃超过12个月,那么Oracle ACE项目办公室将保留把该人的Oracle ACE状态修改为“Alumnus”的权力,并且不再要求该人对社区保持贡献。我们欢迎这些过去的参与者通过ACE提名表再重新申请成为Oracle ACE。

如何推荐?

任何人都可以推荐。可以从此处下载提名表。

谁能决定成为ACE的资格?

Oracle ACE提名委员会,包括Oracle ACE项目办公室和Oracle产品管理小组的一些成员,对于每一份完整的Oracle ACE提名表都会进行检阅。

什么是ACE-D?

ACE-D不仅仅要满足对于Oracle ACE的所有需求,并且要致力与为Oracle公司和那些在真正环境中使用Oracle技术和应用的人们之间创造持续的对话渠道。大多数ACE-D都在某些方面(无论是技术层面还是社区层面)做出了卓越的贡献。跟Oracle ACE一样,Oracle公司的雇员不可以成为ACE-D。

成为ACE-D需要什么样的资格?

除了Oracle ACE的那些需求之外,ACE-D还需要具备:

  • 对社区做出持续的卓越的贡献,包括技术层面和/或社区层面
  • 良好的沟通技巧
  • 承诺之后12个月在社区的持续无偿贡献

ACED-D可以为社区做什么?

  • 经常与本地社区交流沟通
  • 向Oracle公司提供反馈,包括社区的反馈
  • 维护一个活跃的Oracle相关的博客
  • 在大会/会议/研讨会上发表演讲
  • 经常在Oracle讨论社区中回答问题

Oracle为ACE-D提供什么?

  • 在Oracle网站上和Oracle举办的活动中被标志和推荐为官方认可的专家
  • 每年一次在Oracle总部举办的信息分享会
  • 免费的软件
  • 与产品研发部门/策略部门对接
  • 在OTN上发表文章或者白皮书(有偿)
  • 在Oracle或者第三方活动中演讲的机会
  • ACE-D专属的讨论组
  • 在OTN的技术论坛发帖时,将在个人信息上增加Oracle ACE的专属图标 Smaller icon
  • 从Oracle ACE项目办公室获得的各种支持

成为ACE-D之后的要求对社区做出怎样的贡献?

候选者必须承诺在最少12个月内持续对社区做出贡献,在此时间内,期望如下:

前3个月

  • 与产品组参加至少一次Web研讨会
  • 在Oracle ACE-D论坛板块中介绍自己
  • 订阅感兴趣的Oracle研发新闻邮件
  • 建立/维护Oracle相关博客

前6个月

  • 定期参加产品组Web研讨会
  • 参与本地Oracle公司活动并演讲
  • 建立/维护Oracle相关博客
  • 在非Oracle公司官方活动中演讲
  • 在OTN上发布文章(有偿)

在12个月内

  • 在Oracle OpenWorld期间参加年度ACE-D信息分享会
  • 积极参加产品租Web研讨会
  • 参与本地Oracle公司活动并演讲
  • 在非Oracle公司官方活动中演讲
  • 建立/维护Oracle相关博客
  • 在OTN上发布文章(有偿)

我成为ACE-D之后有报酬吗?

没有。作为成为ACE-D的条件之一就是候选者必须同意义务无偿地为社区做出贡献。当然,如果在OTN上发布文章是有报酬的,并且参加官方的研讨会Oracle公司会承担差旅住宿的费用。

如何成为一个ACE-D?

提名表是向公众开放的,但是需要有现有成员或者Oracle员工支持。题名委员会将评估提交的提名表,并对资格和领域专业性做出审核。根据资格评估结果选出合适人选。Oracle公司对此保留最终裁决权。
Oracle ACE-D提名表可以从此处下载。

我已经是Oracle ACE了,想成为ACE-D,我该怎么做?

你必须证明不仅仅有之前对社区的贡献,还有在12个月的时间段内持续为Oracle公司和Oracle社区双向沟通做出的努力。如果你认为自己已经具备资格,请将完整的ACE-D提名表发给Victoria Lira victoria.lira@oracle.com

Learning ODI – Sybase to Oracle

这几天,在客户处实施Sybase ASE到Oracle 10g的变化数据捕获以及数据转换的前期测试工作,问题此起彼伏,但最终效果圆满,感觉上仿佛遇神杀神,遇鬼杀鬼。不拽了,总结一下遇到的问题以及相应的解决方法。

一. ODI连接数据库阶段

1. JDBC版本 – jConnect 5.5
ODI自带的JDBC驱动无法正常连接Sybase ASE数据库。

解决方法:需要去Sybase站点上下载jConnect 5.5版本,然后将其中的jconn2.jar文件拷贝进ODI安装目录的drivers文件夹中,之后再次选择com.sybase.jdbc2.jdbc.SybDriver,才可以连接。

2. 为什么不选择jConnect 6.05
因为在jConnect 6版本以后,”getColumnName”方法返回的是列的COLUMN Name,而之前的版本都是返回列的ALIAS,而ODI使用的都是列ALIAS,因此如果选用jConnect 6.05,那么在最后执行Interface的时候,将会碰到下面的错误:
com.sunopsis.sql.SnpsMissingParametersException: Missing parameter…

解决方法:使用jConnect 5.5,这也是Oracle lab test时推荐的JDBC驱动版本。

3. JDBC连接串的写法
如果写法如下:
Driver是:com.sybase.jdbc2.jdbc.SybDriver
连接串是:jdbc:sybase:Tds:172.22.224.106:4100/dbemp1

连接时将碰到JZ00L错误,已经确保用户名和密码一定正确:
java.sql.SQLException: JZ00L: Login failed. Examine the SQLWarnings chained to this exception for the reason(s).

解决方法:添加charset属性,修改连接串为 jdbc:sybase:Tds:172.22.224.106:4100/dbemp1?charset=eucgb
最后Physical Schema的设置应该类似如下界面(点击以后放大)。

二. Datastore创建阶段

1. Sun JDBC-ODBC Bridge驱动无法实施反向工程(Reverse Engineering)
因为一开始配置jConnect驱动的时候死活无法连通,因此尝试了Sun JDBC-ODBC Bridge驱动,这种方法需要首先在机器上创建一个ODBC连接,因此也就需要Sybase客户端,所以实际上是不推荐的,而且通过JDBC-ODBC Bridge连接进数据库以后,发现无法执行反向工程。

解决方法:放弃这种方法,换用jConnect连接Sybase ASE。

2. Changed Data Capture
对于创建了唯一聚簇索引的Sybase表也无法启动Journal,必须需要Primary Key。没有主键在启动Journal的时候会碰到如下错误:
com.sunopsis.tools.core.exception.SnpsSimpleMessageException: Journalizing requires a Primary Key on the Table:ODI_TEST

解决方法:在表上创建Primary Key。

三. Interface执行阶段

1. Oracle端表中包含Date或者Timestamp类型的字段时,执行时报ORA-30088错误
如果包含DATE或者TIMESTAMP类型字段的Datastore是由反向工程直接从数据库中reverse生成的,那么对于DAYE字段,默认的Logical Length是7,对于TIMESTAMP字段默认的Logical length是11,那么这样在执行阶段的create work table步骤中,将会按照这些Logical Length来在目标数据库端创建C$_表,而DATE(7)或者TIMESTAMP(11)这样的语法都会报ORA-30088错误。
java.sql.SQLException: ORA-30088: datetime/interval precision is out of range

解决方法:在reverse生成Datastore以后,手工修改DATE和TIMESTAMP类型的字段,将Logical length改为空,Scale也改为空。

2. 执行时,Loading data步骤时报7725错误
在执行Interface的时候,到Loading data这一步,报如下错误:
7725 : ZZZZZ : com.sybase.jdbc2.jdbc.SybSQLException: Cursor ‘jconnect_implicit_2’ was declared with a FOR UPDATE clause. This cursor was found to be read only.
这是花费了最长时间解决的错误,十分感谢Rich Ho何致亿,帮我发邮件到OracleDI的邮件列表中去提问。

解决方法:在Topology Manager中将Data Server的Array Fetch Size和Batch Update Size设置为0,默认是30。

到今天为止,ODI的大致架构和基本功能算是掌握了,更加深入的学习还要看以后这个项目是不是会继续下去了。

Learning ODI – Changed Data Capture

Oracle Data Integrator的一个强大功能就是通过CDC(Changed Data Capture)抓取异构数据库之间的数据变化,并将这些数据同步到目标数据库中。比如说从Sybase ASE或者IBM DB2中将大量的产品数据定期通过CDC同步到Oracle数据仓库中,反之亦可以。

以下描述最简单的在ODI中设置CDC复制的步骤,只是一个大体步骤,可能有些细节会遗漏。

1. Designer -> Models -> Datastore,创建一个源表和一个目标表的Datastore,可以通过反向工程完成。当然之前需要在Topology Manager中的相应Technologies里添加Physical Architecture和Logical Architecture。

2. 设置Model的Journalizing属性,选择合适的JKM(Journalizing Knowledge Module),当然之前需要将合适的JKM导入到ODI中来。

3. 将源表的Datastore加入CDC。

4. 启动Journal (将会在源表所在的Schema中自动创建相应的Trigger,假设我们是用Trigger的方式而不是Logminer技术的话),为了能够正常启动Journal,源表必须具有主键。

5. 在目标表的Datastore中添加Subscriber,命名最好是默认的大写SUNOPSIS。

6. Designer -> Projects -> Interfaces,创建一个Interface,在Diagram页面做好源表和目标表字段之间的Mapping关系,注意,在源表属性中勾选“Journalized Data Only”选项。

7. 启动Schedualer Agent,参看我的上一篇文章

8. 为Interface创建Scenario,再设置Scenario中的Scheduling。注意,设置Scheduling的时候,如果计划运行间隔是一小时以上,那么使用“Defination”页面,如果计划运行时间间隔在一小时以下(比如5分钟或者10秒钟一次),那么应该使用“Execution Cycle”页面,而“Defination”页面中的Execution部分应该设置为“On startup”而不是默认的“Simple”。

9. 运行该Scenario,可以在Operator中监控Scenario的运行情况。

该文章似乎只适用于我自己的备忘,而完全不能作为他人学习的参考文档来使用,如果想从头学习ODI,请去仔细阅读安装ODI时自带的Documentation Library,非常详细,原来SUNOPSIS的文档功力也是一流。

Learning ODI – Start Scheduler Agent

对于设置ODI的定时执行场景,需要启动Scheduler Agent,在一个新的ODI安装完毕之后,默认的odiparams.bat文件中设置的是连接DEMO环境的数据库连接配置,如果我们在自己的数据库里创建了Master Repository和Work Repository,那么需要修改连接参数。

在我的测试环境中,我使用的是自己机器上Oracle 11g数据库,实例名是orcl11g,则需要做如下修改:

set ODI_SECU_DRIVER=oracle.jdbc.driver.OracleDriver
set ODI_SECU_URL=jdbc:oracle:thin:@localhost:1521:orcl11g
set ODI_SECU_USER=snpm
set ODI_SECU_ENCODED_PASS=b9yX4CpBkdmaP8Y3mYbaoye2p
set ODI_SECU_WORK_REP=WORKREP1
set ODI_USER=SUPERVISOR
set ODI_ENCODED_PASS=hZypfAZQf.Yo8VWVI6HZzc 

其中:
ODI_SECU_USER需要设置为创建Master Repository时候的用户名,在这里是snpm。
ODI_SECU_ENCODED_PASS需要用agent实用程序加密一下,用法是agent encode %PASSWORD%。
ODI_SECU_WORK_REP设置为创建Work Repository时候起的名字。
ODI_USER默认是SUPERVISOR,这是连接ODI的用户名。
ODI_ENCODED_PASS默认是SUNOPSIS,也需要用agent encode加密之后的值。

设置完毕,启动Scheduler Agent,会遇到下面的错误:

java.lang.Exception: Agent is not declared in Topology Manager

我们还需要在Topology Manager -> Physical Architecture -> Agents里面创建一个Agent,填写Agent的名字,监听的机器,端口。如果需要设置Schedule,还需要在Topology Manager -> Logical Architecture -> Agents里面再创建一个Agent,将刚才创建的Physical Agent和此Logical Agent绑定在一起。

然后,在Designer -> Projects -> Scenarios -> Scheduling中创建一个执行计划,之后再次启动Scheduler Agent就OK了。

C:\OraODI\oracledi\bin>agentscheduler "-port=20910" "-NAME=myFirstAgent"
A JDK is required to execute Web Services with OracleDI. You are currently using a JRE.
OracleDI: Starting Scheduler Agent ...
Starting Oracle Data Integrator Agent...
Version : 10.1.3.4.0 - 30/10/2007
Agent in scheduling mode
Number of items for scheduled executions:0
08/17/2008 02:58:09 PM(main): Server Launched
Aug 17, 2008 3:06:27 PM com.sunopsis.j.s a
INFO: Start Thread[1001@2008/08/17_03:06:27:000,5,main] @ Aug 17, 2008 3:06:27 PM

最后一行显示了在Schedule中定义的计划被执行成功。

在Windows操作系统中可以把Agent程序设置为Service,通过以下命令设置,其中倒数两个参数分别为Physical Agent Name和Agent Port:

agentservice.bat -i -s myFirstAgent 20910

运行成功之后,将会产生OracleDI Agent Scheduler myFirstAgent这样命名的Windows服务。

通过以下命令可以删除创建的服务:

agentservice.bat -r -s myFirstAgent

Learning ODI – Set user interface language

在中文版的操作系统上,或者是英文版的操作系统但是设置了”Language for non-Unicode program”为”Chinese(PRC)” 的情况下,ODI的界面始终是中文的,这给学习过程造成了很大的困惑,因为所有的文档都是英文的,在文档中提到的名词我需要去猜测在ODI的中文界面中是哪个词。

如果说Model翻译成“模型”,DataStore翻译成“数据存储”还可以简单地对应上,那么Controls翻译成“控制”,Flow翻译成“流”,Scenario翻译成“方案”就不得不花费一些时间去对照了。

所以,为了加快学习进程,需要把ODI的界面设置成英文的。

编辑ODI安装目录中bin目录下的odiparams.bat文件,设置如下一行,然后重新启动ODI即可:

set ODI_ADDITIONAL_JAVA_OPTIONS=”-Duser.language=en” “-Duser.region=US”

英文版界面清爽多了。:)

附加修改Oracle SQL Developer的界面语言方法:
编辑sqldeveloper\sqldeveloper\bin\sqldeveloper.conf文件,加入

AddVMOption -Duser.language=EN
AddVMOption -Duser.region=US

Learning ODI – Set ODI_JAVA_HOME

项目需要,所以正在学习使用Oracle Data Integrator,一个收购了Sunopsis之后整合的Oracle BI产品。

ODI + CDC可以实现异构数据库之间的数据抽取和数据同步,至少到目前看来是一个强大的工具。目前在测试使用的是Windows版本的Oracle Data Integrator 10.1.3.4.0

简单记录一下学习过程中发现的问题以及解决方法。

发布过程中,在创建了一个Scenario之后,可以通过操作系统命令行的方式调用这个Scenario。但是可能会出现以下的问题:

C:\OraODI\oracledi\bin>startscen LOAD_SALES_ADMINISTRATION 001 GLOBAL “-v=2”
The Java Virtual Machine was not found at the following location:
The ODI_JAVA_HOME environment variable is not defined correctly.
Please set this variable in odiparams.bat.
OracleDI: Starting scenario LOAD_SALES_ADMINISTRATION 001 in context GLOBAL …
The system cannot find the path specified.

简单的解决方法就是使用安装ODI时自带的JVM,设置操作系统的环境变量ODI_JAVA_HOME即可。

C:\OraODI\oracledi\bin>set ODI_JAVA_HOME=C:\OraODI\jre\1.4.2

C:\OraODI\oracledi\bin>echo %ODI_JAVA_HOME%
C:\OraODI\jre\1.4.2

C:\OraODI\oracledi\bin>startscen LOAD_SALES_ADMINISTRATION 001 GLOBAL “-v=2”
A JDK is required to execute Web Services with OracleDI. You are currently using
a JRE.
OracleDI: Starting scenario LOAD_SALES_ADMINISTRATION 001 in context GLOBAL …
08/15/2008 08:05:59 下午(main): 正在为方案创建会话 :LOAD_SALES_ADMINISTRATION –
001
08/15/2008 08:05:59 下午(main): Session : 8005 is running
08/15/2008 08:06:05 下午(main): Session : 8005 finished with return code : 0
DwgJv.main: 退出。 返回代码:0

诡异的遭遇

将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里面是查不到锁定视图的会话的,所以通常我们还需要找到这个视图的定义,然后查询视图使用的基表。