一个头疼了一天的问题

背景:
EBS数据库从9i升级到10.2.0.4.4,为了规避一些已知的问题,升级最后一步是从10.2.0.4镜像库通过expdp导入10.2.0.4.4数据库

故障描述:
升级后目标库(10.2.0.4.4)web界面显示乱码,
初步看像是中间多了很多空格
例如:s e l e c t * f r o m v $ p r o c e s s w h e r e a d d r
而10.2.0.4导出库是正常的
例如:select * from v$process where addr

故障处理:

1.怀疑是数据库的字符集不一致导致,检查结果导出库和生产库一致
2.怀疑是导入导出的环境变量不一致导致,检查结果环境变量一致
3.怀疑导出库nls_database_parameters多了NLS_SAVED_NCHAR_CS参数,而生产库没有,导出库从9i升级上来,保留了9i的参数,NLS_SAVED_NCHAR_CS影响不大
4.怀疑是全角和半角输入的问题,全角2个字符,半角一个字符,很像是这种情况,让应用人员从客户端模拟输入一条记录,结果显示正常
5.发现乱码对应的数据类型为long,查找其他的long字段,发现还有类似的情况,大概有10张表,所以基本排除前端输入时全角的问题
6.全角和半角可以用to_single_byte和to_multi_byte转换
SQL> select to_multi_byte('select') from dual;

TO_MULTI_BYTE('SELECT')
----------------------------------------------------------------
select
仔细观察,发现select和s e l e c t字体不一样,所以不是全角的问题,而是中间多了空格,所以彻底排除是全角的问题

7.long类型不是所有的字段都有空格,有的没有,怎么解释都解释不通
8.怀疑10.2.0.4和10.2.0.4.4版本不一样导致,从导出库10.2.0.4重新导出,然后分别导入导出库和生产库,结果都有空格,所以只要用datapump导入导出就会有问题
9.最后只能怀疑是BUG,问题确定后在MOS上搜索datapump long关键字,终于找到了是BUG,只在10.2.0.4上有,真倒霉
Bug 5598333 - EXPDP/IMPDP corrupts the data for a LONG column [ID 5598333.8]

原来是BUG,所以只有部分数据corrupt了,没有任何的规律,但可以重现


10.处理出错的数据

1)数据已经发生了变化,不能重新expdp/impdp
2)long字段只能用游标的方式从导入库update到生产库,批量update会报错
3)其中有一张表long超过4000字符,报buffer太小,被truncate了
4)尝试用物化视图把导入库转成CLOB,复制到生产库,然后从物化视图的CLOB update到long时也不行!需要把字段类型转成CLOB才行,从本地的CLOB update到CLOB是可以的
5)long用物化视图也不能从导入库复制到生产库
6)BUG有补丁,准备打补丁后重新导入导出这一张表

11.后来另外一个同事灵机一动,既然是datapump的bug,何不用imp/exp试试,呵呵,竟然可以,不用停机打补丁了。


[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/90901/viewspace-1056628/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/90901/viewspace-1056628/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值