1. 程式人生 > >Oracle的KILL鎖表及清除sess…

Oracle的KILL鎖表及清除sess…

一、處理過程

      1.通過查找出已被鎖定的資料庫表及相關的sid、serial#及spid:

        select object_name as 物件名稱,s.sid,s.serial#,p.spid as 系統程序號

        from v$locked_object l , dba_objects o , v$session s , v$process p

        where l.object_id=o.object_id and l.session_id=s.sid and s.paddr=p.addr;

        2.在資料庫中滅掉相關session:

       alter system kill session 'sid,serial#';

      --sid及serial#為第一步查出來的資料

        3.從系統中滅掉與該session對應的程序:

       kill -9 spid;

      --spid為第一步中查出來的系統程序號

      經過以上操作之後重新對之前鎖定的物件進行操作應該就可以了。

二、使用了相關表的基本介紹

  • V$LOCKED_OBJECT中的列說明:

    XIDUSN:回滾段號

    XIDSLOT:槽號

    XIDSQN:序列號

    OBJECT_ID:被鎖物件ID

    SESSION_ID:持有鎖的sessionID

    ORACLE_USERNAME:持有鎖的Oracle 使用者名稱

    OS_USER_NAME:持有鎖的作業系統 使用者名稱

    PROCESS:作業系統程序號

    LOCKED_MODE:鎖模式

  • dba_objects的列說明(網上找的,懶得翻譯了^_^)

    OWNER

              Username of the owner of the object

        OBJECT_NAME

              Name of the object

        SUBOBJECT_NAME

              Name of the sub-object (for example,partititon)

        OBJECT_ID

              Object number of the object

        DATA_OBJECT_ID

              Object number of the segment which contains the object

        OBJECT_TYPE

              Type of the object

        CREATED

              Timestamp for the creation of the object

        LAST_DDL_TIME

              Timestamp for the last DDL change (including GRANT and REVOKE) to the object

        TIMESTAMP

              Timestamp for the specification of the object

        STATUS

              Status of the object

        TEMPORARY

              Can the current session only see data that it place in this object itself?

        GENERATED

              Was the name of this object system generated?

        SECONDARY

              Is this a secondary object created as part of icreate for domain indexes?

  • v$session的說明

    V$SESSION是基礎資訊檢視,用於找尋使用者SID或SADDR

    常用列:

    SID:SESSION標識

    SERIAL#:如果某個SID又被其它的session使用的話則此數值自增加(當一個SESSION結束,另一個SESSION開始並使用了同一個SID)。

    AUDSID:審查session ID唯一性,確認它通常也用於當尋找並行查詢模式

    USERNAME:當前session在oracle中的使用者名稱。

    STATUS:這列用來判斷session狀態是:

        Achtive:正執行SQL語句(waiting for/using a resource)

        Inactive:等待操作(即等待需要執行的SQL語句)

        Killed:被標註為刪除

  • v$process檢視

    v$process檢視包含當前系統Oracle執行的所有程序資訊。常被用於將Oracle或服務程序的作業系統程序ID與資料庫session之間建立聯絡。

    常用列:

    ADDR:程序物件地址

    PID:oracle程序ID

    SPID:作業系統程序ID

詳解:

一些ORACLE中的程序被殺掉後,狀態被置為"killed",但是鎖定的資源很長時間不釋放,有時實在沒辦法,只好重啟資料庫。但是shutdown immediate又怕可能程序殺不掉會一直停留在shutdown immediate,直接shutdown abort又怕損壞資料庫。
現在提供一種方法解決這種問題,那就是在ORACLE中殺不掉的,在OS一級再殺。
一些ORACLE中的程序被殺掉後,狀態被置為"killed",但是鎖定的資源很長時間不釋放,有時實在沒辦法,只好重啟資料庫。但是shutdown immediate又怕可能程序殺不掉會一直停留在shutdown immediate,直接shutdown abort又怕損壞資料庫。
現在提供一種方法解決這種問題,那就是在ORACLE中殺不掉的,在OS一級再殺。
1.下面的語句用來查詢哪些物件被鎖:
SELECT S.USERNAME,S.OSUSER,S.SID,S.SERIAL#,P.SPID FROM V$SESSION S,V$PROCESS
P WHERE S.PADDR=P.ADDR AND S.USERNAME IS NOT NULL;
2.下面的語句用來殺死一個程序:
alter system kill session 'sid,serial#';
【注】以上兩步,可以通過Oracle的管理控制檯來執行。
如果出現題目的錯誤,可以
select a.spid,b.sid,b.serial#,b.username from v$process a,v$session b where a.addr=b.paddr and b.status='KILLED' ;
3.如果利用上面的命令殺死一個程序後,程序狀態被置為"killed",但是鎖定的資源很長時間沒有被釋放,那麼可以在os一級再殺死相應的程序(執行緒),首先執行下面的語句獲得程序(執行緒)號:
select spid, osuser, s.program from v$session s,v$process p where
s.paddr=p.addr and s.sid=33 (33就是上面的sid)
4.在OS上殺死這個程序(執行緒):
1)在unix上,用root身份執行命令:
#kill -9 12345(即第3步查詢出的spid)
2)在windows(unix也適用)用orakill殺死執行緒,orakill是oracle提供的一個可執行命令,語法為:
orakill sid thread
其中:
sid:表示要殺死的程序屬於的例項名
thread:是要殺掉的執行緒號,即第3步查詢出的spid。
例:c:>orakill orcl 12345
Ps:這裡要注意的是kill OS程序是在服務端操作,而不是你程式所在客戶機。

相關推薦

Oracle的KILL清除sess

一、處理過程       1.通過查找出已被鎖定的資料庫表及相關的sid、serial#及spid:         select object_name as 物件名稱,s.sid,s.serial#,p.spid as 系統程序號         from v$locked_object l , dba

pl/sql查看

system sel alter oracl acl locked objects _id obj ① 查看用戶鎖表 select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_

mysql事務處理

首先使用命令檢視鎖的操作 mysql>show processlist 找到有lock的記錄,用 kill #id將對應lock的操作的記錄刪除,一般這樣就可以將鎖問題解決。 可是在生產環境中遇到一個問題,就是按上面的方法把鎖都刪了,程式可以正常跑了,可是在給一個表新增欄

Oracle查詢處理

--鎖表查詢,需要有足夠多的許可權 SELECT object_name, machine, s.sid, s.serial#  FROM gv$locked_object l, dba_object

數據庫阻塞的原因和解決辦法

itl 版本號 由於 java 實際應用 存儲 exc 計劃 sql語句 問題說明 當多個用戶並發地存取數據時,在數據庫中就會產生多個事務同時存取同一數據的情況。若對並發操作不加控制就可能會讀取和存儲不正確的數據,破壞數據庫的一致性。加鎖是實現數據庫並發控制的一個非常

Oracle查詢被方法

v$lock req 查找 rom 方法 session lock acl oracle 1.用下列sql語句查詢操作不當引起鎖表的進程的SESSION_ID及USERNAME SELECT S.SID SESSION_ID, S.USERNAME, DECODE(LMOD

數據庫查詢釋放

bject bsp cnblogs div lock v$lock col ssi where 鎖表查詢 SELECT object_name, machine, s.sid, s.serial# FROM gv$locked_object l, dba_object

原因解決思路

data- 操作數 -m mit sdn 事物 i/o 之間 art 1、鎖表發生在insert update 、delete 中 2、鎖表的原理是 數據庫使用獨占式封鎖機制,當執行上面的語句時,對表進行鎖住,直到發生commite 或者 回滾 或者退出數據庫用戶

ORACLE 的解決方法查詢引起SQL語句方法

1. ORACLE中檢視當前系統中鎖表情況 select * from v$locked_object 可以通過查詢v$locked_object拿到sid和objectid,然後用sid和v$session連結串列查詢是哪裡鎖的表,用v$sessio

MySQL檢視某庫大小情況

查詢所有資料庫佔用磁碟空間大小的SQL語句: 語句如下: 1 2 3 4 5 select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2)

常見的情況解決方法

常見的表死鎖情況及解決方法 1、死鎖的第一種情況 一個使用者A 訪問表A(鎖住了表A),然後又訪問表B;另一個使用者B 訪問表B(鎖住了表B),然後企圖訪問表A;這時使用者A由於使用者B已經鎖住表B,它必須等待使用者B釋放表B才能繼續,同樣使用者B要等使用者A釋放表A才能繼續,這就死鎖就產生了。

MySQL()、PHP(檔案)機制應用場景

模擬高併發訪問一個指令碼:apache安裝檔案的bin/ab.exe可以模擬併發量 C:\phpStudy\Apache\bin>ab.exe -c 10 -n 10 http://localhost/try.php // -c 模擬多少併發量 -n 一共請求多少次 http://請求的指令

原因如何處理

1、鎖表發生在insert  update 、delete 中   2、鎖表的原理是 資料庫使用獨佔式封鎖機制,當執行上面的語句時,對錶進行鎖住,直到發生commite 或者 回滾 或者退出資料庫使用者 3、鎖表的原因   第一、 A程式執行了對 tableA 的 inser

ORACLE 如何查詢被鎖定如何解釋放session

一: SELECT object_name, machine, s.sid, s.serial#  FROM gv$locked_object l, dba_objects o, gv$session

oracle查詢程序殺死程序

1.查詢當前鎖表程序數 select count(*) from v$locked_object lo, dba_objects ao, v$session sess where ao.object_id = lo.object_id   and lo.session_id

Oracle查詢被的儲存過程

查詢鎖表的Session  select sess.sid,     sess.serial#,     lo.oracle_username,     lo.os_user_name,     ao.object_name,     lo.locked_mode     from v$locked_ob

查詢程序殺掉程序

SQLA: select session.sid,session.serial#,lo.oracle_username,lo.os_user_name,ao_object_name,lo.locked_mode from v$locked_object lo,dba_obj

mysql機制相關優化

(該文章為方便自己查閱,也希望對大家有所幫助,轉載於網際網路) 1、 鎖機制 當前MySQL支援 ISAM, MyISAM, MEMORY (HEAP) 型別表的表級鎖,BDB 表支援頁級鎖,InnoDB 表支援行級鎖。 很多時候,可以通過經驗來猜測什麼樣的鎖對應用程式更合適

Oracle查詢kill

Oracle在操作過程中,鎖表是時常發生的事情,當遇到鎖表時,該如何查詢鎖表session及程序,如何解鎖是經常困擾的事情,以下將介紹具體的操作步驟及方法供參考學習: 鎖表查詢的程式碼有以下的形式: select count(*) from v$locked_obje

資料庫原因解決思路

1、鎖表發生在insert update 、delete 中 2、鎖表的原理是 資料庫使用獨佔式封鎖機制,當執行上面的語句時,對錶進行鎖住,直到發生commite 或者 回滾 或者退出資料庫使用者 3、鎖表的原因 第一、 A程式執行了對 tableA 的 in