数据库表锁了,有没有什么脚本可以查看哪些表被锁。 数据库表锁了,有没有什么脚本可以查看哪些表被锁。 要如何解锁呢?征集~~~~ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://bbs.chinaunix.net/archiver/?tid-379040.html这个你参考一下。 select * from v$locked_object; 锁表检查锁与等待,如果发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待以下的语句可以查询到谁锁了表,而谁在等待。SELECT /*+ rule */ LPAD(' ', DECODE(L.XIDUSN, 0, 3, 0)) || L.ORACLE_USERNAME USER_NAME, O.OWNER, O.OBJECT_NAME, O.OBJECT_TYPE, --DECODE(L.TYPE, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', NULL) LOCK_LEVEL, Decode(L.Locked_Mode,0,'[0] none', 1,'[1] null 空', 2,'[2] Row-S 行共享(RS):共享表锁,sub share ', 3,'[3] Row-X 行独占(RX):用于行的修改,sub exclusive ', 4,'[4] Share 共享锁(S):阻止其他DML操作,share', 5,'[5] S/Row-X 共享行独占(SRX):阻止其他事务操作,share/sub exclusive ', 6,'[6] exclusive 独占(X):独立访问使用,exclusive ', '['||L.Locked_Mode||'] Other Lock') LockMode, S.SID, S.SERIAL#, S.sql_address, S.sql_hash_value FROM V$LOCKED_OBJECT L, DBA_OBJECTS O, V$SESSION SWHERE L.OBJECT_ID = O.OBJECT_ID AND L.SESSION_ID = S.SIDORDER BY O.OBJECT_ID, XIDUSN DESC; 锁类型检查用户锁,数据库的锁有的时候是比较耗费资源的,特别是发生锁等待的时候,我们必须找到发生等待的锁,有可能的话,杀掉该进程。 这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。 可以通过《删除回话及进程》来杀掉会话 SELECT /*+ rule */ S.USERNAME, DECODE(L.TYPE, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', NULL) LOCK_LEVEL, Decode(L.LMode,0,'[0] none', 1,'[1] null 空', 2,'[2] Row-S 行共享(RS):共享表锁,sub share ', 3,'[3] Row-X 行独占(RX):用于行的修改,sub exclusive ', 4,'[4] Share 共享锁(S):阻止其他DML操作,share', 5,'[5] S/Row-X 共享行独占(SRX):阻止其他事务操作,share/sub exclusive ', 6,'[6] exclusive 独占(X):独立访问使用,exclusive ', '['||L.LMode||'] Other Lock') LockMode, O.OWNER, O.OBJECT_NAME, O.OBJECT_TYPE, S.SID, S.SERIAL#, S.TERMINAL, S.MACHINE, S.PROGRAM, S.OSUSER, S.sql_address, S.sql_hash_value FROM V$SESSION S, V$LOCK L, DBA_OBJECTS OWHERE L.SID = S.SID AND L.ID1 = O.OBJECT_ID(+) AND S.USERNAME IS NOT NULL 查看当前正在执行的等待情况SELECT TA.sid , TA.seq# , TB.Username , TB.Terminal , TB.Program , Decode(TB.Command,0 ,'[ 0] NoCommand', 1 ,'[ 1] CreateTable', 2 ,'[ 2] Insert', 3 ,'[ 3] Select', 6 ,'[ 6] Update', 7 ,'[ 7] Delete', 9 ,'[ 9] CreateIndex', 15,'[15] AlterTable', 21,'[21] CreateView', 23,'[23] ValidateIndex', 35,'[35] AlterDatabase', 39,'[39] CreateTablespace', 41,'[41] DropTablespace', 40,'[40] AlterTablespace', 53,'[53] DropUser', 62,'[62] AnalyzeTable', 63,'[63] AnalyzeIndex', TB.Command || ':Other') Command, DECODE(TA.event,'db file scattered read','通表扫描', 'db file sequential read','索引扫描', 'latch free','latch contention', 'free buffer waits','等待DBWR 清除弄脏块', 'log file sync','LGWR写COMMIT或ROLLBACK数据', 'write complete waits','等待DBWR写', 'buffer busy wait','可能是FreeList竞争', TA.event) Event, TA.p1text,TA.p1 ,TA.p1raw , TA.p2text,TA.p2 ,TA.p2raw , TA.p3text,TA.p3 ,TA.p3raw , TA.wait_time , TA.seconds_in_wait, TA.state, TB.sql_address, TB.sql_hash_value FROM v$session_wait TA, v$session TBWHERE --TB.terminal='FUTURE-MGET' AND TA.SID = TB.SID AND TA.event NOT LIKE '% timer' AND TA.event NOT LIKE 'rdbms ipc message' AND TA.event NOT LIKE 'SQL*Net %' select b.owner,b.object_name,b.object_type from v$locked_object a,All_Objects b WHERE a.OBJECT_ID=b.object_id 哈哈 楼主你使用以上的查询语句得到对应的SID然后查询V$SESSION中WHERE SID= 查询得到的SIDSELECT * FROM V$SESSION WHERE SID ='XXX';这个表里有2个栏位sid,serial#然后使用alter system kill session ''sid,serial#'; ora存储过程 对表进行export,lock? 在存储过程中修改密码的问题? 求教数据库同步的问题 请问行家这个SQL怎么写呀!(难呀。。。。) 求SQL语句,查询每名学生成绩的最新记录。 关于将access中的表导入到oracle数据库中的问题? 请教一个触发器执行顺序的小问题: 请问Oracle是如何实现乘方的 求助,数据库 建表, 看看该怎样建表呢 oracle lite 怎么安装?为什么9iwindows版的老连接不到数据库,说服务名不正确? pl/sql 按F5出来的是执行计划的结果可是小弟我看不懂
这个你参考一下。
查询到谁锁了表,而谁在等待。
SELECT /*+ rule */
LPAD(' ', DECODE(L.XIDUSN, 0, 3, 0)) || L.ORACLE_USERNAME USER_NAME,
O.OWNER,
O.OBJECT_NAME,
O.OBJECT_TYPE,
--DECODE(L.TYPE, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', NULL) LOCK_LEVEL,
Decode(L.Locked_Mode,0,'[0] none',
1,'[1] null 空',
2,'[2] Row-S 行共享(RS):共享表锁,sub share ',
3,'[3] Row-X 行独占(RX):用于行的修改,sub exclusive ',
4,'[4] Share 共享锁(S):阻止其他DML操作,share',
5,'[5] S/Row-X 共享行独占(SRX):阻止其他事务操作,share/sub exclusive ',
6,'[6] exclusive 独占(X):独立访问使用,exclusive ',
'['||L.Locked_Mode||'] Other Lock') LockMode,
S.SID,
S.SERIAL#,
S.sql_address,
S.sql_hash_value
FROM V$LOCKED_OBJECT L, DBA_OBJECTS O, V$SESSION S
WHERE L.OBJECT_ID = O.OBJECT_ID
AND L.SESSION_ID = S.SID
ORDER BY O.OBJECT_ID, XIDUSN DESC;
等待的锁,有可能的话,杀掉该进程。
这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,任何DML语句其实产生了两个锁,
一个是表锁,一个是行锁。
可以通过《删除回话及进程》来杀掉会话
SELECT /*+ rule */
S.USERNAME,
DECODE(L.TYPE, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', NULL) LOCK_LEVEL,
Decode(L.LMode,0,'[0] none',
1,'[1] null 空',
2,'[2] Row-S 行共享(RS):共享表锁,sub share ',
3,'[3] Row-X 行独占(RX):用于行的修改,sub exclusive ',
4,'[4] Share 共享锁(S):阻止其他DML操作,share',
5,'[5] S/Row-X 共享行独占(SRX):阻止其他事务操作,share/sub exclusive ',
6,'[6] exclusive 独占(X):独立访问使用,exclusive ',
'['||L.LMode||'] Other Lock') LockMode,
O.OWNER,
O.OBJECT_NAME,
O.OBJECT_TYPE,
S.SID,
S.SERIAL#,
S.TERMINAL,
S.MACHINE,
S.PROGRAM,
S.OSUSER,
S.sql_address,
S.sql_hash_value
FROM V$SESSION S, V$LOCK L, DBA_OBJECTS O
WHERE L.SID = S.SID
AND L.ID1 = O.OBJECT_ID(+)
AND S.USERNAME IS NOT NULL
TA.seq# ,
TB.Username ,
TB.Terminal ,
TB.Program ,
Decode(TB.Command,0 ,'[ 0] NoCommand',
1 ,'[ 1] CreateTable',
2 ,'[ 2] Insert',
3 ,'[ 3] Select',
6 ,'[ 6] Update',
7 ,'[ 7] Delete',
9 ,'[ 9] CreateIndex',
15,'[15] AlterTable',
21,'[21] CreateView',
23,'[23] ValidateIndex',
35,'[35] AlterDatabase',
39,'[39] CreateTablespace',
41,'[41] DropTablespace',
40,'[40] AlterTablespace',
53,'[53] DropUser',
62,'[62] AnalyzeTable',
63,'[63] AnalyzeIndex',
TB.Command || ':Other') Command,
DECODE(TA.event,'db file scattered read','通表扫描',
'db file sequential read','索引扫描',
'latch free','latch contention',
'free buffer waits','等待DBWR 清除弄脏块',
'log file sync','LGWR写COMMIT或ROLLBACK数据',
'write complete waits','等待DBWR写',
'buffer busy wait','可能是FreeList竞争',
TA.event) Event,
TA.p1text,TA.p1 ,TA.p1raw ,
TA.p2text,TA.p2 ,TA.p2raw ,
TA.p3text,TA.p3 ,TA.p3raw ,
TA.wait_time ,
TA.seconds_in_wait,
TA.state,
TB.sql_address,
TB.sql_hash_value
FROM v$session_wait TA,
v$session TB
WHERE --TB.terminal='FUTURE-MGET' AND
TA.SID = TB.SID AND
TA.event NOT LIKE '% timer' AND
TA.event NOT LIKE 'rdbms ipc message' AND
TA.event NOT LIKE 'SQL*Net %'
from v$locked_object a,All_Objects b
WHERE a.OBJECT_ID=b.object_id
然后查询V$SESSION中WHERE SID= 查询得到的SID
SELECT * FROM V$SESSION WHERE SID ='XXX';这个表里有2个栏位sid,serial#
然后使用alter system kill session ''sid,serial#';