隨筆-57  評(píng)論-117  文章-1  trackbacks-0
          -- 死鎖查詢(xún)語(yǔ)句
          SELECT    bs.username "Blocking User", bs.username "DB User",
                    ws.username "Waiting User", bs.SID "SID", ws.SID "WSID",
                    bs.serial# "Serial#", bs.sql_address "address",
                    bs.sql_hash_value "Sql hash", bs.program "Blocking App",
                    ws.program "Waiting App", bs.machine "Blocking Machine",
                    ws.machine "Waiting Machine", bs.osuser "Blocking OS User",
                    ws.osuser "Waiting OS User", bs.serial# "Serial#",
                    ws.serial# "WSerial#",
                    DECODE (wk.TYPE,
                            'MR', 'Media Recovery',
                            'RT', 'Redo Thread',
                            'UN', 'USER Name',
                            'TX', 'Transaction',
                            'TM', 'DML',
                            'UL', 'PL/SQL USER LOCK',
                            'DX', 'Distributed Xaction',
                            'CF', 'Control FILE',
                            'IS', 'Instance State',
                            'FS', 'FILE SET',
                            'IR', 'Instance Recovery',
                            'ST', 'Disk SPACE Transaction',
                            'TS', 'Temp Segment',
                            'IV', 'Library Cache Invalidation',
                            'LS', 'LOG START OR Switch',
                            'RW', 'ROW Wait',
                            'SQ', 'Sequence Number',
                            'TE', 'Extend TABLE',
                            'TT', 'Temp TABLE',
                            wk.TYPE
                           ) lock_type,
                    DECODE (hk.lmode,
                            0, 'None',
                            1, 'NULL',
                            2, 'ROW-S (SS)',
                            3, 'ROW-X (SX)',
                            4, 'SHARE',
                            5, 'S/ROW-X (SSX)',
                            6, 'EXCLUSIVE',
                            TO_CHAR (hk.lmode)
                           ) mode_held,
                    DECODE (wk.request,
                            0, 'None',
                            1, 'NULL',
                            2, 'ROW-S (SS)',
                            3, 'ROW-X (SX)',
                            4, 'SHARE',
                            5, 'S/ROW-X (SSX)',
                            6, 'EXCLUSIVE',
                            TO_CHAR (wk.request)
                           ) mode_requested,
                    TO_CHAR (hk.id1) lock_id1, TO_CHAR (hk.id2) lock_id2,
                    DECODE
                       (hk.BLOCK,
                        0, 'NOT Blocking',          /**//* Not blocking any other processes */
                        1, 'Blocking',              /**//* This lock blocks other processes */
                        2, 'Global',           /**//* This lock is global, so we can't tell */
                        TO_CHAR (hk.BLOCK)
                       ) blocking_others
               FROM v$lock hk, v$session bs, v$lock wk, v$session ws
              WHERE hk.BLOCK = 1
                AND hk.lmode != 0
                AND hk.lmode != 1
                AND wk.request != 0
                AND wk.TYPE(+) = hk.TYPE
                AND wk.id1(+) = hk.id1
                AND wk.id2(+) = hk.id2
                AND hk.SID = bs.SID(+)
                AND wk.SID = ws.SID(+)
                AND (bs.username IS NOT NULL)
                AND (bs.username <> 'SYSTEM')
                AND (bs.username <> 'SYS')
          ORDER BY 1;

          查詢(xún)發(fā)生死鎖的select語(yǔ)句

          select sql_text from v$sql where hash_value in (
              select sql_hash_value from v$session where sid in (select session_id from v$locked_object)
          )

           

          關(guān)于數(shù)據(jù)庫(kù)死鎖的檢查方法

           

          一、數(shù)據(jù)庫(kù)死鎖的現(xiàn)象
          程序在執(zhí)行的過(guò)程中,點(diǎn)擊確定或保存按鈕,程序沒(méi)有響應(yīng),也沒(méi)有出現(xiàn)報(bào)錯(cuò)。


          二、死鎖的原理
          當(dāng)對(duì)于數(shù)據(jù)庫(kù)某個(gè)表的某一列做更新或刪除等操作,執(zhí)行完畢后該條語(yǔ)句不提
          交,另一條對(duì)于這一列數(shù)據(jù)做更新操作的語(yǔ)句在執(zhí)行的時(shí)候就會(huì)處于等待狀態(tài),
          此時(shí)的現(xiàn)象是這條語(yǔ)句一直在執(zhí)行,但一直沒(méi)有執(zhí)行成功,也沒(méi)有報(bào)錯(cuò)。


          三、死鎖的定位方法
          通過(guò)檢查數(shù)據(jù)庫(kù)表,能夠檢查出是哪一條語(yǔ)句被死鎖,產(chǎn)生死鎖的機(jī)器是哪一臺(tái)。

           


          1)用dba用戶(hù)執(zhí)行以下語(yǔ)句

          select username,lockwait,status,machine,program from v$session where sid 
          in (select session_id from v$locked_object)

          如果有輸出的結(jié)果,則說(shuō)明有死鎖,且能看到死鎖的機(jī)器是哪一臺(tái)。字段說(shuō)明:
          Username:死鎖語(yǔ)句所用的數(shù)據(jù)庫(kù)用戶(hù);
          Lockwait:死鎖的狀態(tài),如果有內(nèi)容表示被死鎖。
          Status: 狀態(tài),active表示被死鎖
          Machine: 死鎖語(yǔ)句所在的機(jī)器。
          Program: 產(chǎn)生死鎖的語(yǔ)句主要來(lái)自哪個(gè)應(yīng)用程序。


          2)用dba用戶(hù)執(zhí)行以下語(yǔ)句,可以查看到被死鎖的語(yǔ)句
          select sql_text from v$sql where hash_value in
          (select sql_hash_value from v$session where sid in
          (select session_id from v$locked_object))

           

          四、死鎖的解決方法
               一般情況下,只要將產(chǎn)生死鎖的語(yǔ)句提交就可以了,但是在實(shí)際的執(zhí)行過(guò)程中。用戶(hù)可
          能不知道產(chǎn)生死鎖的語(yǔ)句是哪一句。可以將程序關(guān)閉并重新啟動(dòng)就可以了。
           經(jīng)常在Oracle的使用過(guò)程中碰到這個(gè)問(wèn)題,所以也總結(jié)了一點(diǎn)解決方法。

            

           

               1)查找死鎖的進(jìn)程:

          sqlplus "/as sysdba" (sys/change_on_install)
          SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESS 
          FROM V$LOCKED_OBJECT l,V$SESSION S 
          WHERE l.SESSION_ID=S.SID;

            2)kill掉這個(gè)死鎖的進(jìn)程:

            alter system kill session ‘sid,serial#’; (其中sid=l.session_id)

           

            3)如果還不能解決:

                    select pro.spid from v$session ses, v$process pro where ses.sid=XX and ses.paddr=pro.addr;

             其中sid用死鎖的sid替換:

                 exit
                 ps -ef|grep spid

                 其中spid是這個(gè)進(jìn)程的進(jìn)程號(hào),kill掉這個(gè)Oracle進(jìn)程。

          轉(zhuǎn)自:http://sungang-82.iteye.com/blog/310781



          作者:hoojo
          出處:
          blog:http://blog.csdn.net/IBM_hoojo
                   http://hoojo.cnblogs.com
          本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。


          版權(quán)所有,轉(zhuǎn)載請(qǐng)注明出處 本文出自:
          分享道版權(quán)所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處,謝謝
          posted on 2012-08-31 16:24 hoojo 閱讀(33360) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): DataBaseOracle
          主站蜘蛛池模板: 威信县| 阿勒泰市| 桐庐县| 虹口区| 高要市| 韶关市| 郎溪县| 宁波市| 沁阳市| 鹰潭市| 潜江市| 财经| 永年县| 东阳市| 扶余县| 包头市| 林州市| 尉犁县| 黄浦区| 霞浦县| 凯里市| 永丰县| 即墨市| 阿荣旗| 昭苏县| 奎屯市| 涡阳县| 叙永县| 梁河县| 华坪县| 鄄城县| 佳木斯市| 绥中县| 镇巴县| 大田县| 都安| 漳浦县| 大埔区| 天门市| 邵阳县| 格尔木市|