最近在生产库上生成AWR报表时,出现如下错误
ERROR: ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小 ORA-06512: 在 "SYS.DBMS_WORKLOAD_REPOSITORY", line 919 ORA-06512: 在 line 1
数据库版本为WIN64,11.2.0.3
在oracle support中查询如下,确认为bug
经过大规模的搜索和排查资料,发现有如下两种解决方法:
1、生成awr报告时不采用html格式,采用txt格式的话就可避免该错误
2、可以利用管道表间接获取awr的内容
第一种方法虽然可以避免报错,但是txt格式的awr报告阅读极其不方便,因此不是解决之道,通过结合生成外部文件,可以通过方法2实现html格式的awr报告,脚本如下:
DECLARE
V_DBID NUMBER;
V_BEGIN NUMBER;
V_END NUMBER;
TYPE T_VARCHAR IS TABLE OF VARCHAR2(8000 CHAR) INDEX BY BINARY_INTEGER;
V_REPORT T_VARCHAR;
FILE_HANDLE UTL_FILE.FILE_TYPE;
V_FILE_NAME VARCHAR2(1000);
V_DIR VARCHAR2(30);
V_STR VARCHAR2(32766);
BEGIN
V_BEGIN:=5273;
V_END:=5275;
SELECT DBID INTO V_DBID FROM V$DATABASE;
V_DIR:='DATA_PUMP_DIR';
V_FILE_NAME:='AWRRPT_'||TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS')||'.HTML';
FILE_HANDLE:=UTL_FILE.FOPEN(V_DIR,V_FILE_NAME,'W',32766);
SELECT OUTPUT BULK COLLECT
INTO V_REPORT
FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML(V_DBID,
1,
V_BEGIN,
V_END,
0));
for c in 1..v_report.count
loop
V_STR:=v_report(c);
UTL_FILE.PUT_LINE(FILE_HANDLE,V_STR,true);
end loop;
UTL_FILE.FCLOSE(FILE_HANDLE);
EXCEPTION WHEN OTHERS
THEN
IF(UTL_FILE.is_open(FILE_HANDLE)) THEN
UTL_FILE.fclose(FILE_HANDLE);
END IF;
RAISE;
END;
通过执行脚本,可在服务器的'DATA_PUMP_DIR'目录下生成名为AWRRPT_YYYYMMDDHH24MISS.HTML的awr报告文件,然后可以心满意足地查看各种需要的报告信息了。
--转自