Oracle關於資料庫鎖處理的一些個人見解
/*使用者鎖,資料庫的鎖有的時候是比較耗費資源的,特別是發生鎖等待的時候,我們必須找到發生等待的鎖,有可能的話,殺掉該程序。 這個語句將查詢到資料庫中所有的DML語句產生的鎖,還可以發現,任何DML語句其實產生了兩個鎖,一個是表鎖,一個是行鎖。 可以通過alter system kill session ‘sid,serial#’來殺掉會話*/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
---通過sid查詢後臺程序號pidselect a.sid,a.serial#,b.spid pid from v$session a,v$process b where a.paddr=b.addr and a.Sid=408;
--主機後臺通過如下命令進行殺鎖kill -s 9 pid
-- 查詢當前活動的SQL,能看出當前那些sql正在執行或卡住select A.SID,a.serial#,A.LOGON_TIME,A.schemaname,A.osuser,A.process,A.machine,A.status ,b.name,b.WAIT_CLASS,c.sql_text from v$session a,v$event_name b,v$sqlarea c where a.EVENT#=b.EVENT# and a.EVENT=b.name and a.sql_id=c.SQL_ID and a.status='ACTIVE' order by A.LOGON_TIME;
/*鎖與等待,如果發生了鎖等待,我們可能更想知道是誰鎖了表而引起誰的等待 以下的語句可以查詢到誰鎖了表,而誰在等待。*/SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,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,xidusn DESC
select sql_text,executions,parse_calls from v$sqlarea; select name,value from v$sysstat where name like 'parse%'; --檢視誰在佔用臨時段,然後找出相關的sqlSELECT b.blocks*8/1024 M,b.tablespace,b.segfile#,b.segblk#,b.blocks,a.sid,a.serial#,a.username,a.osuser,a.MACHINE, a.status,c.sql_text FROM v$session a, v$sort_usage b, v$sql c WHERE a.saddr = b.session_addr AND a.sql_address = c.address(+) ORDER BY b.tablespace, b.segfile#, b.segblk#, b.blocks;