怎么知道数据库表已经锁表了

有什么命令?这个是什么意思:select*fromv$locked_object... 有什么命令?
这个是什么意思:
select * from v$locked_object
展开
 我来答
大野瘦子
高粉答主

2019-10-10 · 繁杂信息太多,你要学会辨别
知道小有建树答主
回答量:1227
采纳率:100%
帮助的人:34.5万
展开全部

可直接在mysql命令行执行:show engine innodb status\G;

查看造成死锁的sql语句,分析索引情况,然后优化sql然后show processlist;

show status like ‘%lock%’

show OPEN TABLES where In_use > 0; 这个语句记录当前锁表状态 

另外可以打开慢查询日志,linux下打开需在my.cnf的[mysqld]里面加上以下内容:

slow_query_log=TRUE(有些mysql版本是ON)

slow_query_log_file=/usr/local/mysql/slow_query_log.txt

long_query_time=3

select *from v$locked_object:可以获得被锁的对象的object_id及产生锁的会话sid。通过查询结果中的object_id,可以查询到具体被锁的对象。

扩展资料:

注意事项

也可以直接把这几个视图和表关联起来,在查询结果中直接得到“alter system kill session 'sid, serial#'”这样的方便的kill sessoin命令。

如果执行kill session命令后,锁并没有除掉,session依然存在。这种情况,通过select spid from v$process where addr in(select paddr from v$session where sid = &sid)查询到oracle会话在服务器上的pid,然后登陆到服务器上,执行kill -9 pid这样就能杀掉进程解锁了。

迷o_o蝶
推荐于2017-09-10 · TA获得超过262个赞
知道小有建树答主
回答量:163
采纳率:0%
帮助的人:103万
展开全部
先回答你的问题:

select *from v$locked_object;
可以获得被锁的对象的object_id及产生锁的会话sid。
通过查询结果中的object_id,可以查询到具体被锁的对象

再给你看看我查到的一些关于锁的资料:

锁有以下几种模式:
0:none
1:null 空
2:Row-S 行共享(RS):共享表锁
3:Row-X 行专用(RX):用于行的修改
4:Share 共享锁(S):阻止其他DML操作
5:S/Row-X 共享行专用(SRX):阻止其他事务操作
6:exclusive 专用(X):独立访问使用
数字越大锁级别越高, 影响的操作越多。

一般的查询语句如select ... from ... ;是小于2的锁, 有时会在v$locked_object出现。

select ... from ... for update; 是2的锁。

当对话使用for update子串打开一个游标时,
所有返回集中的数据行都将处于行级(Row-X)独占式锁定,
其他对象只能查询这些数据行,不能进行update、delete或select...for update操作。

insert / update / delete ... ; 是3的锁。

没有commit之前插入同样的一条记录会没有反应,
因为后一个3的锁会一直等待上一个3的锁, 我们必须释放掉上一个才能继续工作。

创建索引的时候也会产生3,4级别的锁。

locked_mode为2,3,4不影响DML(insert,delete,update,select)操作,
但DDL(alter,drop等)操作会提示ora-00054错误。

有主外键约束时 update / delete ... ; 可能会产生4,5的锁。

DDL语句时是6的锁。

以DBA角色, 查看当前数据库里锁的情况可以用如下SQL语句:

select object_id,session_id,locked_mode from v$locked_object;

select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;

如果有长期出现的一列,可能是没有释放的锁。

我们可以用下面SQL语句杀掉长期没有释放非正常的锁:

alter system kill session 'sid,serial#';

如果出现了锁的问题, 某个DML操作可能等待很久没有反应。

当你采用的是直接连接数据库的方式,
也不要用OS系统命令 $kill process_num 或者 $kill -9 process_num来终止用户连接,
因为一个用户进程可能产生一个以上的锁, 杀OS进程并不能彻底清除锁的问题。

记得在数据库级别用alter system kill session 'sid,serial#';杀掉不正常的锁。

这里还讲了一些:
http://zhidao.baidu.com/question/17561017.html?si=3
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wei520juju
2008-05-13 · TA获得超过1474个赞
知道答主
回答量:132
采纳率:0%
帮助的人:0
展开全部
Oracle8i 查杀锁表进程
查看当前数据库中存在的锁:
SQL> select *from v$locked_object;
可以获得被锁的对象的object_id及产生锁的会话sid。
通过查询结果中的object_id,可以查询到具体被锁的对象:
SQL> select * from all_objects where object_id = &object_id;
可以获得具体的表名等对象的名称。
然后,你可以分析出哪个是你所要找的锁。
SQL> select sid, serial# from v$session where sid = &sid;
SID SERIAL#
-------------------- --------------------
75 183
然后再V$session中找到sid, serial#,执行下面的命令,杀掉会话解锁:
SQL> alter system kill session '75, 183';
当然你也可以直接把这几个视图和表关联起来,在查询结果中直接得到“alter system kill session 'sid, serial#'”这样的方便的kill sessoin命令。
如果你执行kill session命令后,锁并没有除掉,session依然存在。这种情况,
通过select spid from v$process where addr in(select paddr from v$session where sid = &sid)
查询到oracle会话在服务器上的pid(上面的spid),然后登陆到服务器上,执行
kill -9 pid
这样就能杀掉进程解锁了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式