–锁的概念数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。实现数据库并发控制的一个非常重要的技术DML锁分两种 1.表级锁(TM锁):共享锁与独占锁 2.行级锁(TX锁):共享更新锁DDL锁:修改表结构 --锁的视图:VLOCK【系统锁】VLOCK【系统锁】 VLOCK【系统锁】VSESSION【会话锁】 VKaTeX parse error: Expected 'EOF', got '#' at position 282: …lect sid,serial#̲ from vsession where sid=43; SID SERIAL#---------- ---------- 43 125 SQL> alter system kill session ‘43,125’ immediate; ================================================================================
检查出产生死锁的机器session是哪一台。【如果有输出结果则说明有死锁】 select s.sid, s.serial#, s.username, s.lockwait, s.osuser, s.process, s.status, s.machine, s.program, s.event from gvsessionswheres.sidin(selectl.sessionidfromgvsession s where s.sid in (select l.session_id from gvsessionswheres.sidin(selectl.sessionidfromgvlocked_object l) and s.status=‘ACTIVE’; username: 死锁语句所用的数据库用户;lockwait: 死锁的状态,如果有内容表示被死锁。status: 状态active表示被死锁machine: 死锁语句所在的机器program: 产生死锁的语句主要来自哪个应用程序。 select inst_id, event#, event, count(*) from gvKaTeX parse error: Expected 'EOF', got '#' at position 25: …here wait_class#̲ <> 6 group by …sql t where t.hash_value in (select s.sql_hash_value from gvsessionswheres.sidin(selectl.sessionidfromgvsession s where s.sid in (select l.session_id from gvsessionswheres.sidin(selectl.sessionidfromgvlocked_object l));
================================================================================== set line 1000 pagesize 200 long 999999; col spid for a5;col sname for a10;col pname for a10;col machine for a25;col sprogram for a20;col program for a20;col event for a40; SELECT a.spid 操作系统进程, b.sid, b.serial#, b.username 数据库用户, b.status, b.program, b.paddr, b.machine 计算机名, b.program, b.module, b.logon_time, b.event, c.sql_text 正在执行的SQL FROM vprocessa,vprocess a, vprocessa,vsession b, v$sqlarea c WHERE a.addr = b.paddr --AND b.sid= ? AND b.sql_hash_value = c.hash_value; --或者b.sql_id=c.sql_id 关联
================================================================================== --死锁的解决方法一般情况下,只要将产生死锁的语句提交就可以了,但是在实际的执行过程中。用户可能不知道产生死锁的语句是哪一句,可以将程序关闭并重新启动就可以了 1)查找死锁的进程: select l.session_id, s.serial#, l.process, l.LOCKED_MODE, s.username 数据库用户, l.oracle_username, l.os_user_name, s.status, s.program, s.paddr, s.machine 计算机名, s.module, s.logon_time, s.event from gvlockedobjectl,gvlocked_object l, gvlockedobjectl,gvsession s where l.session_id = s.sid; alter system kill session ‘session_id,serial#’; --kill掉这个死锁的进程------------------------------------------------------------------------------- select d.sid, d.serial#, b.object_name, a.*, c.spid from gvlockedobjecta,dbaobjectsb,gvlocked_object a, dba_objects b, gvlockedobjecta,dbaobjectsb,gvprocess c, gv$session d where a.object_id = b.OBJECT_ID and c.addr = d.PADDR and d.sid = a.session_id alter system kill session ‘830, 19785’; --杀sid与serial#
================================================================================ 【系统层查杀】:通过杀Linux进程号:注意: 应当注意对于 sid 在 100 以下的应当谨慎,可能该进程对应某个应用,如对应某个事务,可以杀 sql> select p.spid from vsessions,vsession s, vsessions,vprocess pwhere s.paddr=p.addr s.sid=[输入会话sid] ; [oracle@xxx ~]$ ps -ef|grep spid 其中spid是这个进程的进程号,kill掉这个oracle进程。 sql> !ps -ef|grep 3734oracle 3734 3733 0 17:22 ? 00:00:01 oracledb01 (description=(local=no)(address=(protocol=beq)));
================================================================================
–被占用的对象无法删除?先找出占用着的会话线程、再删 drop materialized view SJZBGT3.FACT_SKXX_RKSK_LJ; select ‘alter system kill session "’ || s.sid || ‘,’ || s.serial# || ‘" immediate;’, s.username, s.status, s.osuser, s.machine, s.process, s.program, s.sql_id, s.sql_exec_start, s.prev_sql_id, s.prev_exec_start, s.module, s.event from gvsessionswheresidin(SELECTSIDFROMgvsession s where sid in (SELECT SID FROM gvsessionswheresidin(SELECTSIDFROMgvaccess a WHERE a.OBJECT = ‘表名’ and a.OWNER = ‘用户’);
alter system kill session '4263,14764’immediate;
这段代码 可以找到,非系统锁的表,并给出 KILL SESSION语句。可以查到是那台机器,有什么程序锁的表SELECT OBJECT_NAME, SESSION_ID SID, MACHINE, VS.MODULE, ‘ALTER SYSTEM KILL SESSION ‘’’ || SESSION_ID || ‘, ’ || SERIAL# || ‘’’; ’ KILL_SESSION, VS.STATUS, VS.ACTION, SERIAL#, ORACLE_USERNAME, OS_USER_NAME FROM VLOCKEDOBJECTVO,VLOCKED_OBJECT VO, VLOCKEDOBJECTVO,VSESSION VS, ALL_OBJECTS AO WHERE VO.SESSION_ID = VS.SID AND AO.OBJECT_ID = VO.OBJECT_ID AND NVL(VS.ACTION, ’ ') <> 'Service Management ’ ORDER BY OBJECT_NAME, MACHINE, VS.MODULE;
–查出所有被锁住的表
select b.owner TABLEOWNER, b.object_name TABLENAME, c.OSUSER LOCKBY, c.USERNAME LOGINID, c.sid SID, c.SERIAL# SERIAL from vlockedobjecta,dbaobjectsb,vlocked_object a, dba_objects b, vlockedobjecta,dbaobjectsb,vsession c where b.object_id = a.object_id AND a.SESSION_ID = c.sid;
–通过SID, SERIAL解锁 --alter system kill session ‘SID, SERIAL’;
应急====================================
–四种性能故障应急处理的过程第1 种:Linux操作系统某个ORACLE 进程占用CPU 高,如何快速抓取SQL 语句?第2 种:业务报过来,说数据库很慢,作为DBA,怎么样知道数据库是不是很慢,然后如果慢,查出源头?第3 种:如果数据库hang 了,怎么快速马上恢复正常使用(如果只是恢复业务不分析问题)?第4 种:如何查系统有死锁,并快速杀死锁? 动态性能视图:vsession−−查会话连接信息vsession --查会话连接信息vsession−−查会话连接信息vsql --查SQL 信息vsqlplan−−查SQL执行计划vsql_plan --查SQL 执行计划vsqlplan−−查SQL执行计划vsqltext --查SQL文本信息vsqlarea−−查SQL语句资源消耗情况vsqlarea --查SQL语句资源消耗情况vsqlarea−−查SQL语句资源消耗情况vsession_wait --查会话等待信息vsessionevent−−会话等待事件vsession_event --会话等待事件vsessionevent−−会话等待事件vprocess --查进程vlock−−查锁vlock --查锁vlock−−查锁vlocked_object --锁的对象vsessionlongops−−查某些话会操作时间vsession_longops --查某些话会操作时间vsessionlongops−−查某些话会操作时间vsysstat --查实例的一些统计信息vsessionwaitsession−−查热点块vsession_wait_session --查热点块vsessionwaitsession−−查热点块vtransaction --查正在执行的事务信息vsortusagetemp−−查temp使用情况vsort_usage_temp --查temp 使用情况vsortusagetemp−−查temp使用情况vsesstat --通过sid 得到会话的统计信息gv$access --正在被访问占用对象与sid --测试这么一条占CPU高的程序:declare i number; j number;begin i := 0; loop j := sqrt(i); i := i + 1; end loop;end;/
================================================================================ 第1 种:抓取性能消耗高的SQL语句【输入top命令占CPU高的pid号】SELECT a.username, a.machine, a.program, a.sid, a.serial#, a.status, c.piece, c.sql_text FROM vsessiona,vsession a, vsessiona,vprocess b, v$sqltext c WHERE b.spid = ‘&spid’ AND b.addr = a.paddr AND a.sql_address = c.address(+) ORDER BY c.piece; --alter system kill session '1209,5’immediate;
第2 种:业务报过来,说数据库很慢,作为DBA,怎么样知道数据库是不是很慢,然后如果慢,查出源头?–vsessionwait−−查会话等待信息[directpathread]selectevent,count(∗)fromgvsession_wait --查会话等待信息 [direct path read]select event,count(*) from gvsessionwait−−查会话等待信息[directpathread]selectevent,count(∗)fromgvsession_wait group by event order by 2 desc; --查出等待的对应的SQL idselect sw.p1, s.sql_id, count(), (ratio_to_report(count()) over()) * 100 pct from vsessions,vsession s, vsessions,vsession_wait sw where s.event like ‘%direct path read%’ and s.sid = sw.sid group by sw.p1, s.sql_id order by count() desc; P1 SQL_ID COUNT() PCT----- ------------- ---------- ---------6 gb82syps2pgp7 3 100 --占用的百分百 --查出等待的对应的SQLsys@itpuxfs> select sql_id,sql_text from vKaTeX parse error: Expected 'EOF', got '#' at position 304: …',' || s.serial#̲ || '''; …session s, v$process p where s.PADDR = p.addr --and s.username = ‘GGS’ and s.status=‘ACTIVE’;
查杀数据库与Linux进程(结合)alter system kill session ‘143,33’; – kill -9 10928
再上这种(杀所有连接):ps -ef | grep ‘LOCAL=NO’ |grep oracleitpuxfs | kill -9 awk '{print $2}'
=================================================================================== 语句2:select sn.username, m.sid, sn.serial#, m.type, decode(m.lmode, 0, ‘none’, 1, ‘null’, 2, ‘rowshare’, 3, ‘rowexcl.’, 4, ‘share’, 5, ‘srowexcl.’, 6, ‘exclusive’, lmode, ltrim(to_char(lmode, ‘990’))) lmode, decode(m.request, 0, ‘none’, 1, ‘null’, 2, ‘rowshare’, 3, ‘rowexcl.’, 4, ‘share’, 5, ‘srowexcl.’, 6, ‘exclusive’, request, ltrim(to_char(m.request, ‘990’))) request, m.id1, m.id2 from vsessionsn,vsession sn, vsessionsn,vlock m where (sn.sid = m.sid and m.request != 0) or (sn.sid = m.sid and m.request = 0 and lmode != 4 and (id1, id2) in (select s.id1, s.id2 from v$lock s where request != 0 and s.id1 = m.id1 and s.id2 = m.id2)) order by id1, id2, m.request; SQL> alter system kill session ‘sid,serial#’ immediate;
–杀mode=exclusive --------------------------------------------------
查看表上锁的情况:select sn.username, m.sid, sn.serial#, m.type, decode(m.lmode, 0, ‘none’, 1, ‘null’, 2, ‘rowshare’, 3, ‘rowexcl.’, 4, ‘share’, 5, ‘s/rowexcl.’, 6, ‘exclusive’, lmode, ltrim(to_char(lmode, ‘990’))) lmode, decode(m.request, 0, ‘none’, 1, ‘null’, 2, ‘rowshare’, 3, ‘rowexcl.’, 4, ‘share’, 5, ‘s/rowexcl.’, 6, ‘exclusive’, request, ltrim(to_char(m.request, ‘990’))) request, m.id1, m.id2 from vsessionsn,vsession sn, vsessionsn,vlock m where (sn.sid = m.sid and m.request != 0)
–存在锁请求,即被阻塞 or (sn.sid = m.sid --不存在锁请求,但是锁定的对象被其他会话请求锁定 and m.request = 0 and lmode != 4 and (id1, id2) in (select s.id1, s.id2 from vlockswhererequest!=0ands.id1=m.id1ands.id2=m.id2))orderbyid1,id2,m.request;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−语句3:setpages1000lin126colkaddrheading′lock∣address′colusernameheading′lock∣holder∣username′fora18colsidheading′lock∣holder∣sessionid′format9999999999coltypeheading′lock∣type′formata6colid1heading′id1′format9999999999colid2heading′id2′format9999999999collmodeheading′lock∣mode′format99999999colrequestheading′request∣mode′format99999999colblockingsidformat999999heading′blocked∣sessionid′select/∗+rule∗/−−a.kaddr,−−(selectusernamefromvlock s where request != 0 and s.id1 = m.id1 and s.id2 = m.id2)) order by id1, id2, m.request; ---------------------------------------------------------语句3:set pages 1000 lin 126col kaddr heading 'lock|address'col username heading 'lock|holder|username' for a18col sid heading 'lock|holder|session id' format 9999999999col type heading 'lock|type' format a6col id1 heading 'id1' format 9999999999col id2 heading 'id2' format 9999999999col lmode heading 'lock|mode' format 99999999col request heading 'request|mode' format 99999999col blocking_sid format 999999 heading 'blocked|session id' select /*+rule*/-- a.kaddr, -- (select username from vlockswhererequest!=0ands.id1=m.id1ands.id2=m.id2))orderbyid1,id2,m.request;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−语句3:setpages1000lin126colkaddrheading′lock∣address′colusernameheading′lock∣holder∣username′fora18colsidheading′lock∣holder∣sessionid′format9999999999coltypeheading′lock∣type′formata6colid1heading′id1′format9999999999colid2heading′id2′format9999999999collmodeheading′lock∣mode′format99999999colrequestheading′request∣mode′format99999999colblockingsidformat999999heading′blocked∣sessionid′select/∗+rule∗/−−a.kaddr,−−(selectusernamefromvsession where sid = a.sid) username, a.sid, (select serial# from vKaTeX parse error: Expected 'EOF', got '#' at position 34: …= a.sid) serial#̲, -- (select ct…lock where KADDR = a.kaddr) ctime, – a.type, a.id1, a.id2, a.lmode, a.request, a.block, b.sid blocking_sid from vlocka,(select∗fromvlock a, (select * from vlocka,(select∗fromvlock where request > 0 and type <> ‘MR’) b where a.id1 = b.id1(+) and a.id2 = b.id2(+) and a.lmode > 0 and a.type <> ‘MR’ order by username, a.sid, serial#, a.type;
================================================================================最经典的一条语句SET ECHO OFFSET FEEDBACK 6SET HEADING ONSET LINESIZE 180SET PAGESIZE 50000SET TERMOUT ONSET TIMING OFFSET TRIMOUT ONSET TRIMSPOOL ONSET VERIFY OFFCLEAR COLUMNSCLEAR BREAKSCLEAR COMPUTESPROMPTPROMPTPROMPT ±-----------------------------------------------------------------------+PROMPT | BLOCKING LOCKS (Summary)|PROMPT ±-----------------------------------------------------------------------+PROMPTSET serveroutput ON FORMAT WRAPPEDSET feedback OFFDECLARE CURSOR cur_BlockingLocks IS SELECT iw.instance_name AS waiting_instance, sw.status AS waiting_status, lw.sid AS waiting_sid, sw.serial# AS waiting_serial_num, sw.username AS waiting_oracle_username, sw.osuser AS waiting_os_username, sw.machine AS waiting_machine, pw.spid AS waiting_spid, SUBSTR(sw.terminal, 0, 39) AS waiting_terminal, SUBSTR(sw.program, 0, 39) AS waiting_program, ROUND(lw.ctime / 60) AS waiting_lock_time_min, DECODE(lh.type, ‘CF’, ‘Control File’, ‘DX’, ‘Distributed Transaction’, ‘FS’, ‘File Set’, ‘IR’, ‘Instance Recovery’, ‘IS’, ‘Instance State’, ‘IV’, ‘Libcache Invalidation’, ‘LS’, ‘Log Start or Log Switch’, ‘MR’, ‘Media Recovery’, ‘RT’, ‘Redo Thread’, ‘RW’, ‘Row Wait’, ‘SQ’, ‘Sequence Number’, ‘ST’, ‘Diskspace Transaction’, ‘TE’, ‘Extend Table’, ‘TT’, ‘Temp Table’, ‘TX’, ‘Transaction’, ‘TM’, ‘DML’, ‘UL’, ‘PLSQL User_lock’, ‘UN’, ‘User Name’, ‘Nothing-’) AS waiter_lock_type, DECODE(lw.request, 0, ‘None’ /* Mon Lock equivalent /, 1, ‘NoLock’ / N /, 2, ‘Row-Share (SS)’ / L /, 3, ‘Row-Exclusive (SX)’ / R /, 4, ‘Share-Table’ / S /, 5, ‘Share-Row-Exclusive (SSX)’ / C /, 6, ‘Exclusive’ / X /, ‘[Nothing]’) AS waiter_mode_request, ih.instance_name AS locking_instance, sh.status AS locking_status, lh.sid AS locking_sid, sh.serial# AS locking_serial_num, sh.username AS locking_oracle_username, sh.osuser AS locking_os_username, sh.machine AS locking_machine, ph.spid AS locking_spid, SUBSTR(sh.terminal, 0, 39) AS locking_terminal, SUBSTR(sh.program, 0, 39) AS locking_program, ROUND(lh.ctime / 60) AS locking_lock_time_min, aw.sql_text AS waiting_sql_text FROM gvlocklw,gvlock lw, gvlocklw,gvlock lh, gvinstanceiw,gvinstance iw, gvinstanceiw,gvinstance ih, gvsessionsw,gvsession sw, gvsessionsw,gvsession sh, gvprocesspw,gvprocess pw, gvprocesspw,gvprocess ph, gvsqlareaawWHEREiw.instid=lw.instidANDih.instid=lh.instidANDsw.instid=lw.instidANDsh.instid=lh.instidANDpw.instid=lw.instidANDph.instid=lh.instidANDaw.instid=lw.instidANDsw.sid=lw.sidANDsh.sid=lh.sidANDlh.id1=lw.id1ANDlh.id2=lw.id2ANDlh.request=0ANDlw.lmode=0AND(lh.id1,lh.id2)IN(SELECTid1,id2FROMgvsqlarea aw WHERE iw.inst_id = lw.inst_id AND ih.inst_id = lh.inst_id AND sw.inst_id = lw.inst_id AND sh.inst_id = lh.inst_id AND pw.inst_id = lw.inst_id AND ph.inst_id = lh.inst_id AND aw.inst_id = lw.inst_id AND sw.sid = lw.sid AND sh.sid = lh.sid AND lh.id1 = lw.id1 AND lh.id2 = lw.id2 AND lh.request = 0 AND lw.lmode = 0 AND (lh.id1, lh.id2) IN (SELECT id1, id2 FROM gvsqlareaawWHEREiw.instid=lw.instidANDih.instid=lh.instidANDsw.instid=lw.instidANDsh.instid=lh.instidANDpw.instid=lw.instidANDph.instid=lh.instidANDaw.instid=lw.instidANDsw.sid=lw.sidANDsh.sid=lh.sidANDlh.id1=lw.id1ANDlh.id2=lw.id2ANDlh.request=0ANDlw.lmode=0AND(lh.id1,lh.id2)IN(SELECTid1,id2FROMgvlock WHERE request = 0 INTERSECT SELECT id1, id2 FROM gvlockWHERElmode=0)ANDsw.paddr=pw.addr(+)ANDsh.paddr=ph.addr(+)ANDsw.sqladdress=aw.addressORDERBYiw.instancename,lw.sid;TYPEtBlockingLockRecordISRECORD(WaitingInstanceNameVARCHAR2(16),WaitingStatusVARCHAR2(8),WaitingSidNUMBER,WaitingSerialNumNUMBER,WaitingOracleUsernameVARCHAR2(30),WaitingOSUsernameVARCHAR2(30),WaitingMachineVARCHAR2(64),WaitingSpidVARCHAR2(12),WaitingTerminalVARCHAR2(30),WaitingProgramVARCHAR2(48),WaitingLockTimeMinuteNUMBER,WaiterLockTypeVARCHAR2(30),WaiterModeRequestVARCHAR2(30),LockingInstanceNameVARCHAR2(16),LockingStatusVARCHAR2(8),LockingSidNUMBER,LockingSerialNumNUMBER,LockingOracleUsernameVARCHAR2(30),LockingOSUsernameVARCHAR2(30),LockingMachineVARCHAR2(64),LockingSpidVARCHAR2(12),LockingTerminalVARCHAR2(30),LockingProgramVARCHAR2(48),LockingLockTimeMinuteNUMBER,SQLTextVARCHAR2(1000));TYPEtBlockingLockRecordTableISTABLEOFtBlockingLockRecordINDEXBYBINARYINTEGER;vBlockingLockArraytBlockingLockRecordTable;vBlockingLockReccurBlockingLockslock WHERE lmode = 0) AND sw.paddr = pw.addr(+) AND sh.paddr = ph.addr(+) AND sw.sql_address = aw.address ORDER BY iw.instance_name, lw.sid; TYPE t_BlockingLockRecord IS RECORD( WaitingInstanceName VARCHAR2(16), WaitingStatus VARCHAR2(8), WaitingSid NUMBER, WaitingSerialNum NUMBER, WaitingOracleUsername VARCHAR2(30), WaitingOSUsername VARCHAR2(30), WaitingMachine VARCHAR2(64), WaitingSpid VARCHAR2(12), WaitingTerminal VARCHAR2(30), WaitingProgram VARCHAR2(48), WaitingLockTimeMinute NUMBER, WaiterLockType VARCHAR2(30), WaiterModeRequest VARCHAR2(30), LockingInstanceName VARCHAR2(16), LockingStatus VARCHAR2(8), LockingSid NUMBER, LockingSerialNum NUMBER, LockingOracleUsername VARCHAR2(30), LockingOSUsername VARCHAR2(30), LockingMachine VARCHAR2(64), LockingSpid VARCHAR2(12), LockingTerminal VARCHAR2(30), LockingProgram VARCHAR2(48), LockingLockTimeMinute NUMBER, SQLText VARCHAR2(1000)); TYPE t_BlockingLockRecordTable IS TABLE OF t_BlockingLockRecord INDEX BY BINARY_INTEGER; v_BlockingLockArray t_BlockingLockRecordTable; v_BlockingLockRec cur_BlockingLocks%ROWTYPE; v_NumBlockingLocksIncidents BINARY_INTEGER := 0;BEGIN DBMS_OUTPUT.ENABLE(1000000); OPEN cur_BlockingLocks; LOOP FETCH cur_BlockingLocks INTO v_BlockingLockRec; EXIT WHEN cur_BlockingLocks%NOTFOUND; v_NumBlockingLocksIncidents := v_NumBlockingLocksIncidents + 1; v_BlockingLockArray(v_NumBlockingLocksIncidents).WaitingInstanceName := v_BlockingLockRec.waiting_instance; v_BlockingLockArray(v_NumBlockingLocksIncidents).WaitingStatus := v_BlockingLockRec.waiting_status; v_BlockingLockArray(v_NumBlockingLocksIncidents).WaitingSid := v_BlockingLockRec.waiting_sid; v_BlockingLockArray(v_NumBlockingLocksIncidents).WaitingSerialNum := v_BlockingLockRec.waiting_serial_num; v_BlockingLockArray(v_NumBlockingLocksIncidents).WaitingOracleUsername := v_BlockingLockRec.waiting_oracle_username; v_BlockingLockArray(v_NumBlockingLocksIncidents).WaitingOSUsername := v_BlockingLockRec.waiting_os_username; v_BlockingLockArray(v_NumBlockingLocksIncidents).WaitingMachine := v_BlockingLockRec.waiting_machine; v_BlockingLockArray(v_NumBlockingLocksIncidents).WaitingSpid := v_BlockingLockRec.waiting_spid; v_BlockingLockArray(v_NumBlockingLocksIncidents).WaitingTerminal := v_BlockingLockRec.waiting_terminal; v_BlockingLockArray(v_NumBlockingLocksIncidents).WaitingProgram := v_BlockingLockRec.waiting_program; v_BlockingLockArray(v_NumBlockingLocksIncidents).WaitingLockTimeMinute := v_BlockingLockRec.waiting_lock_time_min; v_BlockingLockArray(v_NumBlockingLocksIncidents).WaiterLockType := v_BlockingLockRec.waiter_lock_type; v_BlockingLockArray(v_NumBlockingLocksIncidents).WaiterModeRequest := v_BlockingLockRec.waiter_mode_request; v_BlockingLockArray(v_NumBlockingLocksIncidents).LockingInstanceName := v_BlockingLockRec.locking_instance; v_BlockingLockArray(v_NumBlockingLocksIncidents).LockingStatus := v_BlockingLockRec.locking_status; v_BlockingLockArray(v_NumBlockingLocksIncidents).LockingSid := v_BlockingLockRec.locking_sid; v_BlockingLockArray(v_NumBlockingLocksIncidents).LockingSerialNum := v_BlockingLockRec.locking_serial_num; v_BlockingLockArray(v_NumBlockingLocksIncidents).LockingOracleUsername := v_BlockingLockRec.locking_oracle_username; v_BlockingLockArray(v_NumBlockingLocksIncidents).LockingOSUsername := v_BlockingLockRec.locking_os_username; v_BlockingLockArray(v_NumBlockingLocksIncidents).LockingMachine := v_BlockingLockRec.locking_machine; v_BlockingLockArray(v_NumBlockingLocksIncidents).LockingSpid := v_BlockingLockRec.locking_spid; v_BlockingLockArray(v_NumBlockingLocksIncidents).LockingTerminal := v_BlockingLockRec.locking_terminal; v_BlockingLockArray(v_NumBlockingLocksIncidents).LockingProgram := v_BlockingLockRec.locking_program; v_BlockingLockArray(v_NumBlockingLocksIncidents).LockingLockTimeMinute := v_BlockingLockRec.locking_lock_time_min; v_BlockingLockArray(v_NumBlockingLocksIncidents).SQLText := v_BlockingLockRec.waiting_sql_text; END LOOP; CLOSE cur_BlockingLocks; DBMS_OUTPUT.PUT_LINE('Number of blocking lock incidents: ' || v_BlockingLockArray.COUNT); DBMS_OUTPUT.PUT(chr(10)); FOR RowIndex IN 1 .. v_BlockingLockArray.COUNT LOOP DBMS_OUTPUT.PUT_LINE('Incident ' || RowIndex); DBMS_OUTPUT.PUT_LINE('---------------------------------------------------------------------------------------------------------'); DBMS_OUTPUT.PUT_LINE(' WAITINGBLOCKING'); DBMS_OUTPUT.PUT_LINE('---------------------------------------- ----------------------------------------'); DBMS_OUTPUT.PUT_LINE('Instance Name : ' || RPAD(v_BlockingLockArray(RowIndex) .WaitingInstanceName, 41) || v_BlockingLockArray(RowIndex) .LockingInstanceName); DBMS_OUTPUT.PUT_LINE('Oracle SID : ' || RPAD(v_BlockingLockArray(RowIndex).WaitingSid, 41) || v_BlockingLockArray(RowIndex) .LockingSid); DBMS_OUTPUT.PUT_LINE('Serial# : ' || RPAD(v_BlockingLockArray(RowIndex) .WaitingSerialNum, 41) || v_BlockingLockArray(RowIndex) .LockingSerialNum); DBMS_OUTPUT.PUT_LINE('Oracle User : ' || RPAD(v_BlockingLockArray(RowIndex) .WaitingOracleUsername, 41) || v_BlockingLockArray(RowIndex) .LockingOracleUsername); DBMS_OUTPUT.PUT_LINE('O/S User : ' || RPAD(v_BlockingLockArray(RowIndex) .WaitingOSUsername, 41) || v_BlockingLockArray(RowIndex) .LockingOSUsername); DBMS_OUTPUT.PUT_LINE('Machine : ' || RPAD(v_BlockingLockArray(RowIndex).WaitingMachine, 41) || v_BlockingLockArray(RowIndex) .LockingMachine); DBMS_OUTPUT.PUT_LINE('O/S PID : ' || RPAD(v_BlockingLockArray(RowIndex).WaitingSpid, 41) || v_BlockingLockArray(RowIndex) .LockingSpid); DBMS_OUTPUT.PUT_LINE('Terminal : ' || RPAD(v_BlockingLockArray(RowIndex).WaitingTerminal, 41) || v_BlockingLockArray(RowIndex) .LockingTerminal); DBMS_OUTPUT.PUT_LINE('Lock Time : ' || RPAD(v_BlockingLockArray(RowIndex) .WaitingLockTimeMinute || ' minutes', 41) || v_BlockingLockArray(RowIndex) .LockingLockTimeMinute || ' minutes'); DBMS_OUTPUT.PUT_LINE('Status : ' || RPAD(v_BlockingLockArray(RowIndex).WaitingStatus, 41) || v_BlockingLockArray(RowIndex) .LockingStatus); DBMS_OUTPUT.PUT_LINE('Program : ' || RPAD(v_BlockingLockArray(RowIndex).WaitingProgram, 41) || v_BlockingLockArray(RowIndex) .LockingProgram); DBMS_OUTPUT.PUT_LINE('Waiter Lock Type : ' || v_BlockingLockArray(RowIndex) .WaiterLockType); DBMS_OUTPUT.PUT_LINE('Waiter Mode Request : ' || v_BlockingLockArray(RowIndex) .WaiterModeRequest); DBMS_OUTPUT.PUT_LINE('Waiting SQL : ' || v_BlockingLockArray(RowIndex) .SQLText); DBMS_OUTPUT.PUT(chr(10)); END LOOP;END;/ SET ECHO OFF SET FEEDBACK 6 SET HEADING ON SET LINESIZE 256 SET PAGESIZE 50000 SET TERMOUT ON SET TIMING OFF SET TRIMOUT ON SET TRIMSPOOL ON SET VERIFY OFF CLEAR COLUMNS CLEAR BREAKS CLEAR COMPUTES COLUMN instance_name FORMAT a9 HEADING 'Instance' COLUMN sid FORMAT 999999 HEADING 'SID' COLUMN sid_serial FORMAT a15 HEADING 'SID /Serial#' COLUMN session_status FORMAT a9 HEADING 'Status' COLUMN locking_oracle_user FORMAT a20 HEADING 'Locking Oracle User' COLUMN object_owner FORMAT a15 HEADING 'Object Owner' COLUMN object_name FORMAT a25 HEADING 'Object Name' COLUMN object_type FORMAT a15 HEADING 'Object Type' COLUMN locked_mode HEADING 'Locked Mode' CLEAR BREAKS PROMPT PROMPT PROMPT + ------------------------------------------------------------------------+PROMPT | LOCKED OBJECTS | PROMPT + ------------------------------------------------------------------------+ SELECT i.instance_name instance_name, l.session_id || ' / ' || s.serial# sid_serial, s.status session_status, l.oracle_username locking_oracle_user, o.owner object_owner, o.object_name object_name, o.object_type object_type, DECODE(l.locked_mode, 0, 'None' /* Mon Lock equivalent */, 1, 'NoLock' /* N */, 2, 'Row-Share (SS)' /* L */, 3, 'Row-Exclusive (SX)' /* R */, 4, 'Share-Table' /* S */, 5, 'Share-Row-Exclusive (SSX)' /* C */, 6, 'Exclusive' /* X */, '[Nothing]') locked_mode FROM dba_objects o, gvlockWHERElmode=0)ANDsw.paddr=pw.addr(+)ANDsh.paddr=ph.addr(+)ANDsw.sqladdress=aw.addressORDERBYiw.instancename,lw.sid;TYPEtBlockingLockRecordISRECORD(WaitingInstanceNameVARCHAR2(16),WaitingStatusVARCHAR2(8),WaitingSidNUMBER,WaitingSerialNumNUMBER,WaitingOracleUsernameVARCHAR2(30),WaitingOSUsernameVARCHAR2(30),WaitingMachineVARCHAR2(64),WaitingSpidVARCHAR2(12),WaitingTerminalVARCHAR2(30),WaitingProgramVARCHAR2(48),WaitingLockTimeMinuteNUMBER,WaiterLockTypeVARCHAR2(30),WaiterModeRequestVARCHAR2(30),LockingInstanceNameVARCHAR2(16),LockingStatusVARCHAR2(8),LockingSidNUMBER,LockingSerialNumNUMBER,LockingOracleUsernameVARCHAR2(30),LockingOSUsernameVARCHAR2(30),LockingMachineVARCHAR2(64),LockingSpidVARCHAR2(12),LockingTerminalVARCHAR2(30),LockingProgramVARCHAR2(48),LockingLockTimeMinuteNUMBER,SQLTextVARCHAR2(1000));TYPEtBlockingLockRecordTableISTABLEOFtBlockingLockRecordINDEXBYBINARYINTEGER;vBlockingLockArraytBlockingLockRecordTable;vBlockingLockReccurBlockingLockssession s, gvlockedobjectl,gvlocked_object l, gvlockedobjectl,gvinstance i WHERE i.inst_id = l.inst_id AND s.inst_id = l.inst_id AND s.sid = l.session_id AND o.object_id = l.object_id ORDER BY i.instance_name, l.session_id; --查询数据库正在执行的sql语句与该用户 SELECT a.spid 操作系统进程, b.sid, b.serial#, b.username 数据库用户, b.status, b.program, b.paddr, b.machine 计算机名, b.program, b.module, b.logon_time, b.event, c.sql_text 正在执行的SQL FROM vprocessa,vprocess a, vprocessa,vsession b, vKaTeX parse error: Expected 'EOF', got '#' at position 174: … A.serial#̲, A.OSUSE…SESSION A, VKaTeX parse error: Expected 'EOF', got '#' at position 278: … s.serial#̲, l.locke…locked_object l, all_objects o, vKaTeX parse error: Expected 'EOF', got '#' at position 92: …Y sid, s.serial#̲; --kill掉当前的锁对…sqlarea b where b.FIRST_LOAD_TIME between ‘2019-03-12/09:20:40’ and ‘2019-03-14/08:45:30’ order by b.FIRST_LOAD_TIME desc; --查找前十条性能(读)差的sql SELECT * FROM (select PARSING_USER_ID, EXECUTIONS 执行次数, SORTS, COMMAND_TYPE, DISK_READS 磁盘读, sql_text, SQL_FULLTEXT 文本, sql_id, FIRST_LOAD_TIME, last_active_time, last_load_time, object_status, cpu_time / 1000, module, parsing_schema_name FROM vsqlareaorderBYdiskreadsDESC)whereROWNUM<10;===================================================−−查看当前运行的某个session执行的SQLSELECTb.sqltext,b.SQLFULLTEXT,a.machineOS机器,a.username数据库执行的用户,a.module,c.target被操作的对象,c.sofar/totalwork∗100,−−conpletepercentc.elapsedseconds执行几秒,c.timeremaining剩余时间FROMvsqlarea order BY disk_reads DESC) where ROWNUM < 10; =================================================== --查看当前运行的某个session执行的SQL SELECT b.sql_text, b.SQL_FULLTEXT, a.machine OS机器, a.username 数据库执行的用户, a.module, c.target 被操作的对象, c.sofar / totalwork * 100, --conplete percent c.elapsed_seconds 执行几秒, c.time_remaining 剩余时间 FROM vsqlareaorderBYdiskreadsDESC)whereROWNUM<10;===================================================−−查看当前运行的某个session执行的SQLSELECTb.sqltext,b.SQLFULLTEXT,a.machineOS机器,a.username数据库执行的用户,a.module,c.target被操作的对象,c.sofar/totalwork∗100,−−conpletepercentc.elapsedseconds执行几秒,c.timeremaining剩余时间FROMvsession a, vsqlareab,vsqlarea b, vsqlareab,vsession_longops c WHERE a.sql_hash_value = b.hash_value(+) AND a.SID = c.SID(+) AND a.serial# = c.serial#(+) --AND a.sid = 5571 =================================================== --查看最近执行过的sql语句: SELECT sql_text, last_load_time FROM vsqlWHERElastloadtimeISNOTNULL−−andsqltextlike′selectsql WHERE last_load_time IS NOT NULL --and sql_text like 'select%' ORDER BY last_load_time DESC; --查看当前的每个session正在执行的sql语句: SELECT a.sid, a.serial#, a.username, a.module, b.sql_text FROM vsqlWHERElastloadtimeISNOTNULL−−andsqltextlike′selectsession a, vsqltextbWHEREa.sqladdress=b.addressanda.status=′ACTIVE′−−ANDa.sid=???ORDERBYb.piece;−−查看Oracle数据库中的长事务:setlinesize200setpagesize5000coltransactiondurationformata45withtransactiondetailsas(selectinstid,sesaddr,sysdate−startdateasdifffromgvsqltext b WHERE a.sql_address = b.address and a.status = 'ACTIVE'--AND a.sid = ??? ORDER BY b.piece; --查看Oracle 数据库中的长事务:set linesize 200 set pagesize 5000 col transaction_duration format a45 with transaction_details as (select inst_id, ses_addr, sysdate - start_date as diff from gvsqltextbWHEREa.sqladdress=b.addressanda.status=′ACTIVE′−−ANDa.sid=???ORDERBYb.piece;−−查看Oracle数据库中的长事务:setlinesize200setpagesize5000coltransactiondurationformata45withtransactiondetailsas(selectinstid,sesaddr,sysdate−startdateasdifffromgvtransaction)select s.sid, s.serial#, s.username, s.program, to_char(trunc(t.diff)) || ’ days, ’ || to_char(trunc(mod(t.diff * 24, 24))) || ’ hours, ’ || to_char(trunc(mod(t.diff * 24 * 60, 24))) || ’ minutes, ’ || to_char(trunc(mod(t.diff * 24 * 60 * 60, 60))) || ’ seconds’ as transaction_duration, s.terminal, s.status, s.osuser, s.process, s.machine, s.event from gvsessions,transactiondetailstwheres.instid=t.instidands.saddr=t.sesaddrands.status=′ACTIVE′orderbyt.diffdesc;−−查询长事务SQL:下面SQL查询数据库中正在执行大于N秒的事务信息:withltras(selecttochar(sysdate,′YYYYMMDDHH24MISS′)时间,s.sid,s.sqlid,s.sqlchildnumber,s.prevsqlid,xid,tochar(t.startdate,′YYYYMMDDHH24MISS′)starttime,e.TYPE,e.block,e.ctime,decode(e.CTIME,0,(sysdate−t.startdate)∗3600∗24,e.ctime)elsecond−−q.sqltextfromvsession s, transaction_details t where s.inst_id = t.inst_id and s.saddr = t.ses_addr and s.status = 'ACTIVE' order by t.diff desc; --查询长事务SQL:下面SQL 查询数据库中正在执行大于N秒的事务信息: with ltr as (select to_char(sysdate, 'YYYYMMDDHH24MISS') 时间, s.sid, s.sql_id, s.sql_child_number, s.prev_sql_id, xid, to_char(t.start_date, 'YYYYMMDDHH24MISS') start_time, e.TYPE, e.block, e.ctime, decode(e.CTIME, 0, (sysdate - t.start_date) * 3600 * 24, e.ctime) el_second -- q.sql_text from vsessions,transactiondetailstwheres.instid=t.instidands.saddr=t.sesaddrands.status=′ACTIVE′orderbyt.diffdesc;−−查询长事务SQL:下面SQL查询数据库中正在执行大于N秒的事务信息:withltras(selecttochar(sysdate,′YYYYMMDDHH24MISS′)时间,s.sid,s.sqlid,s.sqlchildnumber,s.prevsqlid,xid,tochar(t.startdate,′YYYYMMDDHH24MISS′)starttime,e.TYPE,e.block,e.ctime,decode(e.CTIME,0,(sysdate−t.startdate)∗3600∗24,e.ctime)elsecond−−q.sqltextfromvtransaction t, vsessions,vsession s, vsessions,vtransaction_enqueue e where t.start_date <= sysdate - interval ‘100’ second /查询开始多少秒的事务/ and t.addr = s.taddr --and s.sql_child_number = q.CHILD_NUMBER(+) --and s.sql_id = q.sql_id(+) and s.prev_sql_id = q.sql_id(+) and t.addr = e.addr(+))select ltr., (select q1.sql_text from vsqlq1whereltr.prevsqlid=q1.sqlid(+)andrownum=1)prevsqltext,(selectq1.sqltextfromvsql q1 where ltr.prev_sql_id = q1.sql_id(+) and rownum = 1) prev_sql_text, (select q1.sql_text from vsqlq1whereltr.prevsqlid=q1.sqlid(+)andrownum=1)prevsqltext,(selectq1.sqltextfromvsql q1 where ltr.sql_id = q1.sql_id(+) and ltr.sql_child_number = q1.CHILD_NUMBER(+)) sql_text from ltr ltr; --查看正在并行的SQLselect s.username, s.machine, s.program, s.module, s.client_info, s.status, s.sid, s.sql_id, q.degree from vsessions,(selectqcsid,count(∗)−1degreefromvsession s, (select qcsid, count(*) - 1 degree from vsessions,(selectqcsid,count(∗)−1degreefromvpx_session group by qcsid) q where s.sid=q.qcsid order by 1,4;select * from v$px_session group by qcsid;