1.在将一个表unload时,出现:
244:Could not do a physical-order read to fetchnext row
107:ISAM error:record is locked
在不重启动数据库情况下,如何解锁?
onstat -g ses和onstat -g sql可以通过SQL语句检查那些用户,那些SQL在操作这张表。
可以重点检查onstat-g sql中UPDATE,DELTE,INSERT语句。
onstat -k看锁的情况,通过输出的tblsnum一列检查是否这张表被锁了。
tblsnum可以通过下面的SQL去获得
select tabname,hex(partnum) from systableswhere tabname="tabname"
这个是我经常用得看谁锁表得小脚本,后面可以再加上onstat -g 得选项。看具体执行了什么东西。
代码:
onstat -k|grep X|awk ‘{print $3}‘|sort -u>tmp1.txt
cat tmp1.txt|while read line
do
onstat -u|grep $line
done
rm tmp1.txt
2.近期我在对informix数据库的表进行update时,总也报-244的错误,我已经在配置文件中加大的锁的个数,
但还是不行,不知-244的错误还与什么有关系?
请查看该表的锁级别,有page,row之分
SQL code只能说明操作上的故障,最终要看ISAM错误代码。
只要索引没问题的前提下,估计是锁并发性的问题,而不是锁不够的问题。
可能通过走索引的方式去尽量避免。
3.在Informix里如果应用将某个表锁住了,如何查出是那个进程锁住的,又如何释放?
1、发现锁表(以tab_test为例)。
2、在systables中找出tab_test对应的partnum。
3、用计算器将此数转换成十六进制。
4、用onstat -k|grep [十六进制] 找到相应的锁,并记录相对应的owner号,此owner号表示进行此操作的用户进程,找到rowid为0的记录(如果有的话)。
5、用onstat -u|grep [owner号] 找到相应的用户进程。
6、如果想看看到底是哪个语句产生的锁,用:onstat -g ses [owner号] 查看语句。或者用onmode -z [owner号]杀之。
谢谢楼上的,解决了我找了很久的问题。不过最后一点是session id
4.如果您执行SQL语句时候出现下面的错误提示:
244: Could not do a physical-order read tofetch next row.
113: ISAM error: the file is locked.
毫无疑问,您要访问的表被别人锁住了。
如果您的使用了set lock mode to wait 语句,onstat -u 命令可以报告出会话在等待锁资源的信息(
标志位“L”),如:
c0000000379015e8 L--PR-- 4626 informix tJc0000000006e45f0 20 1 0 0
超时后报错:
244: Could not do a physical-order read tofetch next row.
154: ISAM error: Lock Timeout Expired
那么,怎么样找出是谁锁住了这个表呢?介绍一个小技巧,执行下面SQL语句:
DATABASE sysmaster;
SELECT owner FROM syslocks WHEREtabname="表名";
得到的owner就是加锁的会话号SID,于是我们就可以使用 onstat -g ses SID 命令查看该会话的信息,
包括是哪个用户、执行了什么SQL语句。还可以通过DBA身份使用onmode -z 命令杀断该会话。
不过方法真的不错,比我的好多了:
1、发现锁表(以tea为例)。
2、在systables中找出tea对应的partnum。
3、用计算器将此数转换成十六进制。
4、用onstat -k|grep [十六进制] 找到相应的锁,并记录相对应的owner号,此owner号表示进行此操作的用户进程。
5、用onstat -u|grep [owner号] 找到相应的用户进程。
6、如果想看看到底是哪个语句产生的锁,用:onstat -g ses [owner号] 查看语句。或者用onmode -z [owner号]杀之。
5.我有一个表,再用ISQL查询时,提示记录被锁定,查不出任可内容,用unlock table 表名,又提示我表未被我锁定。
确认为表中的某一记录被锁定了。在不重启数据库和表数据情况下,怎样解锁。
记录应该是被其他进程的数据库访问锁住了,
只能找出源头,释放锁才行。
解锁步骤:
1、发现锁表(以tpm_radio_bts为例)。
2、在systables中找出tpm_radio_bts对应的partnum。
3、用计算器将此数转换成十六进制。
4、用onstat -k|grep [十六进制] 找到相应的锁,并记录相对应的owner号,此owner号表示进行此操作的用户进程。
5、用onstat -u|grep [owner号] 找到相应的用户进程。
6、如果想看看到底是哪个语句产生的锁,用:onstat -g ses [owner号] 查看语句。或者用onmode -z [owner号]杀之。
6.怎样查看数据库现在用的是什么锁?怎样设置informix的锁? 我现在要把一个表从页级锁改为记录琐该怎么办啊?
1、看表的锁级别
(1)oncheck -ptdatabase_name:table_name
(2)select tabname, locklevel fromsystables where ...
2、设置锁级别
alter tablet_test lock mode (ROW)
本文出自 “bilingling” 博客,请务必保留此出处http://bilingling.blog.51cto.com/11578217/1837201
原文地址:http://bilingling.blog.51cto.com/11578217/1837201