您的位置:首页 > 数据库 > Oracle

oracle10gAWR基本管理

2013-04-15 18:20 309 查看
高峰时段压力=DB Time/Elapsed/CPU数

手动执行
SQL>exec dbms_workload_repository.create_snapshot;

$@?/rdbms/admin/awrrpt.sql 单实例

$@?/rdbms/admin/awrrpti.sql RAC

DBA 可以容易地获知最近数据库的活动状态,数据库的各种性能指标的变化趋势曲线,最近数据库可能存在的异常,分析数据库可能存在的性能瓶颈从而对数据库进行优化。

一、概述
awr(Automatic Workload Repository)是oracle 10g推出的一个强有力的信息收集工具,它比之前的statspack有显著的改进,收集的信息也更多、更全面,使用方法也更简单。

二、安装
awr是默认安装的,装好了10g的数据库就已经可以使用awr了。

三、配置
awr默认每个小时收集一次统计信息,并且保留7天的数据。awr配置信息可以从以下视图查询:
SQL> select * from dba_hist_wr_control;

DBID SNAP_INTERVAL RETENTION TOPNSQL
---------- ---------------------------- ----------------------- ----------
3939087858 +00000 00:10:00.0 +00002 00:00:00.0 DEFAULT

awr与statspack不同,它不是由job来调度的,而是由MMON来定期收集的。

SQL> show parameter job

NAME TYPE VALUE
-------------------------- ----------- --------------------
job_queue_processes integer 10

SQL> select count(1) from dba_jobs;

COUNT(1)
----------
0

我们可以用dbms_workload_repository.modify_snapshot_settings来修改默认配置
SQL> desc dbms_workload_repository.modify_snapshot_settings
Parameter Type Mode Default?
--------- -------- ---- --------
RETENTION NUMBER IN Y --设定awr信息保留多长时间,单位是分钟,默认是60分钟
INTERVAL NUMBER IN Y --设定收集时间间隔,单位是分钟,默认是1周
TOPNSQL NUMBER IN Y --设定取多少条耗费资源的sql
DBID NUMBER IN Y

如把awr设置为10分钟收集一次、每次收集50条耗费资源的sql,并保留2天的收集数据,可以用如下方式修改
SQL> exec dbms_workload_repository.modify_snapshot_settings(2*24*60,10,50);

PL/SQL procedure successfully completed

可以看出配置已经改变
SQL> select * from dba_hist_wr_control;

DBID SNAP_INTERVAL RETENTION TOPNSQL
---------- -------------------------- ----------------------- ----------
3939087858 +00000 00:10:00.0 +00002 00:00:00.0 50

四、生成报表
1、调用脚本
和statspack一样,awr也提供一个脚本来生成报表。报表的形式有两种:text和html。强烈建议生成html格式的报表,可读性非常强。
脚本位置和名称:$ORACLE_HOME/rdbms/admin/awrrpt.sql
用脚本生成awr报表的过程与生成statspack报表非常类似,你需要以sys用户执行这个脚本,执行过程需要输入报表类型、天数(用来决定显示那几天内的snapshot)、begin_snap、end_snap、以及报表名称等5个参数。
如果不不想手工输入参数,你可以修改$ORACLE_HOME/rdbms/admin/awrrpti.sql文件,把需要到的5个变量设置好,在执行过程就不用输入了。
修改awrrpti这个脚本可以让你自动生成报表。

2、直接用函数
oracle提供2个函数来生成对应的报表:
DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_TEXT :生成text报表
DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML :生成html报表

比如:

--获得普通文本格式的awr报告输出

SQL> SELECT output FROM table (DBMS_WORKLOAD_REPOSITORY.awr_report_text (262089084, 1, 2529, 2696, 0));

SELECT output FROM table (DBMS_WORKLOAD_REPOSITORY.awr_report_text (4076803828, 1, 1091, 1258, 0));

然后把输出内容拷贝到某个文件,并命名为xxx.txt即可。

--获得超文本格式的awr报告输出

SQL> SELECT output FROM table (DBMS_WORKLOAD_REPOSITORY.awr_report_html (262089084, 1, 2529, 2696, 0));

然后把输出内容拷贝到某个文件,并命名为xxx.html即可。

desc DBMS_WORKLOAD_REPOSITORY

FUNCTION AWR_REPORT_HTML RETURNS AWRRPT_HTML_TYPE_TABLE

Argument Name Type In/Out Default?

------------------------------ ----------------------- ------ --------

L_DBID NUMBER IN

L_INST_NUM NUMBER IN

L_BID NUMBER IN

L_EID NUMBER IN

L_OPTIONS NUMBER IN DEFAULT

其实$ORACLE_HOME/rdbms/admin/awrrpt.sql就是通过调用以上两个函数来生成报表的。

--先获得7天内dbid,实例号,开始快照id,结束快照id

SELECT dbid, instance_number,

MIN (snap_id) begin_snap_id,

MAX (snap_id) end_snap_id

FROM dba_hist_snapshot

WHERE end_interval_time >= SYSDATE - 7

GROUP BY dbid, instance_number;

DBID INSTANCE_NUMBER BEGIN_SNAP_ID END_SNAP_ID

---------- --------------- ------------- -----------

262089084 1 2529 2696

-- Author : DR Timothy S Hall

-- Description : Generates AWR reports for all snapsots between the specified start and end point.

-- Requirements : Access to the v$ views, UTL_FILE and DBMS_WORKLOAD_REPOSITORY packages.

-- Call Syntax : Create the directory with the appropriate path.

-- Adjust the start and end snapshots as required.

-- @generate_multiple_awr_reports.sql

-- Last Modified: 02/08/2007

-- -----------------------------------------------------------------------------------

CREATE OR REPLACE DIRECTORY awr_reports_dir AS '/tmp/';

DECLARE

-- Adjust before use.

l_snap_start NUMBER := 1;

l_snap_end NUMBER := 10;

l_dir VARCHAR2(50) := 'AWR_REPORTS_DIR';

l_last_snap NUMBER := NULL;

l_dbid v$database.dbid%TYPE;

l_instance_number v$instance.instance_number%TYPE;

l_file UTL_FILE.file_type;

l_file_name VARCHAR(50);

BEGIN

SELECT dbid

INTO l_dbid

FROM v$database;
SELECT instance_number

INTO l_instance_number

FROM v$instance;

FOR cur_snap IN (SELECT snap_id

FROM dba_hist_snapshot

WHERE instance_number = l_instance_number

AND snap_id BETWEEN l_snap_start AND l_snap_end

ORDER BY snap_id)

LOOP

IF l_last_snap IS NOT NULL THEN

l_file := UTL_FILE.fopen(l_dir, 'awr_' || l_last_snap || '_' || cur_snap.snap_id || '.htm', 'w', 32767);

FOR cur_rep IN (SELECT output

FROM TABLE(DBMS_WORKLOAD_REPOSITORY.awr_report_html(l_dbid, l_instance_number, l_last_snap, cur_snap.snap_id)))

LOOP

UTL_FILE.put_line(l_file, cur_rep.output);

END LOOP;

UTL_FILE.fclose(l_file);

END IF;

l_last_snap := cur_snap.snap_id;

END LOOP;

EXCEPTION

WHEN OTHERS THEN

IF UTL_FILE.is_open(l_file) THEN

UTL_FILE.fclose(l_file);

END IF;

RAISE;

END;

/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: