一次海外故障的解决
发布时间:2012-07-29

 

2012-07-27日星期五, 下午5点左右,海外客户报告我们(乐思软件)外网监测到的数据无法传输到内网了,他们已经重启过网闸,删除日志也无济于事。
我们立即加以响应,发现是网闸JDBC连接错误:

“url=jdbc:oracle:thin:@… “
“OraConnect->connect(),DB creat driver upload error1!
“dbs->connect failed”

我们立即指导其让所有同步任务重新启用,换用备用网闸,但这些方法都无法让JDBC恢复正常。
我们只好让客户采用原来设计好的备用方案,利用程序将外网数据导出,然后导入内网。
导出成功,但用Orcle impdp工具导入时,遇到以下错误:

ORA-31693: Table data object “WDM_APP”.”TEMP_ARTICLE_DETAIL”:”SYS_P2624″ failed to load/unload and is being skipped due to error:
ORA-44002: invalid object name
ORA-06512: at “SYS.DBMS_ASSERT”, line 293
ORA-06512: at “SYS.KUPD$DATA”, line 2427
ORA-20998: Attempt To Drop

真是祸不单行,竟然备用方案也不能成功运行。该备用方案以前是测试过的,我们立即在我们自己的测试环境中试,也可以顺利执行。
看看Oracle的DBMS_ASSERT,竟然又是加密的。连忙在Oracle在线支持系统中申请一个紧急SR。
以我们的经验,Oracle支持一般都无法真正及时解决问题,还得靠自立更生。

指导客户试了多种方法, 结果每次导入还是这个错误。几个小时很快过去了。
这时我们拟定如下方案:次日让网闸技术人员辅助解决,我们同时立即开发一个导入导出程序来替换Oracle的 impdp工具。

开发与支持,一直持续到凌晨4点,仍然无法解决。这时Oracle支持英语电话打过来了,但已经是凌晨4点,我们已经非常疲惫了,只好让他明日再打过来。
Oracle支持后来在线回复让我们收集Oracle相关信息,但这时客户已经下班了。

第二天星期六上午赶紧联系网闸技术人员,同时完善我们的导入导出程序。

下午时,让网闸技术人员赶到我公司,指导客户利用一些工具登录到网闸查看, 发现网闸telnet内外网的数据库服务器都是连通的,说明网络状况没有问题,检查了JDBC版本也没有问题,
最后决定让用户重启内外网数据库服务器以及网闸,果然,重启后,从我们的监测界面上看外网数据立即同步到内网了。
这时已经晚上八点了,我们为了庆祝成功为客户排除障碍,到外面吃饭。

吃完饭后,回到办公室一看,原来高兴的太早,客户反映几个小时前的数据都还在内网没有同步到外网,立即电话网闸技术人员,原来当时我们做配置生效操作时,网闸会传输并清空数据,而当时正有故障。因此这部分数据还需要我们手工导出来并导入内网。

我们在内网一测试,发现我们的程序导入时出现了奇怪的Oracle错误:

ORA-24816 — Expanded non LONG bind data supplied after actual LONG or LOB column
// *Cause: A Bind value of length potentially > 4000 bytes follows binding for
// LOB or LONG.
// *Action: Re-order the binds so that the LONG bind or LOB binds are all
// at the end of the bind list.
ORA-24816 — 在实际的 LONG 或 LOB 列之后提供了扩展的非 LONG 绑定数据错误。

开始按网上解决方法重新排列字段名但没有用。后来发现另外一台计算机导入不会有这个错误,比较了Oracle客户端版本,出错的是11.1.0,正常的是11.2.0,看来是Oracle OLE驱动问题,要升级客户端到11.2.0才行。后来该机器仅升级了Oracle OLEDB驱动到ODTwithODAC112030,重新导入成功,这个错误消失了。需要以管理员身份登录计算机,否则会有TNS错误。

继续检查发现大部分数据还是导入了,但后面操作导入的数据时非常慢,一查原因,原来是一条SQL语句非常慢, 几乎无法完成, 是由于article_detail有CLOB字段。这条SQL如下:

insert into article_detail
select * from TEMP_ARTICLE_DETAIL_I_M
where article_detail_id not in(select article_detail_id from article_detail where transfer_done_time>trunc(sysdate-4))

我们将其插入方式改为先插入一个空的CLOB字段值,然后再更新该CLOB字段值,速度立即加快几十倍,很快完成操作。

最后我们将测试通过的自己开发的导出导入工具交给客户,顺利导入了所有数据。

总结

本次故障应是数据库服务器长时间运行后与网闸之间的通路出现潜在通信问题造成,通过重启核心设备与关联设备解决。重启关联设备作为可能的方法之一一开始被我们忽略了。
Oracle impdp工具导入时出现的错误也许在升级Oracle客户端后可以得到解决,但我们没有机会再试了。
关键时候,还是自己的工具管用(因为有最大范围的掌控并可随时修改),应尽量减少对第三方工具的使用。
尝试各种方法以及没有远程桌面靠文字与文件的沟通非常花时间, 应加以改进采用更方便的软件(客户不允许使用远程桌面)。
客户端及时采用最新Oracle 版本。

分类: 公司博客, 知识库 标签: , ,