--查看cpu
select * from dba_hist_snapshot t order by t.end_interval_time desc ;
select * from (select round(nvl((sqt.cput / 1000000), to_number(null)),2) "Cpu Time (s)",
round( nvl((sqt.elap / 1000000), to_number(null)),2) "Elap Time (s)",
sqt.exec,
round(decode(sqt.exec,0,to_number(null),(sqt.cput / sqt.exec / 1000000)),2) "Cpu per Exec (s)",
round((100 * (sqt.elap / (select sum(e.value) - sum(b.value)
from dba_hist_sys_time_model b,
dba_hist_sys_time_model e
where b.snap_id = &beg_snap and
e.snap_id = &end_snap and
e.stat_name = 'DB time' and
b.stat_name = 'DB time'))) ,2)norm_val,
sqt.sql_id,
sqt.plan_hash_value,
decode(sqt.module, null, null, 'Module: ' || sqt.module) SqlModule,
nvl(to_nchar(SUBSTR(st.sql_text,1,2000)) , (' ** SQL Text Not Available ** ')) SqlText
from (select sql_id,
plan_hash_value,
max(module) module,
sum(cpu_time_delta) cput,
sum(elapsed_time_delta) elap,
sum(executions_delta) exec
from dba_hist_sqlstat
where &beg_snap < snap_id and
snap_id <= &end_snap
group by sql_id,plan_hash_value) sqt,
dba_hist_sqltext st
where st.sql_id(+) = sqt.sql_id
order by nvl(sqt.cput, -1) desc,
sqt.sql_id)
where rownum < 65 and
(rownum <= 10 or norm_val > 1);
SELECT
*
FROM
(
SELECT
X.*, Y.SQL_TEXT
FROM
(
SELECT
A.SQL_ID,
A.SQL_PLAN_HASH_VALUE,
SUM
(A.TM_DELTA_CPU_TIME / 1000) CPU_TIMES,
SUM
(A.TM_DELTA_DB_TIME) / 1000 DB_TIMES,
SUM
(A.DELTA_READ_IO_REQUESTS) IOPS,
SUM
(A.DELTA_READ_IO_BYTES) / 1024 / 1024 / 1024 DISK_READS
FROM
V$ACTIVE_SESSION_HISTORY A
WHERE
A.SAMPLE_TIME > =TO_DATE(
'2017-07-22 10:00:00'
,
'YYYY-MM-DD HH24:MI:SS'
)
AND
A.SAMPLE_TIME < =TO_DATE(
'2017-07-22 11:00:00'
,
'YYYY-MM-DD HH24:MI:SS'
)
GROUP
BY
A.SQL_ID, A.SQL_PLAN_HASH_VALUE) X,
(
SELECT
DISTINCT
B.SQL_ID, B.PLAN_HASH_VALUE, B.SQL_TEXT
FROM
V$SQL B) Y
WHERE
X.SQL_ID = Y.SQL_ID
AND
X.SQL_PLAN_HASH_VALUE = Y.PLAN_HASH_VALUE)
WHERE
DISK_READS > 1
ORDER
BY
DISK_READS
DESC
;
--发现那些SQL运行了大量的PARSE
select sql_text, parse_calls, executions
from v$sqlarea
order by parse_calls desc;
--SYS的总的PARSE情况
select name, value from v$sysstat where name like 'parse count%';
--CPU空间及繁忙情况
select * from v$osstat;
--查看每个Session的CPU利用情况:
select ss.sid, se.command, ss.value CPU, se.username, se.program
from v$sesstat ss, v$session se
where ss.statistic# in
(select statistic#
from v$statname
where name = 'CPU used by this session')
and se.sid = ss.sid
and ss.sid > 6
order by CPU desc;
--比较一下哪个session的CPU使用时间最多,然后查看该Session的具体情况:
select s.sid, s.event, s.MACHINE, s.OSUSER, s.wait_time, w.seq#, q.sql_text
from v$session_wait w, v$session s, v$process p, v$sqlarea q
where s.paddr = p.addr
and s.sid = &p
and s.sql_address = q.address;
--占用CPU最高的10个Session及其SQL语句
select s.sid,
w.wait_time,
w.seconds_in_wait,
w.state,
w.wait_time_micro,
w.time_remaining_micro,
w.time_since_last_wait_micro,
p.USERNAME,
status,
server,
schemaname,
osuser,
machine,
p.terminal,
p.program,
logon_time,
w.event,
w.wait_class,
tracefile,
sql_text,
last_active_time
from v$session_wait w, v$session s, v$process p, v$sqlarea q
where s.paddr = p.addr
and s.sid in (select sid
from (select ss.sid
from v$sesstat ss, v$session se
where ss.statistic# in
(select statistic#
from v$statname
where name = 'CPU used by this session')
and se.sid = ss.sid
and ss.sid > 6
order by ss.value desc)
where rownum < 11)
and s.sql_address = q.address;
SELECT executions,
end_of_fetch_count,
elapsed_time / px_servers elapsed_time,
cpu_time / px_servers cpu_time,
buffer_gets / executions buffer_gets
FROM (SELECT sum(executions_delta) as EXECUTIONS,
sum(case
when px_servers_execs_delta > 0 then
px_servers_execs_delta
else
executions_delta
end) as px_servers,
sum(end_of_fetch_count_delta) as end_of_fetch_count,
sum(elapsed_time_delta) as ELAPSED_TIME,
sum(cpu_time_delta) as CPU_TIME,
sum(buffer_gets_delta) as BUFFER_GETS
FROM DBA_HIST_SQLSTAT s, V$DATABASE d, DBA_HIST_SNAPSHOT sn
WHERE s.dbid = d.dbid
AND bitand(nvl(s.flag, 0), 1) = 0
AND sn.end_interval_time >
(select systimestamp at TIME ZONE dbtimezone from dual) - 7
AND s.sql_id = :1
AND s.snap_id = sn.snap_id
AND s.instance_number = sn.instance_number
AND s.dbid = sn.dbid
AND parsing_schema_name = :2)
select stime,
sum(nvl(case
when event = 'db file sequential read' then
round(times, 2)
end,
0)) as "db file sequential rea",
sum(nvl(case
when event = 'log file sync' then
round(times, 2)
end,
0)) as "log file sync",
sum(nvl(case
when event = 'log file parallel write' then
round(times, 2)
end,
0)) as "log file parallel write",
sum(nvl(case
when event = 'db file scattered read' then
round(times, 2)
end,
0)) as "db file scattered read"
from (select t.snap_id,
to_char(b.begin_interval_time, 'yyyy-mm-dd hh24:mi:ss') stime,
event_name event,
decode(sign(total_waits - lag(total_waits, 1)
over(partition by event_name order by t.snap_id)),
-1,
(lag(time_waited_micro, 1)
over(partition by event_name order by t.snap_id)) /
(lag(total_waits, 1)
over(partition by t.instance_number,
event_name order by t.snap_id)),
0,
0,
(time_waited_micro - lag(time_waited_micro, 1)
over(partition by event_name order by t.snap_id)) /
(total_waits - lag(total_waits, 1)
over(partition by event_name order by t.snap_id))) / 1000 as times
from dba_hist_system_event t, dba_hist_snapshot b
where t.snap_id = b.snap_id
and b.begin_interval_time > trunc(sysdate-10)
and b.instance_number = t.instance_number
and event_name in
('db file sequential read', 'log file sync',
'db file scattered read', 'log file parallel write')
and t.instance_number = 1)
where times > 0
group by snap_id, stime
order by snap_id desc;
select b.event EVENT,
a.username 用户,
a.sid SID,
c.address ADDRESS,
substr(c.sql_text, 1, 100) SQL
from gv$session a,
gv$session_wait b,
gv$sql c,
(select event, count(1) num
from gv$session_wait
where event not in
('SQL*Net message from client',
'SQL*Net message to client',
'rdbms ipc message',
'queue messages',
'Streams AQ: waiting for messages in the queue')
group by event
having(event = 'latch free' and count(1) > 20) or (event = 'db file sequential read' and count(1) > 100) or (event = 'buffer busy waits' and count(1) > 100) or (event = 'db file scattered read' and count(1) > 20) or (event not in('latch free',
'db file sequential read',
'buffer busy waits',
'db file scattered read') and count(1) > 20)) d
where a.sid = b.sid
and a.sql_address = c.address
and b.event = d.event
order by 2
find ./ -mtime +10 -exec rm -rf {} \;
SELECT 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#
FROM gv$session s, gv$lock l, dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT NULL
AND O.object_name=upper('');
SELECT
A.OWNER, --OBJECT所属用户
A.OBJECT_NAME, --OBJECT名称(表名)
B.XIDUSN,
B.XIDSLOT,
B.XIDSQN,
B.SESSION_ID, --锁表用户的session
B.ORACLE_USERNAME, --锁表用户的Oracle用户名
B.OS_USER_NAME, --锁表用户的操作系统登陆用户名
B.PROCESS,
B.LOCKED_MODE,
C.MACHINE, --锁表用户的计算机名称(例如:WORKGROUP\UserName)
C.STATUS, --锁表状态
C.SERVER,
C.SID,
C.SERIAL#,
C.PROGRAM --锁表用户所用的数据库管理工具(例如:ob9.exe)
FROM
ALL_OBJECTS A,
V$LOCKED_OBJECT B,
SYS.GV_$SESSION C
WHERE
A.OBJECT_ID = B.OBJECT_ID
AND B.PROCESS = C.PROCESS;
set linesize 300
set pagesize 300
select * from table(dbms_xplan.display_cursor(null, null, 'ADVANCED'));
select * from table(dbms_xplan.display_cursor('', 0, 'allstats last'));
select output from table(dbms_workload_repository.ash_report_html( dbid , inst_num , l_btime , l_etime);
select * from table(dbms_xplan.display_awr('',,null,'ADVANCED'));
EXPLAIN PLAN FOR ;
select * from table(dbms_xplan.display_cursor('', 0, 'iostats last -predicate -note'));
/*+gather_plan_statistics ab*/
===================DB wait event监控========================
select /*+ordered*/
sw.seq#,
sw.event,
s.username,
s.OSUSER,
s.TERMINAL,
d.event_count,
'SID' || s.sid,
s.serial#,
s.BLOCKING_SESSION,
s.blocking_instance,
s.machine,
sw.p2,
sw.P1RAW,
sw.wait_time || 'csec',
sw.seconds_in_wait || 'sec',
sw.state,
(select st.sql_id
from v$sql st
where s.sql_hash_value = st.hash_value
and rownum = 1 ) sql_id,
(select st.sql_text
from v$sql st
where s.sql_hash_value = st.hash_value
and rownum = 1 ) sql_text
from (select event, count(1) event_count
from v$session_wait
where state <> 'WAITED SHORT TIME'
and event not like '%SQL*Net%'
and event not like 'PXDeq%'
and event not like 'rdbms ipc message'
and event not like 'queue messages'
and event not like
'Streams AQ: waiting for messages in the queue'
and event not like 'jobq slave wait'
and event not like 'class slave wait'
and event not like 'db file parallel write'
group by event
having((event = 'latch free' and count(1) > 10) or (event = 'ARCH wait on SENDREQ' and count(1) > 40) or (event = 'latch: cache buffers chains' and count(1) > 10) or (event = 'enqueue' and count(1) > 10) or (event = 'read by other session' and count(1) > 20) or (event = 'db file scattered read' and count(1) > 15) or (event = 'db file sequential read' and count(1) > 60) or (event = 'buffer busy waits' and count(1) > 10) or (event not in ('db file sequential read', 'buffer busy waits', 'db file scattered read', 'latch free', 'enqueue', 'read by other session', 'TCP Socket (KGAS)', 'ARCH wait on SENDREQ') and count(1) > 10))) d,
v$session_wait sw,
v$session s
where d.event = sw.event
and sw.sid = s.sid
order by sw.event, s.username
---查询热块对象sql语句:
SELECT *
FROM (SELECT O.OWNER, O.OBJECT_NAME, O.OBJECT_TYPE, SUM(TCH) TOUCHTIME,
FROM X$BH B, DBA_OBJECTS O
WHERE B.OBJ = O.DATA_OBJECT_ID
AND B.TS# > 0
GROUP BY O.OWNER, O.OBJECT_NAME, O.OBJECT_TYPE
ORDER BY SUM(TCH) DESC)
WHERE ROWNUM <= 10 ;
--查找热点块操作语句
SELECT /*+rule*/
HASH_VALUE, SQL_TEXT
FROM V$SQLTEXT
WHERE (HASH_VALUE, ADDRESS) IN
(SELECT A.HASH_VALUE, A.ADDRESS
FROM V$SQLTEXT A,
(SELECT DISTINCT A.OWNER, A.SEGMENT_NAME, A.SEGMENT_TYPE
FROM DBA_EXTENTS A,
(SELECT DBARFIL, DBABLK
FROM (SELECT DBARFIL, DBABLK
FROM X$BH
ORDER BY TCH DESC)
WHERE ROWNUM < 11) B
WHERE A.RELATIVE_FNO = B.DBARFIL
AND A.BLOCK_ID <= B.DBABLK
AND A.BLOCK_ID + A.BLOCKS > B.DBABLK) B
WHERE A.SQL_TEXT LIKE '%' || B.SEGMENT_NAME || '%'
AND B.SEGMENT_TYPE = 'TABLE')
ORDER BY HASH_VALUE, ADDRESS, PIECE;
col name for a40
col PARAMETER1 for a15
col PARAMETER2 for a15
col PARAMETER3 for a15
col WAIT_CLASS for a30
select name,PARAMETER1,PARAMETER2,PARAMETER3,WAIT_CLASS from v$event_name where name like '%db file s%';
--查看row cache objects 的具体信息:
SELECTaddr,
latch#,
child#,
level#,
name,
gets,
misses,
sleeps
FROMv$latch_children
WHEREname='rowcache objects' AND gets <>0
ORDER BYgets;
SELECT "WHERE",sleep_count, location
FROMv$latch_misses
WHEREparent_name = 'row cacheobjects' ANDsleep_count > 0;
SELECT DISTINCTr.cache#,
r.parameter name,
r.TYPE,
r.subordinate#,
r.gets
FROMv$rowcache r
ORDER BY1, 4,5;
我们可以使用如下SQL检查row cache 是否高效。 pct_succ_gets 接近与100最好,如果接近于0,就说明需要优化。
SELECT parameter,
SUM(gets),
SUM(getmisses),
100 * SUM (gets-getmisses)/sum(gets)pct_succ_gets,
sum(modifications)updates
FROM V$ROWCACHE
WHERE gets >0
GROUP BYparameter;
SELECT sum(VALUE) / 1024 / 1024
FROM v$session s, v$sesstat st, v$statname sn, v$process p
WHERE st.SID = s.SID
AND st.statistic# = sn.statistic#
AND sn.NAME LIKE 'session pga memory'
AND p.addr = s.paddr
AND VALUE > 10 * 1024 * 1024;
Oracle latch: row cache objects系统整体慢:可以看到到底是哪个数据字典争用严重。
col cache# head "Cache|no" form 999
col parameter head "Parameter" form a25
col type head "Type" form a12
col subordinate# head "Sub|ordi|nate" form 9999
col rcgets head "Cache|Gets" form 999999999999
col rcmisses head "Cache|Misses" form 999999999999
col rcmodifications head "Cache|Modifica|tions" form 999999999999
col rcflushes head "Cache|Flushes" form 999999999999
col kqrstcln head "Child#" form 999
col lagets head "Latch|Gets" form 999999999999
col lamisses head "Latch|Misses" form 999999999999
col laimge head "Latch|Immediate|gets" form 999999999999
select dc.kqrstcid CACHE#, dc.kqrsttxt PARAMETER, decode(dc.kqrsttyp, 1,'PARENT','SUBORDINATE') type,
decode(dc.kqrsttyp, 2, kqrstsno, null) subordinate#,
dc.kqrstgrq rcgets, dc.kqrstgmi rcmisses, dc.kqrstmrq rcmodifications, dc.kqrstmfl rcflushes, dc.kqrstcln,
la.gets lagets, la.misses lamisses, la.immediate_gets laimge
from x$kqrst dc,
v$latch_children la
where dc.inst_id = userenv('instance')
and la.child# = dc.kqrstcln
and la.name = 'row cache objects'
order by rcgets desc
/
疑问:sql增加字段怎么处理
http://blog.csdn.net/tianlesoftware/article/details/6919280
x$kcvfh
高水位线
http://blog.csdn.net/qq578473688/article/details/54561458
ORA-04030: (kxs-heap-w,kcbpioqInitClientBuffer
依赖关系
crsctl status res para .db -p
crsctl status res serverpool.pl
SQL> select ksppinm as "hidden parameter", ksppstvl as "value" from x$ksppi join x$ksppcv using (indx) where ksppinm like '%_pga_max_size%' order by ksppinm;
--------------------
http://www.cnblogs.com/xudong-bupt/p/3721210.html
http://blog.csdn.net/msdnchina/article/details/46278299
http://www.itpub.net/thread-1310824-2-1.html
http://blog.tanelpoder.com/2012/09/03/optimizer-statistics-driven-direct-path-read-decision-for-full-table-scans-_direct_read_decision_statistics_driven/
enq: KO - fast object checkpoint
-----------------------------------
select FILE# ,to_char(CHECKPOINT_CHANGE#) , LAST_CHANGE# from v$datafile;
select FILE# ,to_char(CHECKPOINT_CHANGE#) from v$datafile_header;
SQL> select sequence#,checkpoint_change#,last_redo_change# from v$thread;
ALTER SYSTEM SET "_system_trig_enabled"=false;
SQL> select event, wait_time_milli,wait_count
2 from v$event_histogram
3 where event = 'log file parallel write';
SELECT SQL_TEXT, EXECUTIONS
FROM (SELECT SQL_TEXT,
EXECUTIONS,
RANK() OVER(ORDER BY EXECUTIONS DESC) EXEC_RANK
FROM V$SQLAREA)
WHERE EXEC_RANK <= 15;
SELECT TO_CHAR(N.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD') "DATETIME",
m.snap_id,
M.SQL_ID,
m.plan_hash_value,
M.EXECUTIONS_DELTA,
round(m.buffer_gets_delta /m.executions_delta,3) as buffer_gets_delta ,
round(m.elapsed_time_delta /m.executions_delta,3) as elapsed_time_delta ,
round(m.disk_reads_delta /m.executions_delta,3) as disk_reads_delta ,
FROM DBA_HIST_SQLSTAT M, DBA_HIST_SNAPSHOT N
WHERE M.SNAP_ID = N.SNAP_ID
AND M.DBID = N.DBID
AND M.INSTANCE_NUMBER = N.INSTANCE_NUMBER
AND M.INSTANCE_NUMBER = 1
AND TO_CHAR(N.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD') = '2014-11-20'
AND M.SQL_ID = &SQL_ID
ORDER BY M.snap_id desc;
SELECT M.SQL_ID ,
TO_CHAR(N.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD') "DATETIME",
SUM(M.EXECUTIONS_DELTA) EXECUTIONS
FROM DBA_HIST_SQLSTAT M, DBA_HIST_SNAPSHOT N
WHERE M.SNAP_ID = N.SNAP_ID
AND M.DBID = N.DBID
AND M.INSTANCE_NUMBER = N.INSTANCE_NUMBER
AND M.INSTANCE_NUMBER=1
AND TO_CHAR(N.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD') ='2014-11-20'
AND M.SQL_ID=&SQL_ID
GROUP BY M.SQL_ID , TO_CHAR(N.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD')
ORDER BY M.SQL_ID
col USERNAME for a10
col SPID for a8
col PROGRAM for a20
select p.username,p.spid,p.program,pm.category,pm.used,pm.allocated,pm.max_allocated
from v$process p ,v$process_memory pm
where p.pid=pm.pid
and p.pid in
(select addr,pid,spid,username from v$process
where addr in (select distinct paddr from v$session where username is not null));
--sql stat in snapshot
select t.snap_id,
to_char(t.begin_interval_time, 'yyyy-mm-dd hh24:mi:ss') begin_interval_time,
s.sql_id,
cpu_time_delta cpu_time,
round(cpu_time_delta/decode(executions_delta,0,1,executions_delta)) avg_cpu_time,
executions_delta executions,
elapsed_time_delta elapsed_time,
round(elapsed_time_delta/decode(executions_delta,0,1,executions_delta)) avg_elapsed_time,
buffer_gets_delta buffer_gets,
round(buffer_gets_delta/decode(executions_delta,0,1,executions_delta)) avg_buffer_gets,
s.rows_processed_delta,
disk_reads_delta disk_reads,
fetches_delta fetches,
sorts_delta sorts,
s.plan_hash_value
from dba_hist_sqlstat s, dba_hist_snapshot t
where s.snap_id = t.snap_id
and t.begin_interval_time
between to_date('', 'yyyy-mm-dd hh24:mi:ss')
and to_date('', 'yyyy-mm-dd hh24:mi:ss')
and sql_id = ''
-- and plan_hash_value in (1101836845, 2899593734)
order by s.snap_id desc
select end_time, process from (select to_char(trunc(end_time,'mi'), 'YYYY-MM-DD HH24:MI:SS') end_time,
round(value*limit_value/100) process from v$sysmetric_history,(select limit_value from v$resource_limit where resource_name = 'processes') where metric_name = 'Process Limit %');
select end_time, current_process, process_value, used_pct
from (select to_char(trunc(end_time, 'mi'), 'YYYY-MM-DD HH24:MI:SS') end_time,
round(value * limit_value / 100) current_process,
limit_value process_value,
round(value, 2) || '%' used_pct
from v$sysmetric_history,
(select limit_value
from v$resource_limit
where resource_name = 'processes')
where metric_name = 'Process Limit %')
order by end_time desc
-- unlock user's statistic
SPOOL ./script/unlock_user_statistic.sql
SELECT 'spool ./log/unlock_user_statistic.log' FROM dual;
SELECT distinct 'exec dbms_stats.unlock_schema_stats (ownname => '''||owner||''');'
FROM dba_tab_statistics
WHERE owner in (select owner from t_user_cfg);
SELECT 'spool off' FROM dual;
SPOOL OFF
SELECT distinct 'exec dbms_stats.lock_table_stats (ownname => '''||owner||''', tabname => '''||table_name||''');'
SELECT /*+ rule */
s.username
, s.logon_time
, s.sid
, s.serial#
, s.status
, s.username
, s.osuser
, s.machine
, DECODE (l.lmode, 0, 'lock waiter', 'lock holder') resp
, s.program
, s.module
, s.sql_address
FROM v$session s
, v$lock l
WHERE l.id1 IN (SELECT c.id1
FROM v$lock c
WHERE c.lmode = 0)
AND l.sid = s.sid
ORDER BY l.id1
, l.BLOCK DESC;
select l.inst_id,decode(request, 0, 'holder:', 'waiter:') || l.sid holder_msg,
s.username,
s.osuser,
s.machine,
s.status,
s.sql_id,
s.prev_sql_id,
q.sql_text,
q2.sql_text pre_sql_text,
id1,
id2,
lmode,
request,
l.type,
ctime
from gv$lock l left outer join gv$session s on (l.inst_id=s.inst_id and l.sid = s.sid)
left outer join gv$sql q on (s.inst_id=q.inst_id and s.sql_id=q.sql_id)
left outer join gv$sql q2 on (s.inst_id=q2.inst_id and s.prev_sql_id=q2.sql_id)
where l.type in ('TX','TM')
and (request <> 0 or block <> 0 )
and ctime > 600
order by inst_id,id1, request;
SELECT s.username,
s.logon_time,
s.sid,
s.serial#,
s.status,
s.username,
s.osuser,
s.machine,
DECODE (l.lmode, 0, 'lock waiter', 'lock holder') resp,
s.program,
s.module,
a.sql_text
FROM v$session s, v$sqlarea a, v$lock l
WHERE l.id1 IN (SELECT id1
FROM v$lock
WHERE lmode = 0)
AND l.sid = s.sid
AND s.sql_address = a.address
ORDER BY l.id1,BLOCK DESC
undo表空间中常用的操作:
(1)查看undo表空间undotbs1的属性:
SQL> select b.tablespace_name,AUTOEXTENSIBLE,RETENTION from dba_tablespaces a,dba_data_files b
where a.TABLESPACE_NAME=b.TABLESPACE_NAME and b.TABLESPACE_NAME='UNDOTBS1';
TABLESPACE_NAME AUT RETENTION
---------------------- --- ----------------
UNDOTBS1 NO NOGUARANTEE
(2)查看各个回退段的使用信息:
select a.name,b.extents,b.rssize,b.writes,b.xacts,b.wraps
from v$rollname a,v$rollstat b where a.usn=b.usn;
(3)确定哪些用户正在使用undo段:
SQL> select a.username,b.name,c.used_ublk from v$session a,v$rollname b,v$transaction c
where a.saddr=c.ses_addr and b.usn=c.xidusn;
USERNAME NAME USED_UBLK
---------- ----------------------- ----------
NDMC _SYSSMU1_1255220753$ 1
NDMC _SYSSMU5_1255220754$ 1
(4)每秒生成的UNDO量,可以通过如下SQL得出:
SQL> SELECT (SUM(undoblks))/ SUM((end_time - begin_time) * 86400) FROM v$undostat;
(SUM(UNDOBLKS))/SUM((END_TIME-BEGIN_TIME)*86400)
--------------------------------------------------------------
7.97590055
或者可以看下AWR报告中的Undo Statistics部分。
(5)当前undo表空间使用状态:
SQL> SELECT DISTINCT STATUS,SUM(BYTES),COUNT(*) FROM DBA_UNDO_EXTENTS GROUP BY STATUS;
STATUS SUM(BYTES) COUNT(*)
--------- ---------------- ----------
UNEXPIRED 3225157632 5667
EXPIRED 1063518208 1588
ACTIVE 1048576 1
(6)查看活动事务v$transaction
SQL> SELECT A.SID, A.USERNAME, B.XIDUSN, B.USED_UREC, B.USED_UBLK
FROM V$SESSION A, V$TRANSACTION B WHERE A.SADDR=B.SES_ADDR;
SID USERNAME XIDUSN USED_UREC USED_UBLK
---------- ------------ ---------- ---------- ----------
407 NDMC 15 3 1
SQL> SELECT XID AS "txn_id", XIDUSN AS "undo_seg", USED_UBLK "used_undo_blocks",
XIDSLOT AS "slot", XIDSQN AS "seq", STATUS AS "txn_status"
FROM V$TRANSACTION;
txn_id undo_seg used_undo_blocks slot seq txn_status
---------------- ---------- ---------------- ---------- --------- -------------
14001600733A0C00 20 1 22 801395 ACTIVE
1)检查long operation
SQL> select sid, target,opname, sofar,totalwork,time_remaining
from v$session_longops where time_remaining>0;
2)检查占用回滚段较多的事务:
SQL> select xidusn,s.sid,s.last_call_et, s.username, used_ublk,USED_UREC,space,
RECURSIVE, NOUNDO, START_UBAFIL,start_ubablk, start_uext
from v$transaction t, v$session s
where t.ses_addr=s.saddr;
sid and undo:
select xidusn,s.sid,s.last_call_et, s.username, used_ublk,USED_UREC,space,
RECURSIVE, NOUNDO, START_UBAFIL,start_ubablk, start_uext
from v$transaction t, v$session s
where t.ses_addr=s.saddr;
如果想查询某一个具体的隐含参数的值,只需要在上面原基础上加上 and x.ksppinm ='XXXXX' 过滤。
例如查询 _gc_undo_affinity 。
col name for a30;
col value for a10;
select
x.ksppinm name,
y.ksppstvl value,
y.ksppstdf isdefault,
decode(bitand(y.ksppstvf,7),1,'MODIFIED',4,'SYSTEM_MOD','FALSE') ismod,
decode(bitand(y.ksppstvf,2),2,'TRUE','FALSE') isadj
from
sys.x$ksppi x,
sys.x$ksppcv y
where
x.inst_id = userenv('Instance') and
y.inst_id = userenv('Instance') and
x.indx = y.indx and x.ksppinm like '%_undo_%'
order by
translate(x.ksppinm, ' _', ' ')
/
这个语句可以查出来哪些SQL占了比较大的 shared pool ,
并生成将该 SQL 移出 shared pool 的语句(需 sys 才能执行)
Shared pool free size 很小时,不要清理 shared pool ,
只可有选择性的将一些非绑定变量语句移出去。
select sql_id,sql_text,sql_fulltext,executions,round(sharable_mem/1024/1024,2) sharmemo_used_mb,
last_active_time,parsing_schema_name,s.service,
'exec dbms_shared_pool.purge('''||address||','||hash_value||''',''c'');' remove_sql
from v$sql s
where s.sharable_mem > 1 * 1024 * 1024
order by s.sharable_mem desc;
select inst_id,pool,name,round(sum(bytes)/1024/1024,2) size_mb from gv$sgastat where pool='shared pool' and name='free memory' group by inst_id,pool,name;
----cpu_time
select SUBSTR(TO_CHAR(begin_time, 'HH:MI' ),1,4) || '0' as BEGIN_TIME,
AVG(value) as avg_VALUE,
min(value) as min_VALUE,
max(value) as max_VALUE,
count(*)
from V$SYSMETRIC_HISTORY
where metric_name= 'Host CPU Utilization (%)'
group by SUBSTR(TO_CHAR(begin_time, 'HH:MI' ),1,4)
order by 1;
1、在source database 创建staging table
BEGIN
DBMS_SPM.CREATE_STGTAB_BASELINE(
table_name =>'chad_spm_migrate',
table_owner => 'DBMGR',
tablespace_name => 'USERS');
END;
2、将SQL Planbaselines 导入staging table ----(根据sql_handle与PLAN_NAME进行导出)
DECLARE
l_plans_packed PLS_INTEGER;
BEGIN
l_plans_packed := DBMS_SPM.pack_stgtab_baseline(
table_name =>'chad_spm_migrate',
table_owner => 'DBMGR',
sql_handle => 'SQL_43aa553e72757e01',
plan_name =>'SQL_PLAN_47akp7tt7azh16a45e050');
DBMS_OUTPUT.put_line('Plans Packed: ' || l_plans_packed);
END;
3、将chad_spm_migrate传输到目标库,可以使用exp/imp ;
4、 将chad_spm_migrate导入目标库
SET SERVEROUTPUT ON
DECLARE
l_plans_unpacked PLS_INTEGER;
BEGIN
l_plans_unpacked := DBMS_SPM.unpack_stgtab_baseline(
table_name =>'chad_spm_migrate',
table_owner => 'DBMGR',
sql_handle => 'SQL_43aa553e72757e01',
plan_name =>'SQL_PLAN_47akp7tt7azh16a45e050'
);
DBMS_OUTPUT.put_line('Plans Unpacked: ' || l_plans_unpacked);
END;
/
select sysdate,
se.username,
se.sid,
se.serial#,
se.status,
se.machine,
se.osuser,
round(st.value / 1024 / 1024) redosize_MB,
sa.sql_text
from v$session se, v$sesstat st, v$sqlarea sa
where se.sid = st.sid
and st.STATISTIC# =
(select STATISTIC# from v$statname where NAME = 'redo size')
--and se.username is not null
and st.value > 10 * 1024 * 1024
and se.SQL_ADDRESS = sa.ADDRESS
and se.SQL_HASH_VALUE = sa.HASH_VALUE
order by redosize_MB desc;
select t1.sid,
t1.REDO_GB,
t2.status,
t2.serial#,
t2.username,
t2.OSUSER,
t2.MODULE,
t2.event,
t2.last_call_et,
t2.machine
from (select m.sid, round(m.value / 1024 / 1024 / 1024, 6) REDO_GB
from v$sesstat m, v$statname s
where m.statistic# = s.statistic#
and s.name = 'redo size'
order by m.value desc) t1,
v$session t2
where t1.sid = t2.sid
and rownum < 10;
------DB BLOCK CHANGE情况
SELECT to_char(begin_interval_time,'YY-MM-DD HH24') snap_time,
dhso.object_name,
sum(db_block_changes_delta) BLOCK_CHANGED
FROM dba_hist_seg_stat dhss,
dba_hist_seg_stat_obj dhso,
dba_hist_snapshot dhs
WHERE dhs.snap_id = dhss.snap_id
AND dhs.instance_number = dhss.instance_number
AND dhss.obj# = dhso.obj#
AND dhss.dataobj# = dhso.dataobj#
AND begin_interval_time BETWEEN to_date('2018-03-09 10:00','YY-MM-DD HH24:MI')
AND to_date('2018-03-09 14:00','YY-MM-DD HH24:MI')
and dhss.TS#=2
GROUP BY to_char(begin_interval_time,'YY-MM-DD HH24'),
dhso.object_name
HAVING sum(db_block_changes_delta) > 0
ORDER BY sum(db_block_changes_delta) desc ;
select
s.sid,s.serial#, s.username,s.module,s.status,s.last_call_et,
--r.name "RBS name",
t.start_time --,
--t.used_ublk "Undo blocks",
--t.used_urec "Undo recs"
from v$session s, v$transaction t, v$rollname r
where t.addr = s.taddr and r.usn = t.xidusn
order by t.start_time desc;
--DB CPU/time
with t as
(select max(t.snap_id) over() max_snap_id,
t.snap_id,
t.stat_name,
((max(value)
over(partition by t.stat_name order by t.snap_id
rows BETWEEN unbounded preceding AND unbounded following)) -
(min(value)
over(partition by t.stat_name order by t.snap_id
rows BETWEEN unbounded preceding AND unbounded following))) value
from dba_hist_sys_time_model t, dba_hist_snapshot snap
where t.stat_name in ('DB CPU', 'DB time')
and t.snap_id = snap.snap_id
and snap.end_interval_time between
to_date('&begin_time', 'YYYY-MM-DD HH24:MI:SS') and
to_date('&end_time', 'YYYY-MM-DD HH24:MI:SS')
)
select t.stat_name,
decode(t.stat_name,
'DB CPU',
round(t.value / 1000000 / 60, 2),
'DB time',
round(t.value / 1000000 / 60, 2),
0) time
from t
where t.snap_id = t.max_snap_id;
--buffer hit
with r as
(select max(s.snap_id) over() max_snap_id,
s.stat_name,
s.snap_id,
((max(value)
over(partition by s.stat_name order by s.snap_id
rows BETWEEN unbounded preceding AND unbounded following)) -
(min(value)
over(partition by s.stat_name order by s.snap_id
rows BETWEEN unbounded preceding AND unbounded following))) value
from dba_hist_sysstat s, dba_hist_snapshot snap
where s.snap_id = snap.snap_id
and s.stat_name in
('physical reads direct', 'physical reads', 'session logical reads')
and snap.end_interval_time between
to_date('&begin_time', 'YYYY-MM-DD HH24:MI:SS') and
to_date('&end_time', 'YYYY-MM-DD HH24:MI:SS')),
rr as
(select max(decode(r.stat_name, 'session logical reads', r.value, 0)) lr,
max(decode(r.stat_name, 'physical reads', r.value, 0)) pr,
max(decode(r.stat_name, 'physical reads direct', r.value, 0)) prd
from r
where r.snap_id = r.max_snap_id)
select round(rr.pr / 3600, 2) physical_reads_ps,
round((1 - (rr.pr - rr.prd) / rr.lr) * 100, 2) buffer_hit
from rr;
--event1
select
max(sum(nvl(case
when event = 'log file sync' then
round(times, 2)
end,
0))) as "log file sync",
max(sum(nvl(case
when event = 'log file parallel write' then
round(times, 2)
end,
0))) as "log file parallel write",
max(sum(nvl(case
when event = 'db file sequential read' then
round(times, 2)
end,
0))) as "db file sequential read",
max(sum(nvl(case
when event = 'db file parallel write' then
round(times, 2)
end,
0))) as "db file parallel write",
max(sum(nvl(case
when event = 'direct path read' then
round(times, 2)
end,
0))) as "direct path read"
from (select t.snap_id,
to_char(b.begin_interval_time, 'yyyy-mm-dd hh24:mi:ss') stime,
event_name event,
decode(sign(total_waits - lag(total_waits, 1)
over(partition by event_name order by t.snap_id)),
-1,
(lag(time_waited_micro, 1)
over(partition by event_name order by t.snap_id)) /
(lag(total_waits, 1)
over(partition by t.instance_number,
event_name order by t.snap_id)),
0,
0,
(time_waited_micro - lag(time_waited_micro, 1)
over(partition by event_name order by t.snap_id)) /
(total_waits - lag(total_waits, 1)
over(partition by event_name order by t.snap_id))) / 1000 as times
from dba_hist_system_event t, dba_hist_snapshot b
where t.snap_id = b.snap_id
and b.begin_interval_time between
to_date('&begin_time', 'YYYY-MM-DD HH24:MI:SS') and
to_date('&end_time', 'YYYY-MM-DD HH24:MI:SS')
and b.instance_number = t.instance_number
and event_name in ('db file sequential read',
'log file sync',
'direct path read',
'log file parallel write',
'db file parallel write')
and t.instance_number = 1)
where times > 0
group by snap_id, stime
order by snap_id;
select t.snap_id,
to_char(b.begin_interval_time, 'yyyy-mm-dd hh24:mi:ss') stime,
event_name event,
decode(sign(total_waits - lag(total_waits, 1)
over(partition by event_name order by t.snap_id)),
-1,
(lag(time_waited_micro, 1)
over(partition by event_name order by t.snap_id)) /
(lag(total_waits, 1)
over(partition by t.instance_number,
event_name order by t.snap_id)),
0,
0,
(time_waited_micro - lag(time_waited_micro, 1)
over(partition by event_name order by t.snap_id)) /
(total_waits - lag(total_waits, 1)
over(partition by event_name order by t.snap_id))) / 1000 as times
from dba_hist_system_event t, dba_hist_snapshot b
where t.snap_id = b.snap_id
and b.begin_interval_time between
to_date('&begin_time', 'YYYY-MM-DD HH24:MI:SS') and
to_date('&end_time', 'YYYY-MM-DD HH24:MI:SS')
and b.instance_number = t.instance_number
and event_name in ('db file sequential read',
'log file sync',
'direct path read',
'log file parallel write',
'db file parallel write')
and t.instance_number = 1
--event2 for latch and enq
select event,times from (
select event,round(avg(times),2) times from
(
select t.snap_id,
to_char(b.begin_interval_time, 'yyyy-mm-dd hh24:mi:ss') stime,
event_name event,
decode(sign(total_waits - lag(total_waits, 1)
over(partition by event_name order by t.snap_id)),
-1,
(lag(time_waited_micro, 1)
over(partition by event_name order by t.snap_id)) /
(lag(total_waits, 1)
over(partition by t.instance_number,
event_name order by t.snap_id)),
0,
0,
(time_waited_micro - lag(time_waited_micro, 1)
over(partition by event_name order by t.snap_id)) /
(total_waits - lag(total_waits, 1)
over(partition by event_name order by t.snap_id))) / 1000 as times
from dba_hist_system_event t, dba_hist_snapshot b
where t.snap_id = b.snap_id
and b.begin_interval_time between
to_date('&begin_time', 'YYYY-MM-DD HH24:MI:SS') and
to_date('&end_time', 'YYYY-MM-DD HH24:MI:SS')
and b.instance_number = t.instance_number
and (event_name like'%enq%' or event_name like'%latch%')
and t.instance_number = 1 )
where times is not null
and times <>0
group by event
order by 2 desc) where times<>0;
--maximum PGA allocated
select ROUND(max(value) / 1024 / 1024 / 1024, 2) PGA_G
from dba_hist_pgastat p, dba_hist_snapshot s
where name = 'maximum PGA allocated'
and s.end_interval_time between
to_date('&begin_time', 'YYYY-MM-DD HH24:MI:SS') and
to_date('&end_time', 'YYYY-MM-DD HH24:MI:SS')
and p.snap_id = s.snap_id;
--fra
select b.TOTAL_G,
b."TOTAL_G" * (1 - a."USED") "FREE_G",
b."TOTAL_G" * (1 - a."USED" + a."RECLAIMABLE") "free+reclaimable_G",
round((a."USED") * 100 , 2) || ' %' as pct_used
from (select sum(xx.PERCENT_SPACE_USED) / 100 "USED",
sum(xx.PERCENT_SPACE_RECLAIMABLE) / 100 "RECLAIMABLE"
from v$flash_recovery_area_usage xx) a,
(select round(value / 1024 / 1024 / 1024) "TOTAL_G"
from v$parameter
where name = 'db_recovery_file_dest_size') b;
---undostat
select to_char(begin_time, 'yyyymmdd hh24'),
sum(trunc(undoblks * 8192 / 1024 / 1024))
from v$undostat
where begin_time between trunc(sysdate - 1 / 24, 'hh24') and
trunc(sysdate, 'hh24')
group by to_char(begin_time, 'yyyymmdd hh24');
--hard parse
with t1 as
(
select s.instance_number,s.snap_id,to_char(t.begin_interval_time,'yyyy/mm/dd hh24:mi:ss') time,stat_name,value from dba_hist_sysstat s ,dba_hist_snapshot t
where
s.instance_number=1
and s.stat_name='parse count (hard)'
and s.snap_id=t.snap_id and t.instance_number=1
order by 1 desc
),
t2 as
(
select s.instance_number,s.snap_id,to_char(t.begin_interval_time,'yyyy/mm/dd hh24:mi:ss') time,stat_name,value from dba_hist_sysstat s ,dba_hist_snapshot t
where
s.instance_number=1
and s.stat_name='parse count (hard)'
and s.snap_id=t.snap_id and t.instance_number=1
order by 1 desc
)
select t1.instance_number,t1.snap_id,t1.time,t1.stat_name,(t1.value-t2.value) value from t1,t2 where t1.snap_id=t2.snap_id+1
order by t1.snap_id desc
select a.tablespace_name,sum(bytes)/1024/1024/1024 from dba_segments a,dba_lobs b
where a.tablespace_name='USERS' and a.segment_name= b.segment_name
and b.owner='AUDSYS'
group by a.tablespace_name;
select a.snap_id,
b.begin_interval_time,
rows_processed_delta / executions_delta ROWS_PROCESSED_PER_EXECTIONS,
a.sql_id,
c.sql_text,
a.parsing_schema_name,
executions_delta,
decode(c.command_type,
2,
'INSERT',
6,
'UPDATE',
7,
'DELETE',
189,
'MERGE') "DML_TYPE"
from dba_hist_sqlstat a, dba_hist_snapshot b, dba_hist_sqltext c
where a.snap_id = b.snap_id
and a.sql_id = c.sql_id(+)
and executions_delta <> 0
and c.command_type in (2, 6, 7, 189)
and rows_processed_delta / executions_delta >= 10000
and a.snap_id between 68050 and 68056
order by ROWS_PROCESSED_PER_EXECTIONS desc
select SNAP_ID,OWNER ,OBJECT_NAME, OBJECT_TYPE, DB_BLOCK_CHANGES_DELTA
from dba_objects a,
(select SNAP_ID,obj#,DB_BLOCK_CHANGES_DELTA from DBA_HIST_SEG_STAT where DB_BLOCK_CHANGES_DELTA > 20000 order by snap_id desc, DB_BLOCK_CHANGES_DELTA desc) b
where a.object_id=b.obj# and object_type='TABLE'
order by snap_id desc, DB_BLOCK_CHANGES_DELTA desc
select c.SNAP_ID,c.END_INTERVAL_TIME SNAP_TIME,a.OWNER ,a.OBJECT_NAME, a.OBJECT_TYPE, b.DB_BLOCK_CHANGES_DELTA
from dba_objects a,
(select SNAP_ID,obj#,DB_BLOCK_CHANGES_DELTA from DBA_HIST_SEG_STAT where DB_BLOCK_CHANGES_DELTA > 20000 order by snap_id desc, DB_BLOCK_CHANGES_DELTA desc) b,
DBA_HIST_SNAPSHOT c
where a.object_id=b.obj# and object_type='TABLE' and b.SNAP_ID=c.SNAP_ID
order by snap_id desc, DB_BLOCK_CHANGES_DELTA desc
SELECT SE.SID,
OPNAME,
TRUNC(SOFAR / TOTALWORK * 100, 2) || '%' AS PCT_WORK,
ELAPSED_SECONDS ELAPSED,
ROUND(ELAPSED_SECONDS * (TOTALWORK - SOFAR) / SOFAR) REMAIN_TIME
FROM V$SESSION_LONGOPS SL, V$SQLAREA SA, V$SESSION SE
WHERE SL.SQL_PLAN_HASH_VALUE = SA.PLAN_HASH_VALUE
AND SL.SID = SE.SID
AND SOFAR != TOTALWORK
and sl.SID='1920'
ORDER BY START_TIME;
select end_time, process from (select to_char(trunc(end_time,'mi'), 'YYYY-MM-DD HH24:MI:SS') end_time,
2 round(value*limit_value/100) process from v$sysmetric_history,(select limit_value from v$resource_limit where resource_name = 'processes') where metric_name = 'Process Limit %');
------cpu_time
select * from (select round(nvl((sqt.cput / 1000000), to_number(null)),2) "Cpu Time (s)",
round( nvl((sqt.elap / 1000000), to_number(null)),2) "Elap Time (s)",
sqt.exec,
round(decode(sqt.exec,0,to_number(null),(sqt.cput / sqt.exec / 1000000)),2) "Cpu per Exec (s)",
round((100 * (sqt.elap / (select sum(e.value) - sum(b.value)
from dba_hist_sys_time_model b,
dba_hist_sys_time_model e
where b.snap_id = 21890 and
e.snap_id = 21891 and
e.stat_name = 'DB time' and
b.stat_name = 'DB time'))) ,2)norm_val,
sqt.sql_id,
decode(sqt.module, null, null, 'Module: ' || sqt.module) SqlModule,
nvl(to_nchar(SUBSTR(st.sql_text,1,2000)) , (' ** SQL Text Not Available ** ')) SqlText
from (select sql_id,
max(module) module,
sum(cpu_time_delta) cput,
sum(elapsed_time_delta) elap,
sum(executions_delta) exec
from dba_hist_sqlstat
where 21890 < snap_id and
snap_id <= 21891
group by sql_id) sqt,
dba_hist_sqltext st
where st.sql_id(+) = sqt.sql_id
order by nvl(sqt.cput, -1) desc,
sqt.sql_id)
where rownum < 65 and
(rownum <= 10 or norm_val > 1)
select se.USERNAME,se.SID,se.SERIAL#,se.STATUS,SE.EVENT,SE.P1,SE.P1TEXT,
round(decode(tr.USED_UBLK,null,0,tr.USED_UBLK) * (select value from v$parameter where NAME='db_block_size') /1024/1024/1024,4) as undo_size_gb ,
tr.USED_UREC,se.SQL_ID,s.SQL_TEXT
from gv$session se, gv$transaction tr,gv$sql s
where se.TADDR=tr.ADDR(+)
and se.SQL_ID = s.SQL_ID(+)
order by undo_size_gb desc
select
ds.segment_name "Object Name",
round(sum(space_allocated_total) / 1024 / 1024) "Growth (MB)" ,
round(sum(space_used_delta)/1024/1204)
from
dba_hist_snapshot dhs,
dba_hist_seg_stat dhss,
dba_objects db,
dba_segments ds
where begin_interval_time > trunc(sysdate) - &days_back
and dhs.snap_id = dhss.snap_id
and db.object_id = dhss.obj#
and db.owner = ds.owner
and db.object_name = ds.segment_name
group by ds.segment_name
having sum(space_allocated_delta) / 1024 / 1024 >5000
order by 3 desc
1. 查看数据库具体时间点的Block change TOP N,这个AWR中也有
select to_char(begin_interval_time, 'yyyy-mm-dd hh24:mi') snap_time,
sto.object_name,
sum(db_block_changes_delta)
from dba_hist_seg_stat st,
dba_hist_seg_stat_obj sto,
dba_hist_snapshot ss
where ss.snap_id = st.snap_id
and ss.instance_number = st.instance_number
and st.obj# = sto.obj#
and st.dataobj# = sto.dataobj#
and begin_interval_time > sysdate - 1 / 24
group by to_char(begin_interval_time, 'yyyy-mm-dd hh24:mi'),
sto.object_name
order by 3 desc;
2. 查看对应时间的sqlstat,这里边对应的sql一般都会是引起日志突增的语句,因为执行次数,以及rows processed比其他sql要高。这个AWR中也会有。
select to_char(begin_interval_time, 'yyyy_mm_dd hh24:mi'),
dbms_lob.substr(sql_text, 4000, 1),
sst.instance_number,
sst.sql_id,
executions_delta,
rows_processed_delta
from dba_hist_sqlstat sst, dba_hist_snapshot ss, dba_hist_sqltext st
where upper(st.sql_text) like '%JSMX_KC22_02%'
and sst.snap_id = ss.snap_id
and sst.instance_number = ss.instance_number
and sst.sql_id = st.sql_id;
3. 我们还可以进一步在分析数据库代码,帮助开发解决问题。这里使用ash试图,11g以上有top_level_sql_id,这个表示对于递归SQL,捕获其父SQL的信息。一般对定位package/function/trigger等引起的异常非常有用。
当top_level_sql_id为package时,我们需要进一步分析是哪一段代码异常,是否是逻辑错误,重复更新等问题。这里就不在讨论了,具体应用场景不同,相信大家都有很厉害的PLSQL技能。
本次异常可以看到是kettle推数和运营采集数据导致的。联系DA或者直接找开发看看采数是否每月常规还是异常,是否需要扩容FRA。
select sql_id, s.top_level_sql_id,u.username
from v$active_session_history s,dba_users u
where s.sql_id = '4qappnkgxtrtj'
and s.user_id=u.user_id;
v$sga_resize_op
select *
from (select t.sample_time,
s.PARSING_SCHEMA_NAME,
t.sql_id,
t.sql_child_number as sql_child,
round(t.temp_space_allocated / 1024 / 1024 / 1024, 2) || ' G' as temp_used,
round(t.temp_space_allocated /
(select sum(decode(d.autoextensible, 'YES', d.maxbytes, d.bytes))
from dba_temp_files d),
2) * 100 || ' %' as temp_pct,
t.program,
t.module,
s.SQL_TEXT
from v$active_session_history t, v$sql s
where t.sample_time > to_date('&begin_time', 'yyyy-mm-dd hh24:mi:ss')
and t.sample_time < to_date('&end_time', 'yyyy-mm-dd hh24:mi:ss')
and t.temp_space_allocated is not null
and t.sql_id = s.SQL_ID
order by t.temp_space_allocated desc)
where rownum < 50
order by temp_used desc;
在标黄处选择owner,或者去掉选择全库。
这个脚本将最多处理8列外键约束(如果你的外键有更多的列,可能就得重新考虑一下你的设计了)
select table_name, constraint_name,
cname1 || nvl2(cname2,','||cname2,null) ||
nvl2(cname3,','||cname3,null) || nvl2(cname4,','||cname4,null) ||
nvl2(cname5,','||cname5,null) || nvl2(cname6,','||cname6,null) ||
nvl2(cname7,','||cname7,null) || nvl2(cname8,','||cname8,null)
columns
from ( select b.table_name,
b.constraint_name,
max(decode( position, 1, column_name, null )) cname1,
max(decode( position, 2, column_name, null )) cname2,
max(decode( position, 3, column_name, null )) cname3,
max(decode( position, 4, column_name, null )) cname4,
max(decode( position, 5, column_name, null )) cname5,
max(decode( position, 6, column_name, null )) cname6,
max(decode( position, 7, column_name, null )) cname7,
max(decode( position, 8, column_name, null )) cname8,
count(*) col_cnt
from (select substr(table_name,1,30) table_name,
substr(constraint_name,1,30) constraint_name,
substr(column_name,1,30) column_name,
position
from dba_cons_columns ) a,
dba_constraints b
where a.constraint_name = b.constraint_name
and b.constraint_type = 'R'
and b.owner='PASDATA'
group by b.table_name, b.constraint_name
) cons
where col_cnt > ALL
( select count(*)
from dba_ind_columns i
where i.table_name = cons.table_name
and i.column_name in (cname1, cname2, cname3, cname4,
cname5, cname6, cname7, cname8 )
and i.column_position <= cons.col_cnt
group by i.index_name
) ;
SELECT SES.sid,
SES.serial#,
SES.process,
SES.username,
SES.command,
SES.osuser,
SES.machine,
SES.program,
SES.sql_id,
SES.sql_exec_id,
SES.sql_exec_start,
SES.plsql_entry_object_id,
SES.sql_child_number,
SES.module,
SES.action,
SES.client_info,
SES.row_wait_obj#,
SES.logon_time,
SES.resource_consumer_group,
SES.event,
SES.p1text,
SES.p1,
SES.wait_class,
SES.wait_time,
SES.wait_time_micro,
SE.time_waited_micro,
SES.state,
SES.time_remaining_micro,
SES.time_since_last_wait_micro,
SES.service_name,
STAT.cpu_time,
GV_INST.INSTANCE_NAME blck_instance_name,
BLCK.sid blck_sid,
BLCK.serial# blck_serial#,
BLCK.logon_time blck_logon_time,
BLCK.machine blck_machine,
BLCK.program blck_program,
BLCK.USERNAME blck_username
FROM V$SESSION SES
JOIN v$session_event SE
ON (SES.EVENT=SE.EVENT and SES.SID=SE.SID and SES.WAIT_CLASS#=SE.WAIT_CLASS#)
LEFT JOIN GV$INSTANCE GV_INST
ON (SES.BLOCKING_INSTANCE = GV_INST.INSTANCE_NUMBER)
JOIN (
SELECT sid, VALUE cpu_time
FROM V$SESSTAT JOIN V$STATNAME USING (STATISTIC#)
WHERE name = 'CPU used by this session'
) STAT
ON (SES.sid = STAT.sid)
LEFT JOIN (
SELECT inst_id,
sid,
serial#,
logon_time,
machine,
program,
username
FROM GV$SESSION
) BLCK
ON (SES.blocking_session = blck.sid AND SES.blocking_instance = blck.inst_id)
WHERE SES.STATUS = 'ACTIVE'
AND SES.sql_id IS NOT NULL
AND rownum <= 20
AND (SES.client_info not like '%Oracle-SPI%' OR client_info IS NULL) AND TYPE = 'USER'
========db stats===========
with t as
(select max(t.snap_id) over() max_snap_id,
t.snap_id,
t.stat_name,
((max(value)
over(partition by t.stat_name order by t.snap_id
rows BETWEEN unbounded preceding AND unbounded following)) -
(min(value)
over(partition by t.stat_name order by t.snap_id
rows BETWEEN unbounded preceding AND unbounded following))) value
from dba_hist_sys_time_model t, dba_hist_snapshot snap
where t.stat_name in ('DB CPU', 'DB time')
and t.snap_id = snap.snap_id
and snap.end_interval_time > sysdate - 1 / 24)
select t.stat_name,
decode(t.stat_name,
'DB CPU',
round(t.value / 1000000),
'DB time',
round(t.value / 1000000 / 60, 2),
0) time
from t
where t.snap_id = t.max_snap_id
union
select 'physical_reads_psround' as name, round(rr.pr / 3600, 2) valuse
from (select max(decode(r.stat_name, 'session logical reads', r.value, 0)) lr,
max(decode(r.stat_name, 'physical reads', r.value, 0)) pr,
max(decode(r.stat_name, 'physical reads direct', r.value, 0)) prd
from ((select max(s.snap_id) over() max_snap_id,
s.stat_name,
s.snap_id,
((max(value)
over(partition by s.stat_name order by s.snap_id
rows BETWEEN unbounded preceding AND unbounded
following)) -
(min(value)
over(partition by s.stat_name order by s.snap_id
rows BETWEEN unbounded preceding AND unbounded
following))) value
from dba_hist_sysstat s, dba_hist_snapshot snap
where s.snap_id = snap.snap_id
and s.stat_name in
('physical reads direct',
'physical reads',
'session logical reads')
and snap.end_interval_time > sysdate - 1 / 24)) r
where r.snap_id = r.max_snap_id) rr
union
select 'buffer_hit' as name,
round((1 - (rr.pr - rr.prd) / rr.lr) * 100, 2) valuse
from (select max(decode(r.stat_name, 'session logical reads', r.value, 0)) lr,
max(decode(r.stat_name, 'physical reads', r.value, 0)) pr,
max(decode(r.stat_name, 'physical reads direct', r.value, 0)) prd
from ((select max(s.snap_id) over() max_snap_id,
s.stat_name,
s.snap_id,
((max(value)
over(partition by s.stat_name order by s.snap_id
rows BETWEEN unbounded preceding AND unbounded
following)) -
(min(value)
over(partition by s.stat_name order by s.snap_id
rows BETWEEN unbounded preceding AND unbounded
following))) value
from dba_hist_sysstat s, dba_hist_snapshot snap
where s.snap_id = snap.snap_id
and s.stat_name in
('physical reads direct',
'physical reads',
'session logical reads')
and snap.end_interval_time > sysdate - 1 / 24)) r
where r.snap_id = r.max_snap_id) rr
union (select event, round(max(times), 2) as value
from (select t.snap_id,
to_char(b.begin_interval_time, 'yyyy-mm-dd hh24:mi:ss') stime,
event_name event,
decode(sign(total_waits - lag(total_waits, 1)
over(partition by event_name order by
t.snap_id)),
-1,
(lag(time_waited_micro, 1)
over(partition by event_name order by t.snap_id)) /
(lag(total_waits, 1)
over(partition by t.instance_number,
event_name order by t.snap_id)),
0,
0,
(time_waited_micro - lag(time_waited_micro, 1)
over(partition by event_name order by t.snap_id)) /
(total_waits - lag(total_waits, 1)
over(partition by event_name order by t.snap_id))) / 1000 as times
from dba_hist_system_event t, dba_hist_snapshot b
where t.snap_id = b.snap_id
and b.begin_interval_time > sysdate - 1 / 24
and b.instance_number = t.instance_number
and event_name in ('db file sequential read',
'log file sync',
'direct path read',
'log file parallel write',
'db file parallel write')
and t.instance_number = 1)
where times > 0
group by event)
union (select 'PGA' as names,
ROUND(max(value) / 1024 / 1024 / 1024, 2) PGA_G
from dba_hist_pgastat p, dba_hist_snapshot s
where name = 'maximum PGA allocated'
and s.end_interval_time > sysdate - 1 / 24
and p.snap_id = s.snap_id)
union (select 'FRA' as name, pct_used
from (select b.TOTAL_G,
b."TOTAL_G" * (1 - a."USED") "FREE_G",
b."TOTAL_G" * (1 - a."USED" + a."RECLAIMABLE") "free+reclaimable_G",
round((a."USED" - a."RECLAIMABLE") * 100, 2) as pct_used
from (select sum(xx.PERCENT_SPACE_USED) / 100 "USED",
sum(xx.PERCENT_SPACE_RECLAIMABLE) / 100 "RECLAIMABLE"
from v$flash_recovery_area_usage xx) a,
(select round(value / 1024 / 1024 / 1024) "TOTAL_G"
from v$parameter
where name = 'db_recovery_file_dest_size') b))
union (
select name, sum(cnt)
from (select case
when event like '%latch%' then
'latch'
else
'enq'
end as name,
count(*) as cnt
from v$session_wait
where (event like '%latch%' or event like '%enq%')
group by event
union
select 'latch', 0
from dual
union
select 'enq', 0 from dual)
group by name
)
union
(select 'sessions' as name, count(*)
from v$session
where status='ACTIVE'
)
SELECT s.sid, kglpnmod "Mode", kglpnreq "Req"
FROM x$kglpn p, v$session s
WHERE p.kglpnuse=s.saddr
AND kglpnhdl='&P1RAW'
;
在 后台用这个语句查一下,看那些是holder
select * from (
SELECT to_char(begin_interval_time, 'YYYY_MM_DD HH24:MI') snap_time,
dhsso.object_name,
SUM(db_block_changes_delta)
FROM dba_hist_seg_stat dhss,
dba_hist_seg_stat_obj dhsso,
dba_hist_snapshot dhs
WHERE dhs.snap_id = dhss.snap_id
AND dhs.instance_number = dhss.instance_number
AND dhss.obj# = dhsso.obj#
AND dhss.dataobj# = dhsso.dataobj#
AND begin_interval_time> sysdate - 120/1440
GROUP BY to_char(begin_interval_time, 'YYYY_MM_DD HH24:MI'),
dhsso.object_name
order by 3 desc)
where rownum<=5;
SELECT to_char(begin_interval_time, 'YYYY_MM_DD HH24:MI'),
dbms_lob.substr(sql_text, 4000, 1),
dhss.instance_number,
dhss.sql_id,
executions_delta,
rows_processed_delta
FROM dba_hist_sqlstat dhss, dba_hist_snapshot dhs, dba_hist_sqltext dhst
WHERE UPPER(dhst.sql_text) LIKE '%TEST_REDO%'
AND dhss.snap_id = dhs.snap_id
AND dhss.instance_Number = dhs.instance_number
AND dhss.sql_id = dhst.sql_id;
begin
DBMS_LOGMNR.ADD_LOGFILE( LOGFILENAME => '/paic/stg/oracle/10g/otzj10g/wangsj/arch_620991420_1_339608.arc',OPTIONS => DBMS_LOGMNR.NEW);
DBMS_LOGMNR.ADD_LOGFILE( LOGFILENAME => '/paic/stg/oracle/10g/otzj10g/wangsj/arch_620991420_1_339609.arc',OPTIONS => DBMS_LOGMNR.addfile);
DBMS_LOGMNR.START_LOGMNR( OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
end;
/
select to_char(t.TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS'),
to_char(t.COMMIT_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS'),
t.SEG_OWNER,
t.SEG_NAME,
t.USERNAME,
t.OPERATION,
t.SQL_REDO
from V$LOGMNR_CONTENTS t
where t.SEG_NAME='PS_PAIC_PLAN_SEQ'
--upper(t.SQL_REDO) like '%PS_PAIC_PLAN_SEQ%';
EXECUTE DBMS_LOGMNR.END_LOGMNR();
1、将PUB_SYS_PACKAGE标记为HOT;
begin
sys.dbms_shared_pool.markhot(schema => 'ELISCDE',objname => 'PUB_SYS_PACKAGE',namespace => 1,global => true);
end;
/
begin
sys.dbms_shared_pool.markhot(schema => 'ELISCDE',objname => 'PUB_SYS_PACKAGE',namespace => 2,global => true);
end;
/
2、确认标记是否成功;
select count(*) from v$db_object_cache
where name='PUB_SYS_PACKAGE' and property='HOT';
monitoring监控状态
SELECT u.name owner,
io.name index_name,
t.name table_name,
DECODE(BITAND(i.flags, 65536), 0, 'NO', 'YES') monitoring,
DECODE(BITAND(ou.flags, 1), 0, 'NO', 'YES') used,
ou.start_monitoring start_monitoring,
ou.end_monitoring end_monitoring
FROM sys.user$ u,
sys.obj$ io,
sys.obj$ t,
sys.ind$ i,
sys.object_usage ou
WHERE i.obj# = ou.obj#
AND io.obj# = ou.obj#
AND t.obj# = i.bo#
AND u.user# = io.owner#
and u.name = 'CISDATA'
and DECODE(BITAND(ou.flags, 1), 0, 'NO', 'YES')='YES';
alter table *.* allocate extent (SIZE 5G);
select s.username,
s.sid,
a.value as cursor´ò¿ªÁ¿,
(select y.VALUE from v$parameter y where y.NAME like '%open_cursors%') as ÉÏÏÞ
from v$sesstat a, v$statname b, v$session s
where a.statistic# = b.statistic#
and s.sid = a.sid
and b.name = 'opened cursors current'
and a.value >
(select y.VALUE from v$parameter y where y.NAME like '%open_cursors%') * 0.8
order by value desc
wait and lock
SELECT /*+ ordered */ gvw.inst_id Waiter_Inst,
gvw.sid Waiter_Sid,
gvs_w.osuser waiter_osuser,
gvs_w.program waiter_program,
gvs_w.machine waiter_machine,
gvs_w.client_identifier waiter_identifer,
gvs_w.client_info waiter_thread,
gvs_w.seconds_in_wait waiter_secs_in_wait,
gvs_w.sql_id waiter_sql,
(select object_name from dba_objects a where a.object_id(+)=gvs_w.row_wait_obj#) waiter_table,
dbms_rowid.rowid_create(1,gvs_w.ROW_WAIT_OBJ#,gvs_w.ROW_WAIT_FILE#,gvs_w.ROW_WAIT_BLOCK#,gvs_w.ROW_WAIT_ROW#) waiter_rowid_Waiting_on, gvs_w.event waiter_event, decode(gvw.request, 0, 'None',
1, 'NoLock',
2, 'Row-Share',
3, 'Row-Exclusive',
4, 'Share-Table',
5, 'Share-Row-Exclusive',
6, 'Exclusive',
'Nothing-') Waiter_Mode_Req,
decode(gvh.type, 'MR', 'Media_recovery',
'RT', 'Redo_thread',
'UN', 'User_name',
'TX', 'Transaction',
'TM', 'Dml',
'UL', 'PLSQL User_lock',
'DX', 'Distrted_Transaxion',
'CF', 'Control_file',
'IS', 'Instance_state',
'FS', 'File_set',
'IR', 'Instance_recovery',
'ST', 'Diskspace Transaction',
'IV', 'Libcache_invalidation',
'LS', 'LogStaartORswitch',
'RW', 'Row_wait',
'SQ', 'Sequence_no',
'TE', 'Extend_table',
'TT', 'Temp_table',
'Nothing-') Waiter_Lock_Type,
gvh.inst_id Locker_Inst, gvh.sid Locker_Sid, gvs.osuser locker_osuser, gvs.machine locker_machine, gvs.program locker_program,
gvs.client_identifier locker_identifer,
gvs.client_info locker_thread,
gvs.seconds_in_wait locker_secs_in_wait, gvs.serial# Locker_Serial,gvs.event locker_event,gvs.sql_id locker_sql,(select object_name from dba_objects a where a.object_id(+)=gvs.row_wait_obj#) locker_table,gvs.prev_sql_id locker_prev_sql,
gvs.status locker_Status, gvs.module locker_Module
FROM gv$lock gvh, gv$lock gvw, gv$session gvs,gv$session gvs_w WHERE (gvh.id1, gvh.id2) in (
SELECT id1, id2 FROM gv$lock WHERE request=0
INTERSECT
SELECT id1, id2 FROM gv$lock WHERE lmode=0)
AND gvh.id1=gvw.id1
AND gvh.id2=gvw.id2
AND gvh.request=0
AND gvw.lmode=0
AND gvh.sid=gvs.sid
AND gvw.sid=gvs_w.sid
AND gvh.inst_id=gvs.inst_id
AND gvw.inst_id=gvs_w.inst_id
AND gvs_w.sql_id is not null;
sqlt方法:
Download SQLT from note 215187.1
$ unzip sqlt.zip
$ cd sqlt/install
$ sqlplus / as sysdba
SQL> START sqcreate.sql
Optional Connect Identifier (ie: @PROD):
2) Get the sql_id from v$sql, for example: d9manhbn1a6t0
3) Run SQLT with sqltxtract method:
$ cd sqlt
$ sqlplus
SQL> START run/sqltxtract.sql d9manhbn1a6t0
Password:
4) Upload the generated sqlt_s*.zip file to this SR $ ls sqlt_s* sqlt_s95236.zip
优化效率:
EXEC sqltxadmin.sqlt$a.set_param('test_case_builder', 'N'); EXEC sqltxadmin.sqlt$a.set_param('sta_time_limit_secs', '30'); EXEC sqltxadmin.sqlt$a.set_param('c_gran_segm', 'PARTITION'); EXEC sqltxadmin.sqlt$a.set_param('c_gran_cols', 'PARTITION'); EXEC sqltxadmin.sqlt$a.set_param('c_gran_hgrm', 'PARTITION');
sqlplus -prelim / as sysdba
oradebug setmypid
oradebug unlimit
oradebug setinst all --RAC环境
oradebug hanganalyze 3 -- 级别一般指定为3足够了
oradebug -g def dump systemstate 10 --RAC环境
oradebug tracefile_name
systemdump方法:
SSD:
conn / as sysdba
oradebug setmypid
oradebug unlimit
oradebug -g all hanganalyze 3
oradebug -g all dump systemstate 258
- -Wait for 10 seconds
oradebug -g all hanganalyze 3
oradebug -g all dump systemstate 258
oradebug close_trace
oradebug tracefile_name
dba_hist_memory_resize_ops
select to_char(first_time, 'yyyy-mm-dd') day,
sum(decode(to_char(first_time, 'hh24'), '00', 1, 0)) h00,
sum(decode(to_char(first_time, 'hh24'), '01', 1, 0)) h01,
sum(decode(to_char(first_time, 'hh24'), '02', 1, 0)) h02,
sum(decode(to_char(first_time, 'hh24'), '03', 1, 0)) h03,
sum(decode(to_char(first_time, 'hh24'), '04', 1, 0)) h04,
sum(decode(to_char(first_time, 'hh24'), '05', 1, 0)) h05,
sum(decode(to_char(first_time, 'hh24'), '06', 1, 0)) h06,
sum(decode(to_char(first_time, 'hh24'), '07', 1, 0)) h07,
sum(decode(to_char(first_time, 'hh24'), '08', 1, 0)) h08,
sum(decode(to_char(first_time, 'hh24'), '09', 1, 0)) h09,
sum(decode(to_char(first_time, 'hh24'), '10', 1, 0)) h10,
sum(decode(to_char(first_time, 'hh24'), '11', 1, 0)) h11,
sum(decode(to_char(first_time, 'hh24'), '12', 1, 0)) h12,
sum(decode(to_char(first_time, 'hh24'), '13', 1, 0)) h13,
sum(decode(to_char(first_time, 'hh24'), '14', 1, 0)) h14,
sum(decode(to_char(first_time, 'hh24'), '15', 1, 0)) h15,
sum(decode(to_char(first_time, 'hh24'), '16', 1, 0)) h16,
sum(decode(to_char(first_time, 'hh24'), '17', 1, 0)) h17,
sum(decode(to_char(first_time, 'hh24'), '18', 1, 0)) h18,
sum(decode(to_char(first_time, 'hh24'), '19', 1, 0)) h19,
sum(decode(to_char(first_time, 'hh24'), '20', 1, 0)) h20,
sum(decode(to_char(first_time, 'hh24'), '21', 1, 0)) h21,
sum(decode(to_char(first_time, 'hh24'), '22', 1, 0)) h22,
sum(decode(to_char(first_time, 'hh24'), '23', 1, 0)) h23,
count(*) total
from gv$log_history a
where first_time >= trunc(sysdate) - 7
group by to_char(first_time, 'yyyy-mm-dd')
order by day;
select s.username,s.osuser,s.event,count(*) over(partition by event) event_count,
q.sql_text,q.sql_fulltext,s.status,q.sql_id,q.child_number,
q.plan_hash_value,s.sql_exec_start,s.machine,s.sid,s.serial#,
s.pq_status,s.pdml_status,s.pddl_status,
'alter system kill session '''||s.sid||','||s.serial#||''' immediate;' kill_session
from v$session s,v$sql q
where s.sql_id=q.sql_id
and s.username is not null
and event not in ('SQL*Net message from client','SQL*Net message to client')
order by event_count desc,sql_id;
select t.snap_id,
to_char(b.begin_interval_time, 'yyyy-mm-dd hh24:mi:ss') stime,
event_name event,
decode(sign(total_waits - lag(total_waits, 1)
over(partition by event_name order by t.snap_id)),
-1,
(lag(time_waited_micro, 1)
over(partition by event_name order by t.snap_id)) /
(lag(total_waits, 1)
over(partition by t.instance_number,
event_name order by t.snap_id)),
0,
0,
(time_waited_micro - lag(time_waited_micro, 1)
over(partition by event_name order by t.snap_id)) /
(total_waits - lag(total_waits, 1)
over(partition by event_name order by t.snap_id))) / 1000 as times
from dba_hist_system_event t, dba_hist_snapshot b
where t.snap_id = b.snap_id
and b.begin_interval_time between
to_date('&begin_time', 'YYYY-MM-DD HH24:MI:SS') and
to_date('&end_time', 'YYYY-MM-DD HH24:MI:SS')
and b.instance_number = t.instance_number
and event_name in ('db file sequential read',
'log file sync',
'direct path read',
'log file parallel write',
'db file parallel write')
and t.instance_number = 1)
where times > 0
group by snap_id, stime
order by snap_id;
SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ
FROM SYS.x$ksppi x, SYS.x$ksppcv y
WHERE x.inst_id = USERENV ('Instance')
AND y.inst_id = USERENV ('Instance')
AND x.indx = y.indx
AND x.ksppinm LIKE '%&par%';
select ash.sql_id,
sum(nvl(TM_DELTA_CPU_TIME, 0)) as totalCPU,
count(*) as exectimes,
ar.sql_text
from v$active_session_history ash,v$sqlarea ar
where sample_time >= to_timestamp('2019-09-26 18:34:00', 'yyyy-mm-dd hh24:mi:ss')
and sample_time <= to_timestamp('2019-09-26 19:55:00', 'yyyy-mm-dd hh24:mi:ss')
and ash.sql_id is not null
and ash.sql_id=ar.sql_id
group by ash.sql_id,ar.sql_text
order by 2 desc