自动数据库诊断监控 (ADDM)是一种工具,在分析数据的自动负载信息库(AWR)执行问题的准确和及时的诊断。它可以找到根本原因并提供纠正问题的建议。
对于那些不熟悉性能调优的人, AWR (自动工作负载存储库)是每个Oracle数据库中都存在的内置存储库(在SYSAUX表空间中)。Oracle数据库会定期对其所有重要统计信息和工作负载信息进行快照,并将其存储在 AWR中以了解有关AWR的更多信息。
ADDM分析包括以下内容。
- CPU负载
- 内存使用情况
- I / O使用
- 资源密集型SQL
- 资源密集型PL / SQL和Java
- RAC问题
- 应用问题
- 数据库配置问题
- 并发问题
- 对象争用
ADDM还监视系统的非问题区域,例如不会严重影响系统性能的等待事件类,在初始阶段就将它们识别并从调整注意事项中删除,从而节省了本来可以花时间和精力的项目不会影响整体系统性能。
ADDM不仅建议问题诊断,还为问题提供可能的解决方案。ADDM为DBA推荐一种或多种解决方案,其中包括各种推荐的解决方案,包括:
- 硬件变更
- 数据库配置
- 模式变更
- 申请变更
- 使用其他顾问
ADDM分析
一个ADDM分析 将 在执行 一对 的AWR快照和 集合 从实例的等效信息。这对AWR快照概述了分析的时间段,实例集定义了分析的目标。
如果您使用的是Oracle Real Application Clusters (Oracle RAC)。
按照对数据库性能的潜在影响的顺序列出了发现(问题),以及解决该问题和导致其发现的症状的建议。
来自示例我的测试实例如下所示。
使用addmrpt.sql脚本运行ADDM
- 要调用ADDM分析,只需在SQL提示符下运行addmrpt.sql脚本。该脚本的调用方式如下:
SQL> @?/rdbms/admin/addmrpt.sql
Current Instance
~~~~~~~~~~~~~~~~
DB Id DB Name Inst Num Instance
----------- ------------ -------- ------------
936252554 POCD 1 POCD
Instances in this Workload Repository schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DB Id Inst Num DB Name Instance Host
------------ ---------- --------- ---------- ------
* 936252554 1 POCD POCD mac60-1
Using 936252554 for database Id
Using 1 for instance number
Specify the number of days of snapshots to choose from
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Entering the number of days (n) will result in the most recent
(n) days of snapshots being listed. Pressing without
specifying a number lists all completed snapshots.
Listing the last 3 days of Completed Snapshots
Instance DB Name Snap Id Snap Started Snap Level
------------ ------------ ---------- ------------------ ----------
POCD POCD 1052 26 Feb 2018 08:00 1
1053 26 Feb 2018 08:30 1
1054 26 Feb 2018 09:00 1
1055 26 Feb 2018 09:30 1
1056 26 Feb 2018 10:00 1
1057 26 Feb 2018 10:30 1
1058 26 Feb 2018 11:00 1
1059 26 Feb 2018 11:30 1
Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: 1058
Begin Snapshot Id specified: 1058
Enter value for end_snap: 1059
End Snapshot Id specified: 1059
Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is addmrpt_1_1058_1059.txt. To use this name,
press to continue, otherwise enter an alternative.
Enter value for report_name: addm_recent.txt
非系统用户生成addm报告所需的特权:
sqlplus / as sysdba
GRANT ADVISOR TO REPORT_USER;
GRANT SELECT_CATALOG_ROLE TO REPORT_USER;
GRANT EXECUTE ON dbms_workload_repository TO REPORT_USER;
使用ADDM诊断性能问题
为了诊断性能问题,每次查看AWR快照时都会自动创建ADDM分析结果。如果需要较长的分析时间,或者要使用其他DBIO_EXPECTED设置,或者需要更改分析模式,则可以手动运行ADDM 。
ADDM分析两个AWR快照条件,因为两个快照仍存储在AWR中,并分析在开始快照之前启动并一直运行到结束快照的实例。
只要有可能,就应该使用Oracle Enterprise Manager运行ADDM。如果Oracle Enterprise Manager不可用,则可以使用DBMS_ADDM软件包(11g)运行ADDM 。要运行DBMS_ADDM API,必须授予用户ADVISOR特权。
数据库模式下的ADDM
在RAC配置中,可以在数据库模式下运行ADDM以分析数据库的所有实例。对于单实例配置,您仍然可以在数据库模式下运行ADDM 。ADDM的行为就像在实例模式下运行一样。
- task_name [指定将要创建的分析任务的名称]
- begin_snapshot [指定分析期间内开始快照的快照编号]
- end_snapshot [分析期间结束快照的快照编号]
- db_id [将要分析的数据库的数据库标识符]
BEGIN
DBMS_ADDM.ANALYZE_DB (
task_name IN OUT VARCHAR2,
begin_snapshot IN NUMBER,
end_snapshot IN NUMBER,
db_id IN NUMBER := NULL);
END;
/
在特定时间段120和130中,以数据库分析模式创建ADDM任务,并执行该任务以诊断整个数据库的性能:
VAR tname VARCHAR2(30);
BEGIN
:tname := 'ADDM for 7AM to 9AM';
DBMS_ADDM.ANALYZE_DB(:tname, 120, 130);
END;
/
实例模式下的ADDM
在实例模式下运行ADDM以分析数据库的特定实例。使用DBMS_ADDM.ANALYZE_INST过程:
BEGIN
DBMS_ADDM.ANALYZE_INST (
task_name IN OUT VARCHAR2,
begin_snapshot IN NUMBER,
end_snapshot IN NUMBER,
instance_number IN NUMBER := NULL,
db_id IN NUMBER := NULL);
END;
/
在实例分析模式下创建ADDM任务,并执行它以诊断实例数据库的性能,例如快照120和130定义的时间段内实例1的性能:
VAR tname VARCHAR2(30);
BEGIN
:tname := 'my ADDM for 7AM to 9AM';
DBMS_ADDM.ANALYZE_INST(:tname, 120, 130, 1);
END;
/
部分模式下的ADDM
在部分模式下运行ADDM以使用 DBMS_ADDM.ANALYZE_PARTIAL 过程:
BEGIN
DBMS_ADDM.ANALYZE_PARTIAL (
task_name IN OUT VARCHAR2,
instance_numbers IN VARCHAR2,
begin_snapshot IN NUMBER,
end_snapshot IN NUMBER,
db_id IN NUMBER := NULL);
END;
/
在快照120和130定义的时间段内,以部分分析模式创建ADDM任务,并执行该任务以诊断实例编号1、2和4的性能:
VAR tname VARCHAR2(30);
BEGIN
:tname := 'my ADDM for 7PM to 9PM';
DBMS_ADDM.ANALYZE_PARTIAL(:tname, '1,2,4', 137, 145);
END;
/
ADDM报告
使用DBMS_ADDM.GET_REPORT函数显示已执行的ADDM任务的文本报告:
DBMS_ADDM.GET_REPORT (
task_name IN VARCHAR2
RETURN CLOB);
由tname变量指定的ADDM任务的文本报告:
SET LONG 1000000 PAGESIZE 0;
SELECT DBMS_ADDM.GET_REPORT(:tname) FROM DUAL;