Informix -244 错误 :
Could not do a physical-order read to fetch next row.
具体错误解释:
#finderr -244
原因:
a.锁表
b.记录太多
c.页损坏
d.某个进程死了以后资源未释放导致
在数据库端用 onstat –g ses/onstat –g sql /
Onstat –k 等找出锁表进程,用onmode –z结束该进程,
不行,重启数据库释放。
锁方式:
行方式(row),页方式(默认page),表方式(table)。
解决:
1.降低锁级别
2.减少加锁事务的时间跨度
3.设置等待解琐时间
相关命令:
)检查索引及页损坏情况
#oncheck –cID database_name:table_name
) 查看锁级别
#oncheck –pt database_name:table_name
)设置锁级别(行方式)
#alter table table_name lock mode(row)
)设置隔离级别
#set isolation to dirty read
)设置等待解锁时间(不宜过大)
#set lock mode to wait second(秒)
不等待
#set lock mode to not wait
1:$ onstat -k | grep HDR+X
HDR+X 为排他锁
HDR 头
X 互斥
owner
是正持有锁的线程的共享内存地址
2:$ onstat -u |grep c60a363c
c60a363c 为1中查到的owner内容。
sessid
是会话标识符编号
3:$ onstat -g ses sessid
根据sessid得到进程pid
pid
与此会话的前端关联的进程标识
$ onstat -g sql sessid
通过上面命令查看执行的sql语句
4:$ ps -ef |grep pid
由此,我们可得到锁表的进程,可根据实际锁表进程的重要程度的具体情况采取相映处理方法:
对于重要且该进程可以自动重联数据库的进程,可以用onmode -z sesid 的方法杀掉锁表session,
$ onmode –z sessid
否则也可直接杀掉锁表的进程 kill pid。
$ kill -9 pid
将表的页锁改为行锁
参考语句为
unload to optimize.sql delimiter "" select 'alter table '||tabname||
' lock mode(row)'||';'from systables where locklevel="P" and tabid > 99
将卸载的optimize.sql稍微删除一下其中出现的字符或乱码,后运行,即可把表的页锁改为行锁