背景:oid代理运行一段时间后突然不在执行计划任务了,但是代理测试是通过的。
启动agentscheduler报错 Unable to create TaskScheduleDefinitionList
正常启动应该是
根据oracle support所说
因小公司没有买oracle产品,于是花50块买了一天的账号使用权下载了补丁
https://updates.oracle.com/download/26997719.html
打补丁的时候才发现我当前使用的12c不需要打这个补丁,此路已断~
oracle support描述的信息
上述的意思是要与SNP_PLAN_AGENT表中损坏的记录有关
更具体的说,SNP_PLAN_AGENT表的以下两列具有不一致的值(一列为NULL,但一列为正值)
-
S_BEGIN_HOUR
-
S_END_HOUR
解决方案是
1.在ODI Studio中识别并删除有问题的计划
2.在ODI Studio中重新创建计划
3.在ODI Studio拓扑中,对代理执行更新计划以验证更改。
好的,上面的方案也不符合我的情况!
那么我们再看另一个解决方案
上述意思是由保存调度信息的 SNP_PLAN_AGENT 工作存储库表中的无效/不正确数据引起的。
更具体地,在上面的调度表中引用了一个或多个方案和/或加载计划,但是在方案(SNP_SCEN)和加载计划(SNP_LOAD_PLAN)工作存储库表中缺少该方案和/或加载计划。
当以下情况之一时,可能会遇到这种情况:
方案/负载计划已重命名...或
方案/负载计划已被删除...或
已创建一个场景的版本对象,该场景在 ODI 中具有活动计划
也给出了解决方案
-
建议不要在生成 ODI 方案/负载计划后对其进行重命名,因为已知这会导致多个问题。
-
如果需要进行此更改,建议改为生成具有新名称的新方案/负载计划。
可以执行以下步骤来解决该问题:
将 SNP_PLAN_AGENT 与 SCEN_NAME 和 SCEN_VERSION 上的 SNP_SCEN 结合起来,以找出额外的场景。
将 SNP_PLAN_AGENT 与 SCEN_NAME 上的 SNP_LOAD_PLAN 结合以找出额外的加载计划。
然后从 SNP_PLAN_AGENT 中删除上述场景和/或加载计划的行。
如果需要,请联系 ODI 支持以接收适当的 SQL 命令。(无助,穷困.....)
下面是实际执行的,确实查出来结果,但是还是不能解决问题
注:其实到这里不愿意折腾的人直接可以忽略,我们可以直接ODI Studio中将计划任务都删了,然后重新创建即可。
下面的语句执行后删了一些数据,再去重新代理,还是报错。得全删干净再试试,嗯嗯嗯~~还是不行!!!!!!!!!!!!!!!
SELECT * FROM SNP_PLAN_AGENT pa JOIN SNP_SCEN s ON pa.SCEN_NAME = s.SCEN_NAME AND pa.SCEN_VERSION = s.SCEN_VERSION WHERE [add conditions to identify extra rows]
SELECT * FROM SNP_PLAN_AGENT pa JOIN SNP_LOAD_PLAN lp ON pa.SCEN_NAME = lp.SCEN_NAME WHERE [add conditions to identify extra rows]
DELETE pa FROM SNP_PLAN_AGENT pa JOIN SNP_SCEN s ON pa.SCEN_NAME = s.SCEN_NAME AND pa.SCEN_VERSION = s.SCEN_VERSION WHERE [same condition used above]
注意:上述删除操作现网不要执行,走投无路的我不得已在本地环境还原了现网的情况,将odi迁移到了本地
迁移过程中尽量保持创建的用户密码和现网一致。
迁移重点:
迁移完成后在本地环境连接工作存储库始终是现网的IP,这导致我无论如何都连不上本地的oracle数据库,在翻阅大量资料后终于找到了如下解决方案
先看这篇https://forums.oracle.com/ords/apexds/post/change-ip-connection-to-work-repository-of-odi-8602
在看看这篇https://glamorousoracle.blogspot.com/2013/10/oracle-tip-changing-odi-11g-database-ip.html
ODI Studio中要创建一个新工作资料库才能修改上述url,不然按钮是灰色的无法修改(这是我本地发现的情况)
好了将本地环境搭建完成,现网odi资料库导入本地后,完美复现了现网的报错,这下可以为所欲为了。
由于接触odi时间也不多也就两周,对其表数据的情况也不了解,只能简单粗暴的对比两个库的数据来排错
思路
本地安装两个odi环境一个环境是初始化安装的能正常启动代理,另一个就是将现网odi资料库导入到本地的环境不能正常启动代理,对比这两个库的数据,将不正常的库数据参照初始库一个个表清数据进行启动测试
结论:运气较好,看一个名为SNP_SCHEDULE_EXEC的表不是很爽,清掉数据后,代理能正常启动了!
support是这么说的
https://support.oracle.com/knowledge/Middleware/2594470_1.html
综上由于这个表被污染才导致代理启动始终报错,清空这个表的数据即可。
Unable to create TaskScheduleDefinitionList
- TaskScheduleDefinitionList agentscheduler Unable create ODItaskscheduledefinitionlist agentscheduler unable codefirst dbcontext unable create launcher process unable create outofmemoryerror create unable native 错误process unable create odi taskscheduledefinitionlist agentscheduler unable certificate problem issuer unable