oracle 鎖表、解鎖的語句
一些ORACLE中的進程被殺掉后,狀態被置為"killed",但是鎖定的資源很長時間不釋放,有時實在沒辦法,只好重啟數據庫。現在提供一種方法解決這種問題,那就是在ORACLE中殺不掉的,在OS一級再殺。
1.下面的語句用來查詢哪些對象被鎖:
select object_name,machine,*,*#
from v$locked_object l,dba_objects o ,v$session s
where *_id = *_id and *n_id=*;
2.下面的語句用來殺死一個進程:
alter system kill session '24,111'; (其中24,111分別是上面查詢出的sid,serial#)
【注】以上兩步,可以通過Oracle的管理控制臺來執行。
3.如果利用上面的命令殺死一個進程后,進程狀態被置為"killed",但是鎖定的資源很長時間沒有被釋放,那么可以在os一級再殺死相應的進程(線程),首先執行下面的語句獲得進程(線程)號:
select spid, osuser, *m
from v$session s,v$process p
where *=* and *=24 (24是上面的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
怎么查找mysql中的鎖表語句
怎么查找mysql中的鎖表語句
show processlist;
SHOW PROCESSLIST顯示哪些線程正在運行。您也可以使用mysqladmin processlist語句得到此信息。如果您有SUPER權限,您可以看到所有線程。否則,您只能看到您自己的線程(也就是,與您正在使用的MySQL賬戶相關的線程)。如果有線程在update或者insert 某個表,此時進程的status為updating 或者 sending data。
怎么知道數據庫表已經鎖表了
可直接在mysql命令行執行:show engine innodb status\G;
查看造成死鎖的sql語句,分析索引情況,然后優化sql然后show processlist;
show status like '%lock%'
show OPEN TABLES where In_use > 0; 這個語句記錄當前鎖表狀態
另外可以打開慢查詢日志,linux下打開需在*的[mysqld]里面加上以下內容:
slow_query_log=TRUE(有些mysql版本是ON)
slow_query_log_file=/usr/local/mysql/slow_query_*
long_query_time=3
select *from v$locked_object:可以獲得被鎖的對象的object_id及產生鎖的會話sid。通過查詢結果中的object_id,可以查詢到具體被鎖的對象。
擴展資料:
注意事項
也可以直接把這幾個視圖和表關聯起來,在查詢結果中直接得到“alter system kill session 'sid, serial#'”這樣的方便的kill sessoin命令。
如果執行kill session命令后,鎖并沒有除掉,session依然存在。這種情況,通過select spid from v$process where addr in(select paddr from v$session where sid = &sid)查詢到oracle會話在服務器上的pid,然后登陸到服務器上,執行kill -9 pid這樣就能殺掉進程解鎖了。
oracle 鎖表時,怎么查出是哪些SQL語句導致了鎖表
SELECT * SESSION_ID, *ME, DECODE(LMODE, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive', TO_CHAR(LMODE)) MODE_HELD, DECODE(REQUEST, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive', TO_CHAR(REQUEST)) MODE_REQUESTED, *||'.'||*_NAME||' ('||*_TYPE||')', * LOCK_TYPE, *1 LOCK_ID1, *2 LOCK_ID2
FROM V$LOCK L, *_OBJECTS O, V$SESSION S
WHERE * = * AND *1 = *_ID;
執行上記SQL語句,可以查尋到數據庫中的鎖的情報.
SESSION_ID, USERNAME, MODE_HELD, MODE_REQUESTED, OBJECT_NAME, LOCK_TYPE, LOCK_ID
分別是 擁有鎖的SESSION_ID,擁有鎖的USERNAME,鎖的執行模式MODE_HELD,鎖的請求MODE_REQUESTED,鎖所在的數據庫對象名
,鎖的類型,鎖的ID
還有你問的應該是數據庫中表出現死鎖情況吧,是哪些sql過程導致了表死鎖:
解決方案如下:
1.查哪個過程被鎖:
查V$DB_OBJECT_CACHE視圖:
SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER='過程的所屬用戶' AND CLOCKS!='0';
2. 查是哪一個SID,通過SID可知道是哪個SESSION:
查V$ACCESS視圖:
SELECT * FROM V$ACCESS WHERE OWNER='過程的所屬用戶' AND NAME='剛才查到的過程名';
3. 查出SID和SERIAL#:
查V$SESSION視圖:
SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='剛才查到的SID';
查V$PROCESS視圖:
SELECT SPID FROM V$PROCESS WHERE ADDR='剛才查到的PADDR';
4. 殺進程:
(1)先殺ORACLE進程:
ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#';
(2)再殺操作系統進程: (linux)
KILL -9 剛才查出的SPID或ORAKILL 剛才查出的SID 剛才查出的SPID。
如何查詢鎖表的SQL
用下邊的語句查詢,如果想結束直接killSELECT SPID=*, DBName = convert(CHAR(20),*), ProgramName = program_name, LoginName = convert(CHAR(20),*), HostName = convert(CHAR(20),hostname), Status = *, BlockedBy = *d, LoginTime = login_time, QUERY = CAST(* AS VARCHAR(MAX)) FROM *cesses p INNER JOIN *abases d ON * = * INNER JOIN *ins l ON * = * CROSS APPLY *_exec_sql_text(sql_handle) tWHERE *d = 0 AND EXISTS (SELECT 1 FROM *cesses p1 WHERE *d = *)。