生活的内容不全是工作,工作只是生活的一部分;享受生活,热爱工作!
分类: Sybase
2015-02-28 13:30:39
客户有一个IQ数据库扩充DBSPACE空间后,应用系统出现报错,IQMSG文件有以下输出:
I. 02/05 18:01:17. 0000000459 Exception Thrown from s_blockmap.cxx:3201, Err# 0, tid 5 origtid 1791
I. 02/05 18:01:17. 0000000459 O/S Err#: 0, ErrID: 2092 (s_invalidinputexception); SQLCode: -1006000, SQLState: 'QBA00', Severity: 23
I. 02/05 18:01:17. 0000000459 [20238]: IQ Internal error. Please report this to Sybase IQ support.
该错误一直持续,造成应用程序读写数据失败,不能正常运行。
首先问题发生前,在2月5日当前下午16:24到16:28的时间段内,执行为对多个数据库空间(dbspace)增加dbfile的操作,
以扩大数据库的可用空间。共计扩充了19个数据库文件,每个数据库文件大小为1T。 数据库服务器的总空间由原有的16T 左右增加到35T左右。
根据如下IQ 数据库服务器的iqmsg 错误日志输出信息的内容,错误问题的发生与dbspace 空间分配有关,同时在问题发生前的数据库维护操作确实也涉及了新增数据库空间的内容。
I. 02/05 18:01:17. 0000000459 Allocation failed. Dbspace is INVALID
I. 02/05 18:01:17. 0000000459 Exception Thrown from s_blockmap.cxx:3201, Err# 0, tid 1791 origtid 1791
基于上面信息和线索,对问题的研究方向进行了初步定为,并以此为切入点,进行后续分析。在随后的信息中显示:问题发生的具体位置为IQ内部函数s_invalidinputexception
I. 02/05 18:01:17. 0000000459 O/S Err#: 0, ErrID: 2092 (s_invalidinputexception); SQLCode: -1006000, SQLState: 'QBA00', Severity: 23
I. 02/05 18:01:17. 0000000459 [20238]: IQ Internal error. Please report this to Sybase IQ support.
I. 02/05 18:01:17. 0000000459 Exception Thrown from s_blockmap.cxx:3201, Err# 0, tid 5 origtid 1791
I. 02/05 18:01:17. 0000000459 O/S Err#: 0, ErrID: 2092 (s_invalidinputexception); SQLCode: -1006000, SQLState: 'QBA00', Severity: 23
I. 02/05 18:01:17. 0000000459 [20238]: IQ Internal error. Please report this to Sybase IQ support.
通过上述问题发生的上下文关系和出错信息,在SAP/SYBASE 技术支持库中进行查找和研究,发现该问题的产生是由于遭遇了IQ 15.4 ESD2 版本上的一个CR 720503:[SAP IQ] Load job fails with Allocation failed "DBSPACE is INVALID" , s_blockmap.cxx 3201.
在通常情况下,IQ 使用4byte 来存储设备的物理块号的信息,也就是物理块号的最大值为232 (2的32次幂)= 4294967296, 如果所需要的物理块号大于这个数值,则IQ内部需要进行转换,但是在IQ 代码中,这个转换过程出现问题,从而引起空间不能分配的情况。 也就是说对于block size=8K的数据库来说,最大的database空间为232(2的32次幂)*8192=32T,当database 空间大于32T时,在IQ15.4 #ESD3之前的版本就可能会触发这个CR。
回顾问题发生的过程,IQ database的空间从16T增加到35T,已经超过了32T 的大小,从而触发了这个CR,引起空间分配问题,出现诸如Allocation failed. Dbspace is INVALID、ErrID: 2092 (s_invalidinputexception)等错误。
该CR 已经在IQ 15.4 #ESD3中进行了修复。同时有下面的workaround 能够暂时解决这个问题:
Workaround
- Move data to other dbfiles using sp_iqemptyfile procedure.
- and then drop added dbfiles using "alter dbspace" command.
CR720503 已经在IQ15.4#ESD3 中进行了修复。
如上所述针对该问题也存在相应workaround 的方法:将已经增加的dbfile 文件设置为只读,
然后通过sp_iqemptyfile 的方法将该dbfile 上的数据转移到其他的dbfile 上,最后删除这些dbfile,
保证IQ database 中所使用的physical block小于232 (2的32次幂) ,这样可以避免出发这个CR。