select DISTINCT lk.session_id sid, se.serial#, lk.locked_mode lk_md, '|', se.CLIENT_IDENTIFIER c_name, --BES系統登陸名 dd.FULL_NAME, se.logon_time, se.ACTION, FV.RESPONSIBILITY_NAME transfer, lk.oracle_username || '_' || lk.os_user_name || '_' ||se.machine user_info, '|', se.MODULE, BF.FORM_NAME, --substr(se.MODULE, instr(se.MODULE, ':', 1, 3) + 1, length(se.MODULE)), FT.USER_FORM_NAME, FT.LANGUAGE, se.WAIT_CLASS, sw.event, la.name, sa.sql_text, '|', 'alter system kill session ''' || se.sid || ',' || se.serial# || ''';' killsql, c.spid AS os_process_id, c.pid, 'ps -ef | grep ' || c.spid as check_os_process_command, 'kill -9 ' || c.spid as kill_os_process_command FROM v$locked_object lk, v$session SE, v$sqlarea sa, v$session_wait sw, v$latch la, v$process c, per_people_f dd, FND_USER FU, FND_RESPONSIBILITY_VL fv, FND_FORM_TL FT, FND_FORM BF WHERE 1 = 1 AND se.sid = lk.session_id AND se.prev_sql_addr = sa.address AND se.sid = sw.sid AND se.paddr = c.addr AND sw.p2 = la.latch#(+) AND se.CLIENT_IDENTIFIER = FU.user_name AND fu.EMPLOYEE_ID = DD.PERSON_ID AND substr(se.ACTION, instr(se.ACTION, '/', 1, 1) + 1, length(se.action))=FV.RESPONSIBILITY_KEY(+) AND substr(se.MODULE, instr(se.MODULE, ':', 1, 3) + 1, length(se.MODULE))= BF.FORM_NAME(+) AND BF.FORM_ID = FT.FORM_ID(+) AND FT.LANGUAGE(+) = USERENV('LANG') ORDER BY se.LOGON_TIME,sid
應當注意對於sid在100如下的應當謹慎,可能該進程對應某個application,如對應某個事務,能夠kill. 能夠用Spotlight軟件對數據庫的運行狀態進行監控。 oracle會話被鎖是常常的。可使用alter system kill session 'sid,serial#'殺死會話, 若是有長期出現的一列,多是沒有釋放的鎖。咱們能夠用下面SQL語句殺掉長期沒有釋放非正常的鎖:若是出現了鎖的問題, 某個DML操做可能等待好久沒有反應。 當你採用的是直接鏈接數據庫的方式,也不要用OS系統命令 $kill process_num 或者 $kill -9 process_num來終止用戶鏈接,由於一個用戶進程可能產生一個以上的鎖, 殺OS進程並不能完全清除鎖的問題。 --解除鎖定 --1.強制: alter system kill session 'sid,serial#'; --2.當佔用鎖會話commit時,解除鎖定alter system kill session 'sid,serial#'; ============================================== --如下幾個爲相關表 SELECT * FROM v$lock; SELECT * FROM v$sqlarea; SELECT * FROM v$session; SELECT * FROM v$process ; SELECT * FROM v$locked_object; SELECT * FROM all_objects; SELECT * FROM v$session_wait; =================================================== --1.查出鎖定object的session的信息以及被鎖定的object名,生 select b.owner, b.object_name, x.WAIT_CLASS,--引發等待的類 l.session_id, x.SERIAL#, l.locked_mode 鎖定模式, lpad(' ', decode(l.xidusn, 0, 3, 0)) || l.oracle_username DB用戶, l.os_user_name OS用戶, x.username, x.logon_time, x.machine 機器名, x.terminal, x.client_info, x.logon_time, 'alter system kill session ''' || x.sid || ',' || x.serial# || ''';' killsql, c.spid AS os_process_id, c.pid, 'ps -ef | grep ' || c.spid as check_os_process_command, 'kill -9 ' || c.spid as kill_os_process_command from v$locked_object l, dba_objects b, v$session x, v$process c where b.object_id = l.object_id and l.SESSION_ID = x.SID and c.addr = x.paddr --and OBJECT_NAME like 'MTL_ITEM_LOCATIONS' order by b.object_id,l.xidusn DESC; --若是發生了鎖等待,咱們可能更想知道是誰鎖了表而引發誰的等待(左邊鎖右邊等待?????) --以上查詢結果是一個樹狀結構,若是有子節點,則表示有等待發生。 --若是想知道鎖用了哪一個回滾段,還能夠關聯到V$rollname,其中xidusn就是回滾段的USN --還能夠根據v$session_wait;查看等待事件 --2.查出鎖定表的session的sid, serial#,os_user_name, machine name, terminal和執行的語句 SELECT lk.session_id sid, se.serial#, lpad(' ', decode(lk.xidusn, 0, 3, 0)) || lk.oracle_username User_name, lk.locked_mode, lk.oracle_username, se.user#, lk.os_user_name, se.machine, se.terminal, a.sql_text, a.action FROM v$sqlarea a, v$session se, v$locked_object lk WHERE lk.session_id = se.sid AND se.prev_sql_addr = a.address -- and sid= &sid --利用sid找到相應的sql ORDER BY sid, se.serial#; --3.查出鎖定表的sid, serial#,os_user_name, machine_name, terminal,鎖的type,mode --這個語句將查找到數據庫中全部的DML語句產生的鎖,還能夠發現, --任何DML語句其實產生了兩個鎖,一個是表鎖,一個是行鎖。 SELECT s.sid, --會話ID s.serial#, s.username, decode(l.type, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', l.type) LOCK_LEVEL, o.object_name, --對象名稱 o.object_type, --對象類型 l.lmode, l.request, o.owner, --對象用戶 s.schemaname, s.osuser, --操做系統用戶 s.process, s.machine, --對象機器名域名 s.terminal, --對象名稱 s.program, --對象經過程序 s.logon_time, l.block 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 and l.type in ('TX', 'TM') -- AND o.OBJECT_NAME='MTL_ITEM_LOCATIONS' and s.sid=&input_sid order by s.sid,o.OBJECT_NAME; --4.這是查找被鎖包的SQL select B.SID, b.USERNAME, b.MACHINE, a.OBJECT, 'alter system kill session ' || '''' || b.SID || ',' || b.SERIAL# || ''';' kill_command FROM V$ACCESS A, V$SESSION B WHERE A.SID = B.SID and upper(a.OBJECT) like '%CUX%' and a.TYPE = 'PACKAGE' --根據包名查找鎖 select 'alter system kill session ' || '''' || to_char(b.sid) || ',' || to_char(b.serial#) || '''' || ';' kill_statement, b.sid, b.serial#, b.* from dba_ddl_locks a, v$session b where a.session_id = b.sid and a.name = 'DFG_EXP_HOMEPG'; ===================================== 5.查看等待事件: select sid, event, p1 as "p1 as file_id", p2 as "p2 as block_id/latch", p3 as "p3 as blocks", l.name from v$session_wait sw, v$latch l where event not like '%SQL%' and event not like '%rdbms%' and event not like '%mon%' and sw.p2 = l.latch#(+) and sid=&input_sid; ================================================== 查看是誰鎖了誰 select s1.username /*|| [ email = '@' ] '@' [ / email ] */|| s1.machine || ' ( SID=' || s1.sid || ' ) is blocking '|| s2.username || /*[ email = '@' ] '@' [ / email ] ||*/ s2.machine || ' ( SID=' || s2.sid || ' ) ' ASblocking_status from v$lock l1, v$session s1, v$lock l2, v$session s2 where s1.sid = l1.sid and s2.sid = l2.sid and l1.BLOCK = 1 and l2.request > 0 and l1.id1 = l2.id1 and l2.id2 = l2.id2; =============================================== 6.經過併發管理器的請求的ID查SQL a.先查sid SELECT 'Request id: ' || request_id, 'Trace id: ' || oracle_Process_id, 'Trace Flag: ' || req.enable_trace, 'Trace Name: ' || dest.value || '/' || dbnm.value || '_ora_' || oracle_process_id || '.trc', 'Prog. Name: ' || prog.user_concurrent_program_name, 'File Name: ' || execname.execution_file_name || execname.subroutine_name, 'Status : ' || decode(phase_code, 'R', 'Running') || '-' || decode(status_code, 'R', 'Normal'), 'SID Serial: ' || ses.sid || ',' || ses.serial#, ses.sid, 'Module : ' || ses.module from fnd_concurrent_requests req, v$session ses, v$process proc, v$parameter dest, v$parameter dbnm, fnd_concurrent_programs_vl prog, fnd_executables execname where req.request_id = &request id and req.oracle_process_id = proc.spid(+) and proc.addr = ses.paddr(+) and dest.name = 'user_dump_dest' and dbnm.name = 'db_name' and req.concurrent_program_id = prog.concurrent_program_id and req.program_application_id = prog.application_id --- and prog.application_id = execname.application_id and prog.executable_application_id = execname.application_id and prog.executable_id = execname.executable_id; ------------------------- b. ##查引發等待的類 select a.WAIT_CLASS from v$session a where a.sid= xxx; ------------------------- c. ##查引發等待的SQL select sql_text, sql_id, hash_value from v$sqltext_with_newlines where hash_value in (select SQL_HASH_VALUE from v$session where paddr in (select addr from v$process where spid = (select b.oracle_process_id from apps.fnd_concurrent_requests b where b.request_id = 1413621))) order by piece; ========================================================== 另外一個查併發的 SELECT U.USER_NAME, APP.APPLICATION_SHORT_NAME, FAT.APPLICATION_NAME, FR.RESPONSIBILITY_KEY, FRT.RESPONSIBILITY_NAME, FFF.FUNCTION_NAME, FFT.USER_FUNCTION_NAME, ICX.FUNCTION_TYPE, ICX.FIRST_CONNECT, ICX.LAST_CONNECT FROM ICX_SESSIONS ICX, FND_USER U, FND_APPLICATION APP, FND_APPLICATION_TL FAT, FND_RESPONSIBILITY FR, FND_RESPONSIBILITY_TL FRT, FND_FORM_FUNCTIONS FFF, FND_FORM_FUNCTIONS_TL FFT WHERE 1 = 1 AND U.USER_ID = ICX.USER_ID AND ICX.RESPONSIBILITY_APPLICATION_ID = APP.APPLICATION_ID AND FAT.APPLICATION_ID = ICX.RESPONSIBILITY_APPLICATION_ID AND FAT.LANGUAGE = 'ZHS' AND FR.APPLICATION_ID = ICX.RESPONSIBILITY_APPLICATION_ID AND FR.RESPONSIBILITY_ID = ICX.RESPONSIBILITY_ID AND FRT.LANGUAGE = 'ZHS' AND FRT.APPLICATION_ID = ICX.RESPONSIBILITY_APPLICATION_ID AND FRT.RESPONSIBILITY_ID = ICX.RESPONSIBILITY_ID AND FFF.FUNCTION_ID = ICX.FUNCTION_ID AND FFT.FUNCTION_ID = ICX.FUNCTION_ID AND ICX.DISABLED_FLAG != 'Y' AND ICX.PSEUDO_FLAG = 'N' AND (ICX.LAST_CONNECT + DECODE(FND_PROFILE.VALUE('ICX_SESSION_TIMEOUT'), NULL, ICX.LIMIT_TIME, 0, ICX.LIMIT_TIME, FND_PROFILE.VALUE('ICX_SESSION_TIMEOUT') / 60) / 24) > SYSDATE AND ICX.COUNTER < ICX.LIMIT_CONNECTS;