数据库表锁了,有没有什么脚本可以查看哪些表被锁。 要如何解锁呢?征集~~~~

解决方案 »

  1.   

    http://bbs.chinaunix.net/archiver/?tid-379040.html
    这个你参考一下。
      

  2.   

    select * from v$locked_object;
      

  3.   

    锁表检查锁与等待,如果发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待以下的语句可以
    查询到谁锁了表,而谁在等待。
    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;
      

  4.   

    锁类型检查用户锁,数据库的锁有的时候是比较耗费资源的,特别是发生锁等待的时候,我们必须找到发生
    等待的锁,有可能的话,杀掉该进程。
      
      这个语句将查找到数据库中所有的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
      

  5.   

    查看当前正在执行的等待情况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      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 %'
      

  6.   

    select b.owner,b.object_name,b.object_type 
      from v$locked_object a,All_Objects b
     WHERE a.OBJECT_ID=b.object_id
      

  7.   

    哈哈 楼主你使用以上的查询语句得到对应的SID
    然后查询V$SESSION中WHERE SID= 查询得到的SID
    SELECT * FROM V$SESSION WHERE SID ='XXX';这个表里有2个栏位sid,serial#
    然后使用alter system kill session ''sid,serial#';