以前获取系统报告时一直习惯了 以sys用户登录到数据库上,在sqlplus命令下使用awrrpt.sql ,获取系统负载报告,今天有同事请教这个问题,不巧的是他没有sys的用户的口令,于是乎,老兵遇到新问题:执行awrrpt时,输入数据库名,天数,begin_snapid,end_snapid后报错,无法找到DBMS_WORKLOAD_REPOSITORY.AWR_SQL_REPORT_HTML。这不由得让我思考两个问题:1、如何直接了当的获取到负责报告;2、要获取负载报告究竟需要什么样的特权(privillege)才可以。
1、awrrpt.sql里查找找到最核心的部分就是
-- call the table function to generate the report
select output from table(dbms_workload_repository.&fn_name( :dbid,
:inst_num,
:bid, :eid,
:rpt_options ));
&fn_name是指调用的函数,再顺藤摸瓜,查看dbms_workload_repository的说明
生成报告的有两个函数
AWR_REPORT_HTML:生成html格式的报表,个人建议使用这个,格式比较好看些
AWR_REPORT_TEXT :生成文本格式的报表
这两个函数的参数是一样的
DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML(
l_dbid IN NUMBER,
l_inst_num IN NUMBER,
l_bid IN NUMBER,
l_eid IN NUMBER,
l_options IN NUMBER DEFAULT 0)
RETURN awrrpt_text_type_table PIPELINED;
参数说明:
l_dbid:数据库的id,可以查询v$database表的dbid
l_inst_num :实例编号,一般是RAC架构下有用,查询v$instance可以得到,单实例的话这个值是1
l_bid :快照起始编号
l_eid :快照结束编号
l_options:报表选项(0,8)默认是0,8的话报表里会多显示ADDM的建议信息。
示例:
1、查找dbid,instance_number
2、查找begin_snapid,end_snapid
3、执行DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML
这是由于用户没有包的执行权限,以sys用户登录,授权,再执行就可以了。