导航

【转】ORACLE AWR报告

Posted on 2017-05-03 14:38  张鑫的园子  阅读(420)  评论(0编辑  收藏  举报

转自:http://blog.csdn.net/liqfyiyi/article/details/8236864

About Oracle AWR

Oracle AWR is a powerful monitoring utility bundle with Oracle Database from 10g.

Oracle AWR Basic Example

http://space.itpub.net/35489/viewspace-609528

SQL> conn / AS SYSDBA
SQL> @?/rdbms/admin/awrrpt.sql
输入 report_type 的值: <enter默认为html类型>
输入 num_days 的值: 2                          --- 现在到过去两天时间内的snap id (可以查看到).
输入 begin_snap 的值: 2147                     --- 输入的开始及结束的snap id 对应您要查找的出现问题的时间段。 
输入 end_snap 的值: 2182 
输入 report_name 的值: <enter采用默认文件名>
Report written to awrrpt_1_2177_2182.html
SQL> exit

下载awrrpt_1_2177_2182.html并打开查看。

Oracle AWR License

So even though your 10g/11g database automatically collects AWR data every sixty minutes and retains it for a week – you cannot legally use the Oracle supplied PL/SQL packages (i.e. DBMS_WORKLOAD_REPOSITORY), the OEM screens for AWR, ADMM and ASH, or even the AWR data dictionary views (i.e. DBA_HIST_*) if you’re not licensed. This has in fact outraged more than a few users – resulting in an “Open Letter to Oracle about AWR and Ash Licensing”.

Oracle AWR 说明

认识AWR

Oracle 10g 开始提供了一个显著改进的工具:自动工作负载信息库AWR (Automatic Workload Repository). Oracle 建议用户用这个取代 Statspack。

AWR 是一个Oracle10g的内置工具,它采集与性能相关的统计数据,并从那些统计数据中导出性能量度,以跟踪潜在的问题。与 Statspack 不同,快照由一个称为 MMON 的新的后台进程及其从进程自动地每小时采集一次(在oracle10G中引进了两个新的进程:mmonmmnl,其中MMON承担了大部分的工作)。为了节省空间,采集的数据在 7 天后自动清除。快照频率和保留时间都可以由用户修改。它产生两种类型的输出:文本格式(类似于 Statspack报表的文本格式但来自于 AWR 信息库)和默认的 HTML 格式(拥有到部分和子部分的所有超链接),从而提供了非常友好的用户报表。

AWR 用几个表来存储采集的性能统计数据,所有的表都存储在 SYSAUX 表空间中的 SYS 模式下,并且以 WRM$_*(5個) 和 WRH$_*(94個)的格式名。前一种类型存储元数据信息(如检查的数据库和采集的快照),后一种类型保存实际采集的统计数据。H代表“历史数据 (historical)”而 M 代表“元数据 (metadata)”。在这些表上构建了几种带前缀 [[[DBA_HIST_ 的视图,这些视图可以用来编写您自己的性能诊断工具。视图的名称直接与表相关;例如,视图 DBA_HIST_SYSMETRIC_SUMMARY 是在WRH$_SYSMETRIC_SUMMARY 表上构建的。要使用AWR必须设置STATISTICS_LEVEL参数,共有三个:BASIC, TYPICAL,ALL。如果设为BASIC将禁用许多特性,如ADDM (Automatic Database Diagnostic Monitor ADDM)自动数据库诊断监视器。安装Oracle 10g后,默认值是TYPICAL。AWR的统计数据默认保留7天,并且每小时获取一次快照。

一、 ASH(v$active_session_history)和AWR

1. 10g之前用户的连接将产生会话,当前会话记录保存在v$session中;处于等待状态的会话会被复制一份放在v$session_wait中。当该连接断开后,其原来的连接信息在v$session和v$session_wait中就会被删除。这是10g之前的状况。

2. v$session_wait_history与ASH若是一个普通的会话(我是指没有大量地耗费资源),则对于性能调整来说无足轻重。但若该会话在活动时大量占用了资源(比如:CPU,内存,I/O等),该会话信息的丢失,将无法评测当时的系统瓶颈究竟是什么。令DBA高兴的是,oracle10g中保留下了v$session_wait中的这些信息。在10g中新出现了一个视图:v$session_wait_history。这个视图保存了每个活动session在v$session_wait中最近10次的等待事件(ASH缺省每一秒收集一下v$session中活动会话的情况,记录会话等待的事件,不活动的会话不会被采样 ,间隔时间由 _ash_sampling_interval 参数确定)。但这对于一段时期内的数据性能状况的监测是远远不够的,为了解决这个问题,在10g中还新添加了一个视图:v$active_session_history。这就是ASH(active session history)。典型的情况下,为了诊断当前数据库的状态,需要最近的五到十分钟的详细信息。然而,由于记录session的活动信息是很费时间和空间的,ASH采用的策略是:保存处于等待状态的活动session的信息,每秒从v$session_wait中采样一次,并将采样信息保存在内存中(ASH的采样数据是保存在内存中)。

3. AWR注意,ASH的采样数据是保存在内存中。而分配给ASH的内存空间是有限的,当所分配空间占满后,旧的记录就会被覆盖掉;而且数据库重启后,所有的这些ASH信息都会消失。这样,对于长期检测oracle的性能是不可能的。在Oracle10g中,提供了永久保留ASH信息的方法,这就是AWR(automatic workload repository)。

由于全部保存ASH中的信息是非常耗费时间和空间的,AWR采用的策略是:MMON进程每小时对ASH (v$active_session_history)进行采样一次,并将信息保存到磁盘中,当ASH BUFFER满2/3的话MMNL进程会写,并保留7天,7天后旧的记录才会被覆盖。这些采样信息被保存在表wrh$_active_session_history中。而这个采样频率(1小时)和保留时间(7天)是可以根据实际情况进行调整的,这就给DBA们提供了更加有效的系统监测工具。 AWR永久地保存系统的性能诊断信息,由SYS用户拥有。一段时间后,你可能想清除掉这些信息;有时候为了性能诊断,你可能需要自己定义采样频率来获取系统快照信息。Oracle 10g在包dbms_workload_repository中提供了很多过程,通过这些过程,你可以管理快照并设定基线(baselines:用于保存指定时间段的历史数据用于将来分析及对比 )。

4. ASH保存了系统最新的处于等待的会话记录,可以用来诊断数据库的当前状态;而AWR中的信息最长可能有1小时的延迟,所以其采样信息并不能用于诊断数据库的当前状态,但可以用来作为一段时期内数据库性能调整的参考。

备注: 视图dba_hist_active_sess_history是wrh$_active_session_history和其他几个视图的联合展现,通常通过这个视图进行历史数据的访问。

二、详细介绍 AWR

1. ASH的采集信息保存在内存中,在旧的信息被采样到AWR中后,可被新采集的信息覆盖,重启oracle后该信息被清除。分配给ASH的内存大小可以查询到:

SQL> select pool, name, bytes/1024/1024 From v$sgastat where name like '%ASH %';

POOL          NAME          BYTES/1024/1024
------------- ------------- ---------------
shared pool   ASH buffers                 6

2. 其实AWR记录的信息不仅是ASH,还可以收集到数据库运行的各方面统计信息和等待信息,用以诊断分析。
AWR的采样方式是,以固定的时间间隔为其所有重要的统计信息和负载信息执行一次采样,并将采样信息保存在AWR中。可以这样说:ASH中的信息被保存到了AWR中的视图wrh$_active_session_history中。ASH是AWR的真子集。

3. mmon进程与mmnl进程快照由一个称为 MMON 的新的后台进程(及其从进程)以及MMNL后台进程自动地每隔固定时间采样一次。我们先来看一下这两个新增加的后台进程的介绍:
MMON进程负责执行多种和管理相关(manageability-related)的后台任务,例如:
当某个测量值(metrics)超过了预设的限定值(threshold value)后提交警告 创建新的 MMON 隶属进程(MMON slave process)来进行快照(snapshot) 捕获最近修改过的 SQL 对象的统计信息

MMNL进程负责执行轻量级的且频率较高的和可管理性相关的后台任务,例如捕获会话历史信息,测量值计算等。AWR的采样工作由MMON进程每个1小时执行一次,ASH信息同样会被采样写出到AWR负载库中。虽然ASH buffer被设计为保留1小时的信息,但很多时候这个内存是不够的,当ASH buffer写满后,另外一个后台进程MMNL将会主动将ASH信息写出。

4. SYSAUX表空间这些采样数据都存储在SYSAUX表空间中,并且以WRM$_* 和 WRH$_*的格式命名。前一种类型存储元数据信息(如检查的数据库和采集的快照),后一种类型保存实际采集的统计数据。

SQL> select table_name from dba_tables where table_name like 'WRM$%';

TABLE_NAME
-----------------------
WRM$_WR_CONTROL
WRM$_SNAP_ERROR
WRM$_SNAPSHOT
WRM$_DATABASE_INSTANCE
WRM$_BASELINE

当SYSAUX表空间满后,AWR将自动覆盖掉旧的信息,并在警告日志中记录一条相关信息:

ORA-1688: unable to extend table SYS.WRH$_ACTIVE_SESSION_HISTORY partition WRH$_ACTIVE_3533490838_1522 by 128 in tablespace SYSAUX

5. 采样频率和保留时间可以通过查询视图dba_hist_wr_control或(wrm$_wr_control)来查询AWR的采样频率和保留时间。默认为每1小时采样一次,采样信息保留时间为7天。

SQL> select * from dba_hist_wr_control;
 
DBID SNAP_INTERVAL RETENTION   TOPNSQL
---- ------------- ----------- ----------
1148 +00000 00:1   +00007 00:0 DEFAULT
 
SQL> select DBID, SNAP_INTERVAL, SNAPINT_NUM, RETENTION from wrm$_wr_control;
 
      DBID SNAP_INTERVAL      SNAPINT_NUM RETENTION
---------- ------------------ ----------- --------------------
1160732652 +00000 01:00:00.0         3600 +00007 00:00:00.0
 
-- 设置每半小时一次,并且保留5天 。
SQL> exec dbms_workload_repository.modify_snapshot_settings(interval=>30, retention=>5*24*60);

6. 采样数据量由于数据量巨大,把所有ASH数据写到磁盘上是不能接受的。一般是在写到磁盘的时候过滤这个数据,写出的数据占采样数据的10%,写出时通过direct-path insert完成,尽量减少日志生成,从而最小化数据库性能的影响。

7. 初始化参数statistics_level, AWR的行为受到参数STATISTICS_LEVEL的影响。这个参数有三个值:

  • BASIC: awr统计的计算和衍生值关闭.只收集少量的数据库统计信息.
  • TYPICAL: 默认值.只有部分的统计收集.他们代表需要的典型监控oracle数据库的行为.
  • ALL : 所有可能的统计都被捕捉. 并且有操作系统的一些信息.这个级别的捕捉应该在很少的情况下,比如你要更多的sql诊断信息的时候才使用.

Oracle AWR Views

The following workload repository views are available:

V$ACTIVE_SESSION_HISTORY - Displays the active session history (ASH) sampled every second.
V$METRIC - Displays metric information.
V$METRICNAME - Displays the metrics associated with each metric group.
V$METRIC_HISTORY - Displays historical metrics.
V$METRICGROUP - Displays all metrics groups.
DBA_HIST_ACTIVE_SESS_HISTORY - Displays the history contents of the active session history.
DBA_HIST_BASELINE - Displays baseline information.
DBA_HIST_DATABASE_INSTANCE - Displays database environment information.
DBA_HIST_SNAPSHOT - Displays snapshot information.
DBA_HIST_SQL_PLAN - Displays SQL execution plans.
DBA_HIST_WR_CONTROL - Displays AWR settings.

三、使用AWR

AWR由ORACLE自动产生,不过也可以通过DBMS_WORKLOAD_REPOSITORY包来手工创建、删除和修改。可以使用desc命令查看该包中的过程。下面只介绍几个常用的:

1.手工创建一个快照

SQL> select count(*) from wrh$_active_session_history;
  COUNT(*)
----------
     317  

SQL> begin
  2  dbms_workload_repository.create_snapshot();
  3  end;
  4  /

PL/SQL 过程已成功完成。
SQL> select count(*) from wrh$_active_session_history;
  COUNT(*)
----------
       320

2.手工删除指定范围的快照

SQL> select * from wrh$_active_session_history where snap_id = 96;
   SNAP_ID       DBID INSTANCE_NUMBER  SAMPLE_ID SAMPLE_TIME
---------- ---------- --------------- ---------- ----------------------------
        96 1160732652               1     236930 06-10月-07 11.26.04.562 上午
        96 1160732652               1     236930 06-10月-07 11.26.04.562 上午
        96 1160732652               1     236930 06-10月-07 11.26.04.562 上午

SQL> begin
  2  dbms_workload_repository.drop_snapshot_range(low_snap_id => 96, high_snap_id => 96, dbid => 1160732652);
  3  end;
  4  /
PL/SQL 过程已成功完成。
SQL> select * from wrh$_active_session_history where snap_id = 96;
未选定行

3.修改采集时间和统计信息保留时间

PROCEDURE MODIFY_SNAPSHOT_SETTINGS
参数名称                       类型                    输入/输出默认值?
------------------------------ ----------------------- ------ --------
RETENTION                      NUMBER                  IN     DEFAULT
INTERVAL                       NUMBER                  IN     DEFAULT
TOPNSQL                        NUMBER                  IN     DEFAULT
DBID                           NUMBER                  IN     DEFAULT

通过修改retention参数可以修改awr信息的保留期限。默认的是七天,最小的值是一天。如果把retention设置为零,自动清除就关闭了.如果awr发现sysaux空间不够,它通过删除那些最老部分的快照来重新使用这些空间.同时,也会给dba发一条警告,告诉sysaux空间不够了(在alert log中).通过修改interval参数可以修改awr信息的采样频率。最小的值是10分钟,默认的是60分钟.典型的值是10,20,30,60,120等等。把interval设为0则关闭自动捕捉快照.如将收集间隔时间改为30 分钟一次。并且保留5天时间(注:单位都是为分钟):

SQL> select *from dba_hist_wr_control;
      DBID SNAP_INTERVAL      RETENTION          TOPNSQL
---------- ------------------ -------------------------- -----------
1160732652 +00000 01:00:00.0  +00007 00:00:00.0          DEFAULT
 
SQL> exec dbms_workload_repository.modify_snapshot_settings(interval=>30, retention=>5*24*60);
PL/SQL 过程已成功完成。
 
SQL> SELECT *from dba_hist_wr_control;
      DBID SNAP_INTERVAL       RETENTION         TOPNSQL
---------- ------------------- ------------------------- -----------
1160732652 +00000 00:30:00.0   +00005 00:00:00.0         DEFAULT
 
SQL>

4.设置基线
基线(baseline)是一种机制,这样你可以在重要时间的快照信息集做标记。一个基线定义在一对快照之间,快照通过他们的快照序列号识别.每个基线有且只有一对快照。一次典型的性能调整实践从采集量度的基准线集合、作出改动、然后采集另一个基准线集合开始。可以比较这两个集合来检查所作的改动的效果。在 AWR 中,对现有的已采集的快照可以执行相同类型的比较。
假定一个名称为 apply_interest 的高度资源密集的进程在下午 1:00 到 3:00 之间运行,对应快照 ID 95 到 98。我们可以为这些快照定义一个名称为apply_interest_1 的基准线:

SQL> select *From dba_hist_baseline;
 
未选定行
 
SQL> select * from wrm$_baseline;
 
未选定行
 
SQL> exec dbms_workload_repository.create_baseline(95, 98, 'apply_interest_1');
 
PL/SQL 过程已成功完成。
 
这一操作将快照从 9598 编号,作为上面指定的基准线的一部分。查看现有的基准线:
SQL> select *from dba_hist_baseline;
 
      DBID BASELINE_ID BASELINE_NAME     START_SNAP_ID START_SNAP_TIME               END_SNAP_ID END_SNAP_TIME
---------- ----------- ------------------------- ------------- ------------------------------------- ----------- ------------
1160732652           1 apply_interest_1             95 06-10月-07 11.00.05.375 上午           98 06-10月-07 01.44.58.062 下午
 
SQL> select *from wrm$_baseline;
 
      DBID BASELINE_ID BASELINE_NAME        START_SNAP_ID END_SNAP_ID
---------- ----------- ---------------------------- ------------- -----------
1160732652           1 apply_interest_1                95          98
 
SQL>

在一些调整步骤之后,我们可以创建另一个基准线 — 假设名称为 apply_interest_2,然后只为那些与这两条基准线相关的快照比较量度。
SQL> exec dbms_workload_repository.create_baseline(92, 94, 'apply_interest_2');

PL/SQL 过程已成功完成。
像这样把快照分隔在仅仅几个集合中有助于研究调整对于性能量度的影响。您可以在分析之后使用 drop_baseline() 来删除基准线;快照将保留(也可级联删除)。 此外,当清除例程开始删除旧的快照时,与基准线相关的快照不会被清除,从而允许进行进一步的分析。

5.删除基线

如果要删除一个基准线:

SQL> exec dbms_workload_repository.drop_baseline(baseline_name=>'apply_interest_1', cascade=>false);
 
PL/SQL 过程已成功完成。
 
SQL> select *from wrh$_active_session_history where snap_id in (95,96,97,98);
 
   SNAP_ID       DBID INSTANCE_NUMBER  SAMPLE_ID SAMPLE_TIME
---------- ---------- --------------- ---------- -------------------------------
        95 1160732652               1     235360 06-10月-07 10.56.29.872 上午
        95 1160732652               1     235230 06-10月-07 10.54.19.857 上午
        95 1160732652               1     233130 06-10月-07 10.19.19.478 上午
        95 1160732652               1     232830 06-10月-07 10.14.18.859 上午
        95 1160732652               1     232250 06-10月-07 10.04.38.481 上午
        97 1160732652               1     238600 06-10月-07 12.33.08.420 下午
        97 1160732652               1     238600 06-10月-07 12.33.08.420 下午
        97 1160732652               1     238600 06-10月-07 12.33.08.420 下午
        97 1160732652               1     238600 06-10月-07 12.33.08.420 下午
        97 1160732652               1     238600 06-10月-07 12.33.08.420 下午
        97 1160732652               1     238600 06-10月-07 12.33.08.420 下午
 
   SNAP_ID       DBID INSTANCE_NUMBER  SAMPLE_ID SAMPLE_TIME
---------- ---------- --------------- ---------- -------------------------------
        97 1160732652               1     238420 06-10月-07 11.50.55.686 上午
        97 1160732652               1     238230 06-10月-07 11.47.45.687 上午
        98 1160732652               1     239140 06-10月-07 01.42.00.976 下午
        98 1160732652               1     239140 06-10月-07 01.42.00.976 下午
        98 1160732652               1     239140 06-10月-07 01.42.00.976 下午
        98 1160732652               1     239140 06-10月-07 01.42.00.976 下午
        98 1160732652               1     239140 06-10月-07 01.42.00.976 下午
        98 1160732652               1     239130 06-10月-07 01.27.04.161 下午
        98 1160732652               1     239130 06-10月-07 01.27.04.161 下午
        98 1160732652               1     239130 06-10月-07 01.27.04.161 下午
 
已选择21行。
 
SQL> exec dbms_workload_repository.drop_baseline(baseline_name=>'apply_interest_2', cascade=>true);
 
PL/SQL 过程已成功完成。
 
SQL> select *from wrh$_active_session_history where snap_id in (92,93,94);
未选定行
 
SQL>

Using Oracle AWR

oracle10g awr取得快照

SQL> SQLPLUS / AS SYSDBA
SQL> exec dbms_workload_repository.create_snapshot
SQL> exec:snap_id:=dbms_workload_repository.create_snapshot
SQL> var snap_id number
SQL> print snap_id
SQL> @?/rdbms/admin/awrrpt.sql

查看当前的AWR保存策略

select * from dba_hist_wr_control;
DBID,SNAP_INTERVAL,RETENTION,TOPNSQL
860524039,+00 01:00:00.000000,+07 00:00:00.000000,DEFAULT


以上结果表示,每小时产生一个SNAPSHOT,保留7天

调整AWR配置

AWR配置都是通过dbms_workload_repository包进行配置

1调整AWR产生snapshot的频率和保留策略,如:如将收集间隔时间改为30 分钟一次。并且保留5天时间(注:单位都是为分钟):

exec dbms_workload_repository.modify_snapshot_settings(interval=>30, retention=>5*24*60);

2关闭AWR,把interval设为0则关闭自动捕捉快照

3手工创建一个快照

exec DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT ();

4 查看快照

select * from sys.wrh$_active_session_history

5手工删除指定范围的快照

exec WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE(low_snap_id => 22, high_snap_id => 32, dbid => 3310949047);

6创建baseline

exec dbms_workload_repository.create_baseline (56,59,'apply_interest_1')

7删除baseline

exec DBMS_WORKLOAD_REPOSITORY.DROP_BASELINE(baseline_name => ' apply_interest_1', cascade => FALSE);

3.生产AWR报告

$ORACLE_HOME/rdbms/admin/awrrpt.sql

停止AWR的方法

Many Ways to Disable AWR:

Download Meta-Link script dbms_awr.plb, compile this package, then execute the PL/SQL package dbms_awr.disable_awr() [see metalink note 436386.1].
Set your init.ora parameter STATISTICS_LEVEL = BASIC
Execute the Oracle provided PL/SQL package: dbms_workload_repository.modify_snapshot_settings(interval=>0)
Execute the Oracle provided PL/SQL package: dbms_scheduler.disable('GATHER_STATS_JOB')
You can use Toad for #3: Main Menu->Database->Monitor->ADDM/AWR Reports screen, choose the Snapshot Management tab, set the interval to all zeroes, and then press the green checkmark in upper left corner to commit the change.
You can use Toad for #4: Main Menu->Schema Browser, choose the Sched. Job tab and disable the GATHER_STATS_JOB job.
You can use OEM for #4: Main Menu->Workload->Automatic Workload Repository, select the “Edit” button and then select the last radio group item labeled: Turn off Snapshot Collection, finally press OK
You can use OEM for #5: Main Menu->Scheduler->Jobs, select the data grid row for GATHER_STATS_JOB, choose the disable drop-down action, then finally press OK
Create your own database creation scripts (i.e. do not use DBCA) and make sure not to run the CATAWRTB.sql script [Note – Oracle upgrade process may undo this]
Run the CATNOAWR.sql script to drop the AWR Repository tables [Note – Oracle upgrade process may undo this]

ORACLE 10g/11g重建AWR

Reference:
http://www.2cto.com/database/201203/123990.html

如果在日常工作中遇见了AWR数据量太大,可以通过如下方式做以清除:

SQL> select distinct dbid,db_name,instance_name from wrm$_database_instance;
DBID DB_NAME   INSTANCE_NAME                                           
---------- --------- ----------------                                 
2691876695 MYDB      mydb      
 
-- 运行如下脚本
SQL> @?\rdbms\admin\catnoawr.sql
 
-- 不重启的话,清空共享池
alter system flush shared_pool;
 
-- 运行重建AWR脚本:
SQL> @?\rdbms\admin\catawrtb.sql
 
-- recompile 
SQL> @?\rdbms\admin\utlrp.sql

ORACLE 11g需要需要运行如下脚本:

SQL> @?\rdbms\admin\execsvrm.sql

测试

SQL> exec dbms_workload_repository.create_snapshot;

如果不对存储过程进行重新编译,执行快照过程会提示如下问题:

SQL> exec dbms_workload_repository.create_snapshot;
BEGIN dbms_workload_repository.create_snapshot; END;
 
*
第 1 行出现错误: 
ORA-13516: AWR 操作失败: AWR Schema not initialized
ORA-06512: 在 "SYS.DBMS_WORKLOAD_REPOSITORY", line 99
ORA-06512: 在 "SYS.DBMS_WORKLOAD_REPOSITORY", line 122
ORA-06512: 在 line 1 
在重新编译了存储过程后,存储过程运行正常
 
隔5分钟后,再次运行:
SQL> exec dbms_workload_repository.create_snapshot;
 
PL/SQL 过程已成功完成。
SQL> @?/rdbms/admin/awrrpt.sql

注意在RAC环境下的话,需要取消集群参数后,待执行完成后再次修改过来:

alter system set cluster_database = false scope = spfile;

当然在重建后我们需要进一步检查下相关对象是否存在异常,对于存在异常的对象需要重新编译:

spool objects.lst                                                                  
set pagesize500                                                                   
set linesize 100                                                                  
 
select substr(comp_name,1,40) comp_name, status, substr(version,1,10) version     
from dba_registry                                                                 
order by comp_name;                                                               
 
select substr(object_name,1,40) object_name,substr(owner,1,15) owner,object_type  
from dba_objects                                                                  
where status='INVALID' order by owner,object_type;                                
 
select owner,object_type,count(*)                                                 
from dba_objects                                                                  
where status='INVALID'                                                            
group by owner,object_type order by owner,object_type ;                           
 
spool off                                                                         
 
alter package <schema name>.<package_name> compile;                               
alter package <schema name>.<package_name> compile body;                          
alter view <schema name>.<view_name> compile;                                     
alter trigger <schema).<trigger_name> compile;