在6台数据库服务器中执行的同样的程序,取出系统表 AUD$ 的全部字段,输出到LOG文件。
联结这些数据库服务器的分别有数十台端末。在其中一台数据库服务器的LOG文件输出里出现了奇怪现象
AUD$ 的 USERHOST 字段里,在联结的端末的 HOST名的后面还有一个看上去是半角空白的字符
实际上这个字符的ASC码是 00 。也就是说这个字符是 NULL在正常显示的字符串里有一个NULL字符分别在两天里面,有三台端末出现了这种情况,这三台端末在联结别的数据库服务器时,LOG文件
是正常的,而且确认过这三台端末的HOST名的设定也没有问题数据库里的数据在LOG输出后就直接删掉了,没有保留高手们能不能看看这可能是怎么回事?

解决方案 »

  1.   

    当时也考虑过这个问题,但确认过建库的时候用的是同一套BAT文件,
    而且,并不是联结这台服务器的端末都出同样的问题,
    再者,除了这张表以外,这台服务器的其他系统表,检索结果的画面显示或者各类操作都没有类似的情况,
    所以,应该不是LOG 的输出是 PL/SQL 写的,在同一台服务器上执行的其实,已经发生一周了,最近的一周也没有类似情况的再现,
      

  2.   

    难道是ORACLE的BUG?看起来又不像,如果不影响的话,倒也没有什么如果影响的话,你可以在PL/SQL里做对这个字段判断,看是采集的时候出现的问题还是输出的时候造成的
      

  3.   

    应该不会是Oracle的问题,我们几乎找遍的好几个语言的Google,一点类似的现象都没有出现过PL/SQL 的检索和输出也不会有问题,是直接建cursor 检索全字段,然后fetch,
    没有编辑,直接put_line的。
    变量[aud]是用下面的方法定义
    type typ_aud is table of varchar2(14300);
    aud     typ_aud;所以只有可能是Oracle 生成记录的时候产生的NULL字符但是,怪就怪在,不是所有的服务器和端末联结都有这个问题,流年不利啊
    现在正在用开发用数据库服务器再现,看看那三台端末是不是能在那台服务器上再现问题
    不过我估计可能性不大,因为这三台端末联的别的服务器并没有同样的问题出现。我们讨论下来可能是Oracle 判断HOST名长度的时候比实际取得的长了一位,分配内存的时候
    多出来的一位在初始化以后没有被填入具体的值造成的,原因还不清楚。说实话,如果不用特殊工具或者写个程序,在字符串后面加个ASC是00的字符,
    并输出到文件里,还真不好弄影响是不大,就是报告不好写,不象上次shoudown正常后,服务停不了。
    这次问题是再现了,没有原因分析,报告交不了差
      

  4.   

    最近,类似问题不断出现,迫不得已对正式运行中的数据库作了人工检索。
    结果是,在系统表AUD$里面的某些记录的HOSTNAME字段里,
    在文字列的末尾的确存在ASCII码为00的NULL字符。这就是说,问题出现的原因可能有以下几点
    1.出问题的端末的HOSTNAME设定有问题
    2.ORACLE在系统表出力记录时,读取HOSTNAME时出现错误关于第一点,同样的端末在联结其他数据库服务器时,没有出现类似错误,
    所以单纯是端末设定问题的可能性不大关于第二点,为什么只有有限的数台端末出现类似问题。
    而且不清楚ORACLE在出力系统表AUD$时,HOSTNAME是从哪里读取的。
    是从OS的相关内存,还是某个文件。
    是否因为这台数据库服务器的某处设定出问题而导致类似问题的出现,现在还不清楚。原因调查继续中...