问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-24 04:14

我来回答

3个回答

热心网友 时间:2022-04-07 16:09

可直接在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这样就能杀掉进程解锁了。

热心网友 时间:2022-04-07 17:27

先回答你的问题:

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

热心网友 时间:2022-04-07 19:02

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
这样就能杀掉进程解锁了。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
洛阳火车站到洛阳关林的钢厂怎么坐公车去?钢厂目前是否分为三个小... 李永昌的《桃花运》 歌词 失眠特效药有哪些 失眠有什么快速特效药 长期失眠用什么药最好?失眠治疗特效药有哪些 失眠怎么办办,有没有什么特效药 本人严重失眠,有特效药吗? 长期焦虑失眠怎么办?有没有好的特效药? 离婚了,小孩抚养费对方拖着不给,玩失踪,怎么办? 小孩抚养费前夫每月都拖着不给怎么解决 oracle怎样查看死锁的表? 花胶汤是粤菜之一,自己在家怎么炖制花胶汤? 鲫鱼花胶汤怎么做 花胶怎么炖最好?如何炖出花胶的营养价值 煲花胶汤用什么材料 苹果手机是否可以寄回厂家维修? 长春医大一院能不能治尖锐湿疣 长春治疗湿疣用什么方法 尖锐湿疣怎么治疗才能彻底痊愈? 怎样申诉长城宽带网模板 刑事案件二审不服如何网上申诉 车辆违章怎么申诉,可以在网上吗?还是去车管所 中医怎么解释尖锐湿疣 刑事案件怎样通过网络申诉?具体如何操作? 民事案件怎样网上申诉? 长春中医院红旗街能不能治尖锐湿疣 中药治疗尖锐湿疣? 怎么在网上申诉 长春吉林省中医中药研究院附属医院治疗口腔尖锐湿疣的 在淘宝网上买东西被骗了,怎么能申诉卖家?是否能把损失找回? 查询oracle 哪个表被锁了 在辩论赛中如何功辩? oracle表在什么情况下会被锁住 辩论赛攻辩的设计有什么技巧啊 oracle怎么查看表死锁住的原因 辩论赛的攻辩问题应该怎么提? 辩论赛取胜的技巧有那些 辩论赛技巧常用句子有哪些? 辩论赛的技巧(尤其是反方) oracle如何查看是因为什么锁表 怎样掌握辩论技巧? 咨询一个问题:oracle产生了死锁,很多表被锁住了,如何查找引起死锁的源头... 辩论赛有什么厉害的战术? oracle表被锁了怎么处理? 辩论流程和辩论技巧 辩论赛攻辩问题 辩论赛的攻辩问题应该怎么问比较好,有没有一些套路? 辩论赛技巧常用句子 辩论赛的一辩有什么技巧吗 民法典合同无效怎么处理