AWR库的重建

  • A+
所属分类:技术

重建AWR库的原因
AWR库被破坏,不能正常收集awr报告
随着oracle运行时间的增加,awr数据量太大
需要重建AWR库的场景
重建AWR库的步骤
删除AWR组件
重建AWR组件
编译创建的对象
运行11g server管理脚本
重新编译出问题的包
再次运行11g server管理脚本
重新启动数据库
验证组件
创建快照
生成AWR报告

重建AWR库的原因

AWR库被破坏,不能正常收集awr报告

在运行过程中可能会因为误操作,或者其他原因导致awr库的组件不能正常工作,此时无法收集awr报告。出现这种问题后本事定位问题就很困难,因为awr组件非常多并且相互之间的依赖关系也很复杂。所以,想通过解决awr组件问题来恢复awr库是很困难的。解决该问题最有效的方法就是重建awr库

随着oracle运行时间的增加,awr数据量太大

在oracle的运行过程中,由于快照收集策略设置的快照间隔时间太短同时快照保留时间太长。这样就产生了大量的awr数据占用系统表空间system,因此必须实时的清理awr数据。清理awr数据最有效的方法就是重建awr库。

需要重建AWR库的场景

常见的需要重建awr库的场景如下:
1、不能正常收集awr报告,并且短时间内很难定位问题的原因
2、清理占用系统表空间过多的awr数据
3、不能自动产生系统快照,并且很难定位问题原因

重建AWR库的步骤

删除AWR组件

1、在执行操作之前需要先设置serveroutput为打开状态
使用set serveroutput on命令设置环境变量
SQL> set serveroutput on
2、删除awr组件
SQL> start ?/rdbms/admin/catnoawr.sql
脚本执行过程中可能会报“table or view does not exit”的错误。报这种错误不影响脚本的执行,但是最终应该是“PL/SQL procedure successfully completed.”执行结果截图如下:

AWR库的重建

重建AWR组件

重建awr组件执行如下脚本:
SQL> start ?/rdbms/admin/catawrtb.sql
执行过程中可能会报错“table or view does not exist”,报这种错误不影响脚本的执行,但是最终应该是“PL/SQL procedure successfully completed.”执行结果截图如下:

AWR库的重建

编译创建的对象

执行以上脚本后重建了awr组件即重新创建了数据库对象,此时在dba_objects视图中应该标记所有新创的对象为invalid状态,即新创建的数据库对象目前还是无效状态,必须编译创建的对象。执行如下脚本编译dba_objects视图中的无效对象。
SQL> start ?/rdbms/admin/utlrp.sql
执行结果截图如下:

AWR库的重建

 

运行11g server管理脚本

oracle11g必须运行server管理脚本,并且执行结果中不能出现报错。一旦有报错说明有关键的系统数据库对象仍然没有被编译成功。需要再重新编译无效的数据库对象。保证该脚本的执行过程中不出现任何报错。
SQL> start ?/rdbms/admin/execsvrm.sql
如果执行过程中报错如下:

AWR库的重建

说明有未生效的系统数据库对象,该报错显示是“SYS.DBMS_SWRF_INTERNAL”包未编译生效,目前仍然是invalid。不能被系统识别和调用。所以需要进行后续的操作“重新编译出问题的包”。
注:即使脚本执行过程中不报任何错误,在第一次执行该脚本时最好也要执行后续的“重新编译出问题的包”操作。因为虽然执行过程中没有报错,有可能是未生效的数据库对象在脚本执行过程中没有被识别出来,导致脚本运行过程中不报错。但实际上数据库对象仍然是无效的,所以执行该脚本后不管执行过程中是否报错都要执行后续的“重新编译出问题的包”操作,做到万无一失!!

重新编译出问题的包

SQL> alter package SYS.dbms_swrf_internal compile ;
SQL> alter package SYS.dbms_swrf_internal compile body ;
SQL> show error ;
执行过程截图如下:

AWR库的重建

再次运行11g server管理脚本

执行如下脚本
SQL> start ?/rdbms/admin/execsvrm.sql
保证执行过程中不报任何错误,说明新创建的数据库对象全部编译成功,新创建的awr组件全部生效。
执行结果截图如下:

AWR库的重建 AWR库的重建

重新启动数据库

SQL> shutdown immediate
SQL> startup

验证组件

执行如下sql命令验证awr库是否重建成功:
SQL> spool objects.lst
SQL> set pagesize 999
SQL> set linesize 200

SQL> select substr(comp_name,1,40) comp_name, status, substr(version,1,10) version from dba_registry order by comp_name;
SQL> 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;
SQL> select owner,object_type,count(*) from dba_objects where status=’INVALID’ group by owner,object_type order by owner,object_type ;
SQL> spool off
第一条sql的执行是查询所有的数据库组件的状态。查询出的结果必须是所有组件的状态都是valid才可以。否则,出现无效的数据库组件说明awr库重建失败,必须重新编译无效的数据库组件。
第二条sql是查询dba_objects视图中所有的无效数据库对象。查询的结果应该是“no rows selected”,说明所有的数据库对象全部生效。
第三条sql也是查询dba_objects视图中所有的无效数据库对象并且统计无效对象的个数。查询的结果应该是“no rows selected”

创建快照

因为后续要测试AWR报告的生成,所以需要收集一份AWR报告。因此需要手动产生至少两次快照才能统计AWR报告中的平均值。手动产生快照执行如下命令:
SQL> exec dbms_workload_repository.create_snapshot;
执行两次上述命令产生两个系统快照

生成AWR报告

SQL> @?/rdbms/admin/awrrpt.sql ;
成功收集到AWR报告说明AWR库的重建成功。

注意:在RAC环境下的话需要先取消集群参数然后再执行以上所有操作,待以上所有操作完成后再修改成集群模式。即上述重建AWR库的所有操作都必须在单实例模式下进行,修改完成后再将数据库修改成集群模式。
修改成单实例模式的sql命令如下:
SQL> alter system set cluster_database = false scope = spfile;
更加详细的步骤和执行过程参考文档:优化/道行尚浅-AWR初探.pdf 文档的 “AWR库的重建” 模块

本文由 爱彩 首发于【爱彩网http://www.aidatu.com)】未经允许不得以任何方式转载,违者必将追究法律责任。

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
虾米

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:1   其中:访客  1   博主  0

    • 淑翰 淑翰 0

      方法步骤太详细了,超级赞!!,上次重建就把库给建崩溃了,这次按照你文章中的介绍顺利成功。