目录在ASH中没有统计会话的日志生成大小,只能通过v$sesstat来查询会话生成的总的日志大小。由于多数进程都是通过中间件连接过来,如果通过v$sesstat只能查询到会话总的日志大小,并不能查询到每段时间日志量大小,只能自己写个存储过程来不停的查询v$sesstat视图获取日志的大小。另外还可以利用logmnr来分析归档日志文件。
1 创建对象
CREATE TABLE SYSTEM.HTZ_REDO_SIZE_ANALYZE ( INST_ID NUMBER, id number, CREATE_TIME DATE, SID NUMBER, SERIAL# NUMBER, USERNAME VARCHAR2(30), PROGRAM VARCHAR2(48), MACHINE VARCHAR2(64), STATUS VARCHAR2(8), SQL_ID VARCHAR2(13), LAST_CALL_ET NUMBER, SEQ# NUMBER, PREV_SQL_ID VARCHAR2(13), VALUE NUMBER ) TABLESPACE SYSAUX NOLOGGING; CREATE INDEX SYSTEM.IND_HTZ_REDO_SIZE_3 ON SYSTEM.HTZ_REDO_SIZE_ANALYZE (CREATE_TIME) TABLESPACE SYSAUX NOLOGGING; CREATE INDEX SYSTEM.IND_HTZ_REDO_SIZE_2 ON SYSTEM.HTZ_REDO_SIZE_ANALYZE (SID) TABLESPACE SYSAUX NOLOGGING; CREATE INDEX SYSTEM.IND_HTZ_REDO_SIZE_1 ON SYSTEM.HTZ_REDO_SIZE_ANALYZE (ID) TABLESPACE SYSAUX NOLOGGING; create sequence scott.htz_sequence;
2 收集信息
DECLARE
v_sequence NUMBER;
BEGIN
FOR counter IN 1 .. 200000
LOOP
SELECT SYSTEM.htz_sequence.NEXTVAL INTO v_sequence FROM DUAL;
INSERT INTO SYSTEM.htz_redo_size_analyze
SELECT a.inst_id,
v_sequence,
SYSDATE,
a.sid,
A.SERIAL#,
a.username,
a.program,
a.machine,
a.status,
a.sql_id,
a.last_call_et,
a.seq#,
a.prev_sql_id,
e.VALUE
FROM gv$session a, gv$statname d, gv$sesstat e
WHERE e.STATISTIC# = d.STATISTIC#
AND e.sid(+) = a.sid
AND a.inst_id = E.INST_ID
AND e.inst_id = d.inst_id
AND d.name = 'redo size'
AND E.VALUE > 0
AND (a.inst_id, a.paddr) NOT IN (SELECT inst_id, addr
FROM gv$process f
WHERE f.background = '1');
COMMIT;
DBMS_LOCK.sleep (5);
END LOOP;
END;
/
3 分析数据
SELECT *
FROM (SELECT inst_id,
create_time,
id,
program,
sid,
serial#,
sql_id,
prev_sql_id,
diff,
ROW_NUMBER ()
OVER (PARTITION BY inst_id, create_time ORDER BY diff DESC)
rownum1
FROM (SELECT *
FROM (SELECT a.inst_id,
TO_CHAR (a.create_time,
'yyyy-mm-dd hh24:mi:ss')
create_time,
a.id,
a.program,
a.sid,
a.serial#,
a.sql_id,
a.prev_sql_id,
a.VALUE - b.VALUE diff
FROM SYSTEM.htz_redo_size_analyze a,
SYSTEM.htz_redo_size_analyze b
WHERE a.id - 1 = b.id
AND a.sid = b.sid(+)
AND a.serial# = b.serial#(+)
AND a.program = b.program(+)
AND a.inst_id = NVL ('&instid', a.inst_id)
AND a.sid = NVL ('&sid', a.sid)
AND a.inst_id = b.inst_id)
WHERE diff <> 0))
WHERE rownum1 < 10
ORDER BY create_time, diff
NST_ID CREATE_TIME ID PROGRAM SID SERIAL# SQL_ID PREV_SQL_ID DIFF ROWNUM1
------ ------------------- ----- ---------------------------- ----- -------- ------------- ------------- ---------- ----------
1 2014-10-13 03:07:05 7413 sqlplus@orcl9i (TNS V1-V3) 34 215 aa6fxk28r7sv7 9qm1nuk2fxu92 3152 1
1 2014-10-13 03:07:10 7414 sqlplus@orcl9i (TNS V1-V3) 34 215 aa6fxk28r7sv7 9qm1nuk2fxu92 1904 1
1 2014-10-13 03:07:15 7415 sqlplus@orcl9i (TNS V1-V3) 34 215 aa6fxk28r7sv7 9qm1nuk2fxu92 1916 1
1 2014-10-13 03:07:20 7416 sqlplus@orcl9i (TNS V1-V3) 34 215 aa6fxk28r7sv7 9qm1nuk2fxu92 1880 2
1 2014-10-13 03:07:20 7416 sqlplus@orcl9i (TNS V1-V3) 21 445 bryaday8ykt5w a90ddv5yhzg6d 31237740 1
1 2014-10-13 03:07:25 7417 sqlplus@orcl9i (TNS V1-V3) 34 215 aa6fxk28r7sv7 9qm1nuk2fxu92 1884 2
1 2014-10-13 03:07:25 7417 sqlplus@orcl9i (TNS V1-V3) 21 445 bryaday8ykt5w a90ddv5yhzg6d 80017308 1
1 2014-10-13 03:07:30 7418 sqlplus@orcl9i (TNS V1-V3) 34 215 aa6fxk28r7sv7 9qm1nuk2fxu92 1836 2
1 2014-10-13 03:07:30 7418 sqlplus@orcl9i (TNS V1-V3) 21 445 bryaday8ykt5w a90ddv5yhzg6d 60001036 1
1 2014-10-13 03:07:35 7419 sqlplus@orcl9i (TNS V1-V3) 34 215 aa6fxk28r7sv7 9qm1nuk2fxu92 2048 2
1 2014-10-13 03:07:35 7419 sqlplus@orcl9i (TNS V1-V3) 21 445 bryaday8ykt5w a90ddv5yhzg6d 58623312 1
1 2014-10-13 03:07:40 7420 sqlplus@orcl9i (TNS V1-V3) 34 215 aa6fxk28r7sv7 9qm1nuk2fxu92 2624 2
1 2014-10-13 03:07:40 7420 sqlplus@orcl9i (TNS V1-V3) 21 445 bryaday8ykt5w a90ddv5yhzg6d 68383492 1
1 2014-10-13 03:07:45 7421 sqlplus@orcl9i (TNS V1-V3) 34 215 aa6fxk28r7sv7 9qm1nuk2fxu92 2532 2
1 2014-10-13 03:07:45 7421 sqlplus@orcl9i (TNS V1-V3) 21 445 bryaday8ykt5w a90ddv5yhzg6d 69960500 1
1 2014-10-13 03:07:50 7422 sqlplus@orcl9i (TNS V1-V3) 34 215 aa6fxk28r7sv7 9qm1nuk2fxu92 1836 2
1 2014-10-13 03:07:50 7422 sqlplus@orcl9i (TNS V1-V3) 21 445 bryaday8ykt5w bryaday8ykt5w 25038804 1
1 2014-10-13 03:07:55 7423 sqlplus@orcl9i (TNS V1-V3) 34 215 aa6fxk28r7sv7 9qm1nuk2fxu92 1884 1
这样查询出每个会话间隔一定时间生成的日志量,如果相同的会话得到的SQL_ID都不一致的情况下,说明会话可能执行了多条SQL语句,那么我们还需要利用logmnr来分析归档日志文件,来定位会话在指定时间,执行了那些DML语句。


ORACLE统计每个会话生成的日志大小:等您坐沙发呢!