ITPub博客

首页 > 数据库 > Oracle > 数据库升级到11G/12C的潜在风险提示--技术人生系列第三十九期-我和数据中心的故事

数据库升级到11G/12C的潜在风险提示--技术人生系列第三十九期-我和数据中心的故事

Oracle 作者:记录每一次错误 时间:2018-12-04 10:01:17 0 删除 编辑

问题来了


客户 DBA 发来微信,说有个字段,在 sqlplus 里查询时报错:

客户很资深,找到典型数据的特征:最后那个 C9 是半个字符。

老猫 『数据是通过什么接口进去的?』

客户小A C 语言』

老猫 OCI ,还是 pro*c?

客户小A 『不知道,要是有空麻烦过来跟我们开发聊一下』


地铁 2 号线上,盯着薛之谦『弹个车』那个破广告,脑子飞快地转动,这类问题我遇到过,在原厂处理 SR 时解决过,给某农商行的强人女 DBA 也解决过这类问题。可是,就是想不起答案是什么 岁月这把杀猪刀除了给我的脸上留下了道道皱纹,还把脑子的沟迴磨平了许多。算了,当个新问题来解决吧


到了现场马上见到开发人员,开发人员描述:

  • 这是个PRO*C的程序

  • 问题发生在从10G升级到11G以后。10G上没有问题。

  • 数据是前端传到程序里,在程序里作了截取前几位的处理。

项目已经上线,造成很严重的影响。



脑子清晰了一些,这是 OCI 接口,升级到 11G 以后在处理错误字符行为发生改变的一个问题。可是,怎么能让它回到以前的行为呢?一时想不起来,先绕过问题。用 10G 客户端与 10G 下编译的程序,先绕过问题。于是,迅速帮客户布署了 10.2.0.4 client ,程序跑通,作为一个临时方案放在那里。 我坐下来,迅速用 proc 作了个 sample ,重现客户问题 ( 这是我的工作习惯 )


这种代码,我这里都有现成的,改改, make 一下。就可以运行了,结果如下:

问题重现了,就去查官方文档 :

+

+


Call Interface Programmer'sGuide

-> OCIRelational Functions

-> Connect,Authorize, and Initialize Functions

->OCIEnvCreate()

URL:

http://docs.oracle.com/cd/E11882_01/appdev.112/e10646/oci16rel001.htm#LNOCI7016

+

+


在这个函数的说明中,我找到了以下文字:

这是要改代码的节奏,不! Oracle 不是这么不负责任的公司。它应该有不必代改代码的方案。好在~这段文字唤醒了我的记忆:


+

+


Oracle为了让用户不必改代码就可以实现这个功能,在sqlnet.ora里加了个参数,这个问题被描述在一个Bug里,Oracle习惯把一些代码修改也称为Bug,别误会,这不是代码错误。

+

+





    在sqlnet.ora里加入_OCI_ENABLE_NLS_VALIDATION=TRUE。

 

Bug11871915 - 11g clients can insert invalid NLS characters to database

问题解决了!!




这个问题由于我糟糕的记忆力,导致问题被延迟解决几个小时。所以,处理的每个问题,我们都要作实验重现它,以便给自己留下深刻的印象,并留下笔记,供日后搜索查询。

本文转载于中亦安图

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

请登录后发表评论 登录
全部评论
性格开朗,有较强的学习能力,对oracle数据库的体系结构,搭建RAC,timesten,goldengate,分布式数据库,dataguard,系统调优有较深入的了解, 尤其是oracle优化,深入学习的主机命令,对数据库的优化,SQL语句的优化有深入的认识,目前正在shell脚本,mysql,以后会有计划学习大数据和python。

注册时间:2018-07-23

  • 博文量
    182
  • 访问量
    325535