1. 程式人生 > >oracle 鎖表解決方法

oracle 鎖表解決方法

今天碰到一個問題,有一張表不能操作,很可能是被鎖了,首先想到的是kill session,於是執行了下列的指令碼找到是哪個session有問題:

查看錶是否被鎖

?

1

2

3

4

5

SELECT /*+ rule*/

a.sid, b.owner, object_name, object_type

FROM v$lock a, all_objects b

WHERE TYPE = 'TM'

and a.id1 = b.object_id;

根據上面查詢出的sid,找出對應的serial#:
SELECT sid,serial# FROM v$session WHERE sid = &sid;

發現有一個會話有鎖sid 197,serial# 17,於是執行alter system kill session ‘197,17';大概等了30s中,pl/sql developer報出一個錯誤:ora-00031:標記要終止的會話。

解決方法:查出session的spid

select spid, osuser, s.program from v$session s, v$process p where s.paddr = p.addr and s.sid =197;

1. 在linux上, kill -9 12345 
2. 在windows上,C:\Documents and Settings\gg>orakill orcl 12345

orcl:表示要殺死的程序屬於的例項名 
12345:是要殺掉的執行緒號

ORA-00031: session marked for kill 
Cause: The session specified in an ALTER SYSTEM KILL SESSION command cannot bekilled immediately (because it is rolling back or blocked on a networkoperation), but it has been marked for kill. This means it will be killed as soonas possible after its current uninterruptible operation is done.
Action: No action is required for the session to be killed, but further executionsof the ALTER SYSTEM KILL SESSION command on this session may cause the sessionto be killed sooner.

下面是補充:

oracle中編譯一個包的時候發現,只要一編譯就卡死了,後來使用《oracle查詢、Kill鎖資源的SQL語句》方法查鎖的時候發現包中用到的一些資源一直處於死鎖狀態。後來通過alter system kill session的方法去解鎖,卻發現出現如下圖1所示的問題:
ORA-00031:標記要終止的會話

ORA-00031:標記要終止的會話

後來通過連線上oracle資料庫所在的系統,然後kill掉程序解決,方法如下:

(1)查詢被鎖資源的sid、serial#:

?

1

2

3

4

5

6

7

8

9

SELECT s.sid,

s.serial#,

v.*,

ao.*

FROM v$locked_object v,

all_objects   ao,

v$session    s

WHERE v.object_id = ao.object_id

AND s.sid = v.session_id;

(2)利用上面的SQL查詢出sid和serial#以後,利用下面SQL去kill session:

-- 如有記錄則表示lock,記錄下SID和serial#,將記錄下的SID和serial#替換下面的738,1429,即可接觸lock。
ALTER SYSTEM KILL SESSION '738,1429';

(3)如果上面的kill session報如上圖1的錯誤,那麼再用下面的SQL去查處session對應的spid:

?

1

2

3

4

5

6

7

SELECT p.spid,

s.osuser,

s.program

FROM v$session s,

v$process p

WHERE s.paddr = p.addr

AND s.sid = 37; -- 替換成相應的session_id

(4)連上oracle資料庫所在的系統(我這裡是Linux系統),記錄下上面查到的spid(假設這裡查到的是1133),然後使用下面語句來kill掉程序:

kill -9 1133

等待一會,等程序kill成功以後,再去查鎖即可發現資源已經被釋放。如果oracle安裝在Windows系統上,請使用Windows系統的kill程序的方式去殺掉程序。

相關推薦

oracle 解決方法

今天碰到一個問題,有一張表不能操作,很可能是被鎖了,首先想到的是kill session,於是執行了下列的指令碼找到是哪個session有問題: 查看錶是否被鎖 ? 1 2 3 4 5 SELECT /*+

MySQL解決方法(轉)

一、我的處理過程 1、查程序,主要是查詢被鎖表的那個程序的ID SHOW PROCESSLIST; 2、kill掉鎖表的程序ID KILL   10866;//後面的數字即時程序的ID 網上找了些資料,瞭解了一下,先分享一下: 二、mysql的鎖表問題 SHOW PROCESSLIST檢視資料庫中表的狀態

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

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

ORACLE暴力解決方法

一、概述 二、方法 1、找出被鎖物件 select l.session_id,o.owner,o.object_name from v$locked_object l,dba_objects o wh

oracle 出現不能查詢sql時候, 解決方法

select object_name as 物件名稱,s.sid,s.serial#,p.spid as 系統程序號from v$locked_object l , dba_objects o , v$session s , v$process pwhere l.object

Oracle查詢和解方法

數據庫查詢 lar 關系 鎖級別 share 技術 獲取 suse b2c 數據庫操作語句的分類 DDL:數據庫模式定義語言,關鍵字:create DML:數據操縱語言,關鍵字:Insert、delete、update DCL:數據庫控制語言 ,關鍵字:grant

oracle解決方法

1、 關於死鎖 死鎖是指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序 2、 怎麼解決死鎖 檢視引起死鎖的語句:

SqlServer解決方法(轉)

前些天寫一個儲存過程,儲存過程中使用了事務,後來我把一些程式碼註釋掉來進行除錯找錯,突然發現一張表被鎖住了,原來是建立事務的程式碼忘記註釋掉。本文表鎖住了的解決方法。 其實不光是上面描述的情況會鎖住表,還有很多種場景會使表放生死鎖,解鎖其實很簡單,下面用一個示例來講解: 1 首先建立一個測試用的表: CR

insert delete 語句卡死,oracle資料庫解決

delete table XXX where ……,卡死。 select * from XXX for update 的時候沒有commit,oracle將該記錄鎖住了。 先查詢鎖定記錄 Sql

Oracle資料庫"記錄被另一個使用者住"解決方法

1、先來看看為什麼會出鎖住:    資料庫是一個多使用者使用的共享資源。當多個使用者併發地存取資料時,在資料庫中就會產生多個事務同時存取同一資料的情況。若對併發操作不加控制就可能會讀取和儲存不正確的資料,破壞資料庫的一致性。    加鎖是實現資料庫併發控制的一個非常重要的技術

Oracle DML和DDL解決方法

二、DDL鎖解決辦法 假設鎖在會話1上 session1: create or replace procedure p_test is begin   dbms_lock.sleep(1000); end; call p_test(); 系統現在無法完成DML操作,這個時候要人工造成一個鎖等待衝突的現象 se

for update造成的Oracle與解

執行 lec 如果 pl/sql 查看 數據 system oracle log 我遇到的情況: 當使用select語句查詢表時,後面跟著for update , select * from table for update 當修改表中數據,但是沒有com

oracle問題

ria pan family objects -s 問題 釋放 select serial 查詢是否有鎖表: --鎖表查詢 SELECT object_name, machine, s.sid, s.serial# FROM gv$locked_object l, d

Windows無法安裝到這個磁盤 選中的磁盤具有MBR分區解決方法

xtend led 分區安裝 刪掉 操作系統 win8 默認 朋友 包含 在安裝 win10的時候,會出現這種提示:Windows 無法安裝到這個磁盤。選中的磁 盤具有 MBR 分區表。在 EFI 系統上, Windows 只能安裝到 GPT 磁盤。出現這種 情況主要是因為

postgresql查看死解決方法

sel can from 數據 post sta 進程 wait nbsp 檢索出死鎖進程的ID   SELECT * FROM pg_stat_activity WHERE datname=‘數據庫名‘ and waiting=‘t‘;  找到對用的pid列的值 

ORACLE 物件 | 程序 | 字符集 | 版本號 |預設空間

1. 查詢當前使用者鎖表物件 select sess.sid,     sess.serial#,     lo.oracle_username,     lo.os_user_name,     ao.object_n

無法獲得統一解決方法

Linux的ubuntu安裝軟體時出現無法獲得鎖的問題 原因: 既然是無法獲得鎖,那就是你要使用的資源被佔用了,其他的程序佔用了你要使用的資源,擁有了這個鎖。所以一般都是因為資源被佔用引起。 解決方案: 1. 檢視程序 ps aux | grep apt 這個命令將列出

Oracle資訊處理步驟

檢視是否有鎖表的sql select 'blocker(' || lb.sid || ':' || sb.username || ')-sql:' || qb.sql_text blockers, 'waiter (' || lw.sid || ':' || sw.usern

oracle for update造成的Oracle與解

我遇到的情況: 當使用select語句查詢表時,後面跟著for update , select * from table for update 當修改表中資料,但是沒有commit就關掉PL/SQL,下次再開啟,執行帶for update的sql語句,就會卡死  

Oracle 查詢

--以下幾個為相關表 SELECT * FROM v$lock; SELECT * FROM v$sqlarea; SELECT * FROM v$session; SELECT * FROM v$process ; SELECT * FROM v$locked_object; SELECT * F