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。
MySQL鎖表是什么意思
這牽涉到mysql的事務,簡單通俗的話,就這樣給你解釋
有一個任務序列控制sql語句的執行,
第一次有select的語句查詢表a,mysql服務器在執行select之前將表a加讀鎖,
第二次又有一條select語句查詢表a, mysql服務器發現在任務序列中有表a的讀鎖,也就是同時還有一個sql查詢表a,讀鎖不會影響這條sql語句,
當有一條update或者insert語句對表a操作時,mysql服務器會對表a加寫鎖,以此提示之后的對表a操作的sql語句等待寫鎖解鎖后在執行,以免造成寫入與讀取的混亂
怎么知道數據庫表已經鎖表了
可直接在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這樣就能殺掉進程解鎖了。
數據庫鎖表是什么意思
數據庫鎖表:在數據庫里,同一個數據可能有多個人來讀取或更改,為了防止更改的時候別人也同時更改,這里一般要鎖住表不讓別人改。當然還有其它各種復雜情況。
數據庫鎖從類型上講,有共享鎖,意向鎖,排他鎖。從鎖的粒度角度來說,可以分為為行、頁鍵、鍵范圍、索引、表或數據庫獲取鎖。(鎖粒度是被封鎖目標的大小,封鎖粒度小則并發性高,但開銷大,封鎖粒度大則并發性低但開銷小)
可能的原因有:
(1)字段不加索引:在執行事務的時候,如果表中沒有索引,會執行全表掃描,如果這時候有其他的事務過來,就會發生鎖表!
(2)事務處理時間長:事務處理時間較長,當越來越多事務堆積的時候,會發生鎖表!
(3)關聯操作太多:涉及到很多張表的修改等,在并發量大的時候,會造成大量表數據被鎖!
出現鎖表的解決方法有:
(1)通過相關的sql語句可以查出是否被鎖定,和被鎖定的數據!
(2)為加鎖進行時間限定,防止無限死鎖!
(3)加索引,避免全表掃描!
(4)盡量順序操作數據!
(5)根據引擎選擇合理的鎖粒度!
(6)事務中的處理時間盡量短!
生產中出現死鎖等問題是比較嚴重的問題,因為通常死鎖沒有明顯的錯誤日志,只有在發現錯誤的時候才能后知后覺的處理,所以,一定要盡力避免!
擴展資料:
封鎖是指事務T在對某個數據對象(例如表、記錄等)操作之前,先向系統發出請求,對其加鎖。加鎖后事務T就對該數據對象有了一定的控制,在事務T釋放它的鎖之前,其它的事務不能更新此數據對象。
鎖表的基本類型有:
(1)排它鎖(記為X鎖)
排它鎖又稱為寫鎖。若事務T 對數據對象A 加上X 鎖,則只允許T 讀取和修改A , 其它任何事務都不能再對A 加任何類型的鎖,直到T 釋放A 上的鎖。
(2)共享鎖(記為S鎖)
共享鎖又稱為讀鎖。若事務T 對數據對象A 加上S 鎖,則其它事務只能再對A 加S 鎖,而不能加X 鎖,直到T 釋放A 上的S 鎖。X鎖和S鎖都是加在某一個數據對象上的。
封鎖單元有:
封鎖的對象可以是邏輯單元,也可以是物理單元。
邏輯單元: 屬性值、屬性值集合、元組、關系、索引項、整個索引、整個數據庫等;
物理單元:頁(數據頁或索引頁)、塊等。
封鎖對象可以很大也可以很小,例如對整個數據庫加鎖、對某個屬性值加鎖。封鎖對象的大小稱為封鎖的粒度。封鎖的粒度越大,系統中能夠被封鎖的對象就越少,并發度也就越小,但系統開銷也越小;封鎖的粒度越小,并發度越高,但開銷也就越大。
選擇封鎖粒度時必須同時考慮開銷和并發度兩個因素,進行權衡,以求得最優的效果。
一般原則為:
(1)需要處理大量元組的用戶事務:以關系為封鎖單元;
(2)需要處理多個關系的大量元組的用戶事務:以數據庫為封鎖單位;
(3)只處理少量元組的用戶事務:以元組為封鎖單位
參考資料:封鎖(數據庫中的的封鎖)_百度百科
oracle 鎖表、解鎖的語句
一些ORACLE中的進程被殺掉后,狀態被置為"killed",但是鎖定的資源很長時間不釋放,有時實在沒辦法,只好重啟數據庫。
現在提供一種方法解決這種問題,那就是在ORACLE中殺不掉的,在OS一級再殺。1.下面的語句用來查詢哪些對象被鎖:select object_name,machine,*,*#from v$locked_object l,dba_objects o ,v$session swhere *_id = *_id and *n_id=*;2.下面的語句用來殺死一個進程:alter system kill session '24,111'; (其中24,111分別是上面查詢出的sid,serial#)【注】以上兩步,可以通過Oracle的管理控制臺來執行。
3.如果利用上面的命令殺死一個進程后,進程狀態被置為"killed",但是鎖定的資源很長時間沒有被釋放,那么可以在os一級再殺死相應的進程(線程),首先執行下面的語句獲得進程(線程)號:select spid, osuser, *mfrom v$session s,v$process pwhere *=* 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。
查看Oracle中是否有鎖表的sql
用如下語句查詢: select 'blocker(' || * || ':' || *me || ')-sql:' || *_text blockers, 'waiter (' || * || ':' || *me || ')-sql:' || *_text waiters from v$lock lb, v$lock lw, v$session sb, v$session sw, v$sql qb, v$sql qw where * = * and * = * and *_sql_addr = *s and *_address = *s and *1 = *1 and *it is not null and *it is null and * = 1;如果有被鎖的sql,查詢中有結果: 。