oracle資料庫鎖表
Ⅰ oracle查詢鎖表與解鎖情況提供解決方案
如果發生了鎖等待,我們可能更想知道是誰鎖了表而引起誰的等待
以下的語句可以查詢到誰鎖了表:
復制代碼
代碼如下:
SELECT
/*+
rule
*/
s.username,
decode(l.type,'TM','TABLE
LOCK',
'TX','ROW
LOCK',
NULL)
LOCK_LEVEL,
o.owner,o.object_name,o.object_type,
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
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
以下的語句可以查詢到誰在等待:
復制代碼
代碼如下:
SELECT
/*+
rule
*/
lpad('
',decode(l.xisn
,0,3,0))||l.oracle_username
User_name,
o.owner,o.object_name,o.object_type,s.sid,s.serial#
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,xisn
DESC
解鎖命令:
復制代碼
代碼如下:
alter
system
kill
session
'sid,serial#'
1).
復制代碼
代碼如下:
select
LOCK_INFO.OWNER
||
'.'
||
LOCK_INFO.OBJ_NAME
as
"已鎖物件名稱",
--物件名稱(已經被鎖住)
LOCK_INFO.SUBOBJ_NAME
as
"已鎖子物件名稱",
--
子物件名稱(已經被鎖住)
SESS_INFO.MACHINE
as
"機器名稱",
--
機器名稱
LOCK_INFO.SESSION_ID
as
"會話ID",
--
會話SESSION_ID
SESS_INFO.SERIAL#
as
"會話SERIAL#",
--
會話SERIAL#
SESS_INFO.SPID
as
"OS系統的SPID",
--
OS系統的SPID
(SELECT
INSTANCE_NAME
FROM
V$INSTANCE)
"實例名SID",
--實例名SID
LOCK_INFO.ORA_USERNAME
as
"ORACLE用戶",
--
ORACLE系統用戶名稱
LOCK_INFO.OS_USERNAME
as
"OS用戶",
--
作業系統用戶名稱
LOCK_INFO.PROCESS
as
"進程編號",
--
進程編號
LOCK_INFO.OBJ_ID
as
"對象ID",
--
對象ID
LOCK_INFO.OBJ_TYPE
as
"對象類型",
--
對象類型
SESS_INFO.LOGON_TIME
as
"登錄時間",
--
登錄時間
SESS_INFO.PROGRAM
as
"程式名稱",
--
程式名稱
SESS_INFO.STATUS
as
"會話狀態",
--
會話狀態
SESS_INFO.LOCKWAIT
as
"等待鎖",
--
等待鎖
SESS_INFO.ACTION
as
"動作",
--
動作
SESS_INFO.CLIENT_INFO
as
"客戶資訊"
--
客戶資訊
from
(select
obj.OWNER
as
OWNER,
obj.OBJECT_NAME
as
OBJ_NAME,
obj.SUBOBJECT_NAME
as
SUBOBJ_NAME,
obj.OBJECT_ID
as
OBJ_ID,
obj.OBJECT_TYPE
as
OBJ_TYPE,
lock_obj.SESSION_ID
as
SESSION_ID,
lock_obj.ORACLE_USERNAME
as
ORA_USERNAME,
lock_obj.OS_USER_NAME
as
OS_USERNAME,
lock_obj.PROCESS
as
PROCESS
from
(select
*
from
all_objects
where
object_id
in
(select
object_id
from
v$locked_object))
obj,
v$locked_object
lock_obj
where
obj.object_id
=
lock_obj.object_id)
LOCK_INFO,
(select
SID,
SERIAL#,
LOCKWAIT,
STATUS,
(select
spid
from
v$process
where
addr
=
a.paddr)
spid,
PROGRAM,
ACTION,
CLIENT_INFO,
LOGON_TIME,
MACHINE
from
v$session
a)
SESS_INFO
where
LOCK_INFO.SESSION_ID
=
SESS_INFO.SID
order
by
LOCK_INFO.SESSION_ID;
2).
復制代碼
代碼如下:
select
sql_text
from
v$sqltext
where
address
in
(select
sql_address
from
v$session
where
sid
=
&sid)
order
by
piece;
3).
復制代碼
代碼如下:
ALTER
SYSTEM
KILL
SESSION
'會話ID,會話SERIAL#';
4).
kill
-9
OS系統的SPID
Ⅱ 平時使用oracle時,為什麼會鎖表
簡單地說,鎖是為了保證數據的一致性,鎖不止存在於oracle,其他資料庫一樣有,只不過機制上可能大相徑庭。
至於什麼樣的操作會鎖表,其實鎖的種類很多,你所說的鎖表大概說的是行級鎖——也就是事務鎖吧。比如一個update語句,被update的行上會有鎖——能阻塞其他事務對這些行進行修改的鎖,雖然這時候這張表上也有表級鎖,但這個表級鎖並不影響其他事務對表中的其他行進行修改,只是會阻礙對這張表的DDL操作。
Ⅲ oracle資料庫怎麼鎖表
oracle資料庫分行級鎖和表級鎖。用select * from table-name for update完成行級鎖。用delete或update完成表級鎖。你鎖定的資源 別人會等待你的提交語句或回退語句完成以後再繼續進行。
Ⅳ oracle表在什麼情況下會被鎖住
DML鎖又可以分為,行鎖、表鎖、死鎖
-行鎖:當事務執行資料庫插入、更新、刪除操作時,該事務自動獲得操作表中操作行的排它鎖。
-表級鎖:當事務獲得行鎖後,此事務也將自動獲得該行的表鎖(共享鎖),以防止其它事務進行DDL語句影響記錄行的更新。事務也可以在進行過程中獲得共享鎖或排它鎖,只有當事務顯示使用LOCK TABLE語句顯示的定義一個排它鎖時,事務才會獲得表上的排它鎖,也可使用LOCK TABLE顯示的定義一個表級的共享鎖(LOCK TABLE具體用法請參考相關文檔)。
-死鎖:當兩個事務需要一組有沖突的鎖,而不能將事務繼續下去的話,就出現死鎖。
如事務1在表A行記錄#3中有一排它鎖,並等待事務2在表A中記錄#4中排它鎖的釋放,而事務2在表A記錄行#4中有一排它鎖,並等待事務1在表A中記錄#3中排它鎖的釋放,事務1與事務2彼此等待,因此就造成了死鎖。死鎖一般是因拙劣的事務設計而產生。
死鎖只能使用SQL下:alter system kill session "sid,serial#";或者使用相關操作系統kill進程的命令,如UNIX下kill -9 sid,或者使用其它工具殺掉死鎖進程。
+DDL鎖又可以分為:排它DDL鎖、共享DDL鎖、分析鎖
-排它DDL鎖:創建、修改、刪除一個資料庫對象的DDL語句獲得操作對象的 排它鎖。如使用alter table語句時,為了維護數據的完成性、一致性、合法性,該事務獲得一排它DDL鎖。
-共享DDL鎖:需在資料庫對象之間建立相互依賴關系的DDL語句通常需共享獲得DDL鎖。
如創建一個包,該包中的過程與函數引用了不同的資料庫表,當編譯此包時,該事務就獲得了引用表的共享DDL鎖。
-分析鎖:ORACLE使用共享池存儲分析與優化過的SQL語句及PL/SQL程序,使運行相同語句的應用速度更快。一個在共享池中緩存的對象獲得它所引用資料庫對象的分析鎖。分析鎖是一種獨特的DDL鎖類型,ORACLE使用它追蹤共享池對象及它所引用資料庫對象之間的依賴關系。當一個事務修改或刪除了共享池持有分析鎖的資料庫對象時,ORACLE使共享池中的對象作廢,下次在引用這條SQL/PLSQL語句時,ORACLE重新分析編譯此語句。
Ⅳ oracle資料庫鎖表怎麼解決
首先你要知道表鎖住了是不是正常鎖?因為任何DML語句都會對表加鎖。
你要先查一下是那個會話那個sql鎖住了表,有可能這是正常業務需求,不建議隨便KILL session,如果這個鎖表是正常業務你把session kill掉了會影響業務的。
建議先查原因再做決定。
(1)鎖表查詢的代碼有以下的形式:
select count(*) from v$locked_object;
select * from v$locked_object;
(2)查看哪個表被鎖
select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id;
(3)查看是哪個session引起的
select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time;
(4)查看是哪個sql引起的
select b.username,b.sid,b.serial#,c.* from v$locked_object a,v$session b,v$sql c where a.session_id = b.sid
and b.SQL_ID = c.sql_id and c.sql_id = ''
order by b.logon_time;
(5)殺掉對應進程
執行命令:alter system kill session'1025,41';
其中1025為sid,41為serial#.
Ⅵ oracle資料庫表被鎖了不能操作怎麼辦
用戶被鎖了?
failed_login_attempts參數默認是10,即:用戶連續輸入10次錯誤密碼,用戶會被鎖住;
可以使用其他擁有dba許可權的用戶進行解鎖;
alter
user
username
account
unlock;
如果是資料庫內部出現死鎖或阻塞會話,可以先查出阻塞的會話,
select
*
from
dba_waiters;
在殺掉阻塞的會話
alter
system
kill
session
'sid,serial#';
測試環境,可以直接重啟資料庫!