## 1. 性能报告采集

### 1.1 STATSPACK报告生成

生成快照

```
SQL> exec statspack.snap;
```

建立JOB定期生成快照

```
SQL> @?/rdbms/admin/spauto.sql
```
生成报告

```
SQL> @?/rdbms/admin/spreport
```
SQL语句显示不完整处理,修改脚本中参数num_rows_per_hash,默认为5。

### 1.2 AWR报告生成

抓取AWR快照
```
SQL> exec DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
```
本实例
```
SQL> @?/rdbms/admin/awrrpt
```
其他实例
```
SQL> @?/rdbms/admin/awrrpti
```
RAC相关信息
```
SQL> @?/rdbms/admin/awrgrpt
```

### 1.3 ASH报告生成

```
SQL> @?/rdbms/admin/ashrpt
```

### 1.4 SQL报告生成
```
SQL> @?/rdbms/admin/awrsqrpt
```
### 1.5 ADDM报告生成

```
SQL> @?/rdbms/admin/addmrpt
```

### 1.6 SQL Monitor报告生成

生成脚本
```
set trimspool on
set arraysize 512
set trim on
set pagesize 0
set linesize 1000k
set long 1000000
set longchunksize 1000000
spool sqlmon.html
select /*+ noparallel */ dbms_sqltune.report_sql_monitor (sql_id=>'input your SQL ID', report_level=>'ALL', type=>'ACTIVE') from dual;
spool off
```

### 1.7 ASH信息导出

查询最早的ASH时间点

```
SQL> SELECT sample_count, oldest_sample_time FROM v$ash_info;
```

#### 1.7.1 方法一(数据泵)

**备份ASH表**
```
create table bak_ash_160920 tablespace users 
as select * from gv$active_session_history 
where sample_time > sysdate - 3/24 ;
```
**导出ASH表 **
```
exp \’/ as sysdba \’tables=bak_ash_160920 file=/tmp/bak_ash_160920.dmp
```
####1.7.2 方法二(Trace文件)
导出ASH信息到Trace,Level等级代表导出最近的分钟数,示例为60分钟。
```
SQL> ALTER SYSTEM SET events 'immediate trace name ashdump level 60';
```
查看ASH Trace路径
```
SQL> SELECT value FROM v$diag_info WHERE name = 'Default Trace File';
```
导入其他数据库方法:
建立表结构
```
SQL> CREATE TABLE ashdump AS SELECT * FROM SYS.WRH$_ACTIVE_SESSION_HISTORY WHERE rownum < 0;
```
生成控制文件

```
$ sed -n '1,/^Step 2:/d;/^Step 3:/,$d;p' ash.trc > ashldr.ctl
```
加载ASH数据
```
$ sqlldr \' / as sysdba \' control=ashldr.ctl data=ash.trc errors=1000000
```

###1.8 慢SQL抓取

抓取内存中执行时间超过5秒的SQL
```
set lin 200 pages 2000
select sql_id,sql_exec_id,count(*) sec from v$active_session_history
where sample_time > to_date('2017-07-28 09:00:00','YYYY-MM-DD HH24:MI:SS')
  and sample_time < to_date('2017-07-28 11:00:00','YYYY-MM-DD HH24:MI:SS')
  and sql_exec_id is not null
group by sql_id,sql_exec_id having count(*) > 5 order by 3 desc;
```

###1.9 ash 定位问题
```
SELECT NVL(a.event, 'ON CPU') AS event,
       COUNT(*) AS total_wait_time
FROM   v$active_session_history a
WHERE  a.sample_time > SYSDATE - 5/(24*60) -- 5 mins
GROUP BY a.event
ORDER BY total_wait_time DESC;

EVENT                                                            TOTAL_WAIT_TIME
---------------------------------------------------------------- ---------------
db file sequential read                                                      750
log file parallel write                                                       43
log file sync                                                                 42
db file parallel read                                                         32
control file sequential read                                                  22
ON CPU                                                                        21
db file parallel write                                                        21
log file switch (private strand flush incomplete)                              8
Disk file operations I/O                                                       1
control file parallel write                                                    1
buffer busy waits                                                              1

11 rows selected.
```

```
SQL>

SELECT NVL(a.event, 'ON CPU') AS event,
       COUNT(*)*10 AS total_wait_time
FROM   dba_hist_active_sess_history a
WHERE  a.sample_time > SYSDATE - 1 
GROUP BY a.event
ORDER BY total_wait_time DESC;

EVENT                                                            TOTAL_WAIT_TIME
---------------------------------------------------------------- ---------------
db file sequential read                                                     3860
ON CPU                                                                      1500
control file sequential read                                                 990
direct path read temp                                                        580
direct path read                                                             560
log file parallel write                                                      280
db file parallel write                                                       270
Disk file operations I/O                                                     240
log file switch completion                                                   150
log file sync                                                                130
db file parallel read                                                        130
.
.
.

26 rows selected.

SQL>
```

##2. EVENT跟踪

[https://feed.askmaclean.com/archives/oracle-is-hanging-dont-forget-hanganalyze.html](https://feed.askmaclean.com/archives/oracle-is-hanging-dont-forget-hanganalyze.html)

```
sqlplus / as sysdba
 oradebug setmypid
 oradebug unlimit
 oradebug hanganalyze 3
 oradebug dump ashdumpseconds 30
 oradebug systemstate 266
 oradebug tracefile_name
```

### 2.1 EVENT 10046

**ORADEBUG** 
```
ORADEBUG SETMYPID;
ORADEBUG EVENT 10046 TRACE NAME CONTEXT FOREVER, LEVEL 12;
select * from dual;
ORADEBUG TRACEFILE_NAME;
ORADEBUG EVENT 10046 TRACE NAME CONTEXT OFF;
```
**SQLPLUS**

session 级别
```
alter session set events '10046 trace name context forever,level X';
alter session set events '10046 trace name context off';
```
system 级别
```
alter system set events '10046 trace name context forever,level X';
alter system set events '10046 trace name context off';
```

**使用TKPROF工具整理Trace文件**

按照执行时间排序输出10个SQL

```
$ tkprof xx_ora_34471968.trc sort=exeela print=10
```

### 2.2EVENT 10053

**ORADEBUG**
```
ORADEBUG SETMYPID;
ORADEBUG EVENT 10053 TRACE NAME CONTEXT FOREVER, LEVEL 12;
select * from dual;
ORADEBUG TRACEFILE_NAME;
ORADEBUG EVENT 10053 TRACE NAME CONTEXT OFF;
```

**SQLPLUS**

session 级别
```
alter session set events '10053 trace name context forever,level X';
alter session set events '10053 trace name context off';
```
system 级别
```
alter system set events '10053 trace name context forever,level X';
alter system set events '10053 trace name context off';
```

### 2.3 ErrorStack

**ORADEBUG**
```
oradebug setmypid
oradebug tracefile_name
oradebug event 1000 trace name errorstack level 10;
oradebug event 1000 trace name errorstack off;
```

###2.4 DBMS_MONITOR包

开启跟踪
```
execute dbms_monitor.client_id_trace_enable (client_id => '<client_identifier>', waits => TRUE, binds => TRUE);
```
确认跟踪
```
col primary_id format a56 
select trace_type, primary_id, waits, binds from dba_enabled_traces;
```
关闭跟踪

```
execute dbms_monitor.client_id_trace_disable (client_id => '<PRIMARY_ID>');
```
合并跟踪文件
```
trcsess output=<output file name> clientid=<client_identifier> service=<service name> *.trc
```
生成报告
```
tkprof tracefile outputfile sys=no record=filename
```


## 3. DB信息采集

### 3.1 查看进程PGA消耗
```
set lin 200 pages 2000
col memory for a25
col spid for a6
col program for a40
SELECT p.spid, s.sid, p.program, substr(n.name,1,25) memory, 
ROUND(s.value/1024/1024) as MBytes
FROM v$sesstat s, v$statname n, v$process p, v$session vs
WHERE s.statistic# = n.statistic#
AND n.name LIKE '%pga memory%'
AND s.sid=vs.sid
AND vs.paddr=p.addr
AND s.value > 20000000 /* --remove this line to view all process size */
order by spid,memory;
```

输出示例


[image:752 size:orig]



### 3.2 Hanganalyze


登录数据库
```
sqlplus '/ as sysdba'
```
当无法正常登录数据库时
```
sqlplus -prelim '/ as sysdba'
```
单实例
```
oradebug setmypid
oradebug unlimit
oradebug hanganalyze 3
-- Wait 15s before getting the second hanganalyze
oradebug hanganalyze 3
oradebug tracefile_name
exit
```
RAC
```
oradebug setmypid
oradebug setinst all
oradebug unlimit
oradebug -g def hanganalyze 3
-- Wait 15s before getting the second hanganalyze
oradebug -g def hanganalyze 3
oradebug tracefile_name
exit
```
11202后,如果生成的Trace文件报错。
```
HANG ANALYSIS:
ERROR: Can not perform hang analysis dump without a process state object and a session state object.
( process=(nil), sess=(nil) )
```
解决方法
```
sqlplus - prelim / as sysdba
oradebug setospid < use an existing process id, for example PMON/SMON>
oradebug hanganalyze 3
```

### 3.3 Systemstate
登录数据库
```
sqlplus '/ as sysdba'
```
当无法正常登录数据库时
```
sqlplus -prelim '/ as sysdba'
```
命令如下
```
oradebug setmypid
oradebug unlimit
oradebug dump systemstate 266
-- Wait 15s before getting the second systemstate
oradebug dump systemstate 266
oradebug tracefile_name
exit
```

### 3.4 Processstate
登录数据库
```
sqlplus '/ as sysdba'
```
取到PID
```
SQL> select p.pid,s.program from v$session s,v$process p 
where s.paddr=p.addr and s.sid=121;
```
命令如下
```
SQL> oradebug setorapid XX
SQL> oradebug dump processstate 266
SQL> oradebug tracefile_name
```

###3.5 DBMS_MONITOR

按照ACTION进行跟踪
```
begin
dbms_monitor.serv_mod_act_trace_enable
(service_name=>'SYS$BACKGROUND',
module_name=>'MMON_SLAVE',action_name=>'Automatic Report Flush',
waits => true,binds => true);
end;
/
begin
dbms_monitor.serv_mod_act_trace_disable(service_name=>'SYS$BACKGROUND',
module_name=>'MMON_SLAVE',
action_name=>'Automatic Report Flush');
end;
/
```


## 4. GI信息采集

### 4.1 跟踪SRVCTL命令

```
export SRVM_TRACE=TRUE
script /tmp/srvctl_trace.txt
srvctl unresponsive command.
exit
export SRVM_TRACE=
```


### 4.2 CHM信息收集
ROOT用户打包收集信息

```
# diagcollection.pl -collect -crshome /space/sys_software/oracle/grid  -chmoshome /space/sys_software/oracle/grid -chmos -incidenttime 09/09/2017 15:10:00 -incidentduration 00:30
```
GRID用户收集信息
```
$ oclumon dumpnodeview -n db03 -v -s "2017-09-09 15:10:00" -e "2017-09-09 15:30:00"
```


## 5. OS级别跟踪

### 5.1 系统调用跟踪汇总


[image:789 size:orig]

[image:790 size:orig]




### 5.2 Linux

生成跟踪输出
```
strace -o /tmp/test_sqlplus.txt sqlplus / as sysdba
strace -frT -o /tmp/strace-lsnr.log -p <PID>
```
生成跟踪输出,包括子进程,输出文件为test_sqlplus.txt.<pid>。
```
strace -f -o /tmp/test_sqlplus.txt sqlplus / as sysdba
```
参数:
```
-f  包括子进程
-ff 每个子进程一个输出文件
-T  包括时间
-o  输出文件
```

### 5.3 AIX
生成跟踪输出
```
truss -aefdDo /tmp/test_sqlplus.txt sqlplus / as sysdba
truss -aefdDo /tmp/test_sqlplus.txt -p <PID>
```
生成调用时间分析
```
truss -c sqlplus '/ as sysdba'
truss -c <PID>
```
查看进程的环境变量
```
ps eauwww <PID>
```
### 5.4 HP-UX
跟踪特定进程
```
tusc -aef -o /tmp/tusc-lsnr.log -T "%H:%M:%S" -p <PID >
```