背景:
数据库使用Oracle一体机,DBA权限收回,想登录服务器跑个awr报告没权限。故采用该方法。
大体思路:
1、查询当前数据库快照的历史记录(需要记录DBID)。
2、查询会显示过去7天内每个快照间隔的"DB TIME"的差异(SNAP_ID)。
3、根据SQL生成AWR报告。
4、转换成html格式的,便于分析。
具体步骤:
1、 列出数据库的历史快照信息,包括每个快照的ID、数据库ID、实例编号以及快照的开始和结束时间,并且结果会按照快照开始的时间从最新到最旧排列。
SELECT SNAP_ID,
DBID,
INSTANCE_NUMBER,
BEGIN_INTERVAL_TIME,
END_INTERVAL_TIME
FROM DBA_HIST_SNAPSHOT
ORDER BY BEGIN_INTERVAL_TIME DESC;
- SNAP_ID:这是快照的唯一标识符,用于标识特定的时间点。
- DBID:这是数据库的唯一标识符,用于标识特定的数据库。
- INSTANCE_NUMBER:这是实例的编号,对于具有多个实例的Oracle RAC(Real Application Clusters)环境来说,每个实例都有自己的编号。
- BEGIN_INTERVAL_TIME:这是快照开始的时间。
- END_INTERVAL_TIME:这是快照结束的时间。
2、查询过去7天内每个快照间隔的"DB TIME"的差异,即数据库在处理用户请求和数据库操作上花费的时间。
SELECT *
FROM (SELECT A.INSTANCE_NUMBER,
A.SNAP_ID,
B.BEGIN_INTERVAL_TIME BEGIN_TIME,
B.END_INTERVAL_TIME END_TIME,
ROUND(VALUE - LAG(VALUE, 1, '0')
OVER(ORDER BY A.INSTANCE_NUMBER, A.SNAP_ID)) "DB TIME"
FROM (SELECT B.SNAP_ID,
INSTANCE_NUMBER,
SUM(VALUE) / 1000000 / 60 VALUE
FROM DBA_HIST_SYS_TIME_MODEL B
WHERE B.DBID = (SELECT DBID FROM V$DATABASE)
AND UPPER(B.STAT_NAME) IN UPPER(('DB TIME'))
GROUP BY B.SNAP_ID, INSTANCE_NUMBER) A,
DBA_HIST_SNAPSHOT B
WHERE A.SNAP_ID = B.SNAP_ID
AND B.DBID = (SELECT DBID FROM V$DATABASE)
AND B.INSTANCE_NUMBER = A.INSTANCE_NUMBER)
WHERE BEGIN_TIME >= SYSDATE - 7
ORDER BY BEGIN_TIME DESC;
3、 使用Oracle数据库的DBMS_WORKLOAD_REPOSITORY包来生成一个全局AWR(Automatic Workload Repository)报告的HTML格式输出。
SELECT OUTPUT
FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_GLOBAL_REPORT_HTML(L_DBID => 1215096737, --实例ID
L_INST_NUM => '1,2', --根据实际需要填写实例ID: 1 2 1,2
L_BID => 37200, --开始时间
L_EID => 37202, --结束时间
L_OPTIONS => 0)); --指定报告的选项,这里设置为0,通常表示默认选项
4、复制到记事本,保存为html格式的文件