最近在学习oracle 性能调优,资料中提到了用DBMS_PROFILER。根据资料安装完DBMS_PROFILER包并且向其他用户授权后。执行以下操作:1 调用START_PROFILER
EXEC DBMS_PROFILER.START_PROFILER('A'); 
//操作成功2 调用想要测试的存储过程
exec sync_hr_data3 调用DBMS_PROFILER.FLUSH_DATA
exec DBMS_PROFILER.FLUSH_DATA;
此时oracle给出错误信息
*ERROR at line 1:ORA-06528: Error executing PL/SQL profilerORA-06512: at "SYS.DBMS_PROFILER", line 258ORA-06512: at line 1 
4 调用 DBMS_PROFILER.STOP_PROFILER;
exec DBMS_PROFILER.STOP_PROFILER;
oracle给出错误信息 
ERROR at line 1:ORA-06528: Error executing PL/SQL profilerORA-06512: at "SYS.DBMS_PROFILER", line 258ORA-06512: at line 1 
请问为什么 我调用 DBMS_PROFILER.STOP_PROFILER;和 DBMS_PROFILER.FLUSH_DATA的时候会报错。既然调用DBMS_PROFILER.START_PROFILER('A'); 是可以执行成功的说明DBMS_PROFILER是安装成功的

解决方案 »

  1.   

    安装成功,但是没安装完全。你看下trc文件里有没有具体的报错信息
      

  2.   

    在执行 dbms_profiler 前应该先在当前用户帐户下执行 PROFTAB.SQL 脚本($ORACLE_HOME/rdbms/admin)。
      

  3.   


    --参考文档
    DBMS_PROFILER在使用之前可能需要安装,具体安装步骤如下:  ◆1:执行$ORACLE_HOME/rdbms/admin/profload.sql  ◆2:创建一个用于存放跟踪信息的schema  CREATE USER profiler IDENTIFIED BY profiler DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;  GRANT connect TO profiler;  CREATE PUBLIC SYNONYM plsql_profiler_runs FOR profiler.plsql_profiler_runs;  CREATE PUBLIC SYNONYM plsql_profiler_units FOR profiler.plsql_profiler_units;  CREATE PUBLIC SYNONYM plsql_profiler_data FOR profiler.plsql_profiler_data;  CREATE PUBLIC SYNONYM plsql_profiler_runnumber FOR profiler.plsql_profiler_runnumber;  ◆3:使用刚刚创建的profiler用户执行如下脚本或代码:  $ORACLE_HOME/rdbms/admin/proftab.sql  GRANT SELECT ON plsql_profiler_runnumber TO PUBLIC;  GRANT SELECT, INSERT, UPDATE, DELETE ON plsql_profiler_data TO PUBLIC;  GRANT SELECT, INSERT, UPDATE, DELETE ON plsql_profiler_units TO PUBLIC;  GRANT SELECT, INSERT, UPDATE, DELETE ON plsql_profiler_runs TO PUBLIC;  安装成功后测试:  执行  BEGIN  DBMS_PROFILER.START_PROFILER('123');  FOR I IN 1 .. 1000 LOOP  INSERT INTO A VALUES (I || '');  END LOOP;  COMMIT;  DBMS_PROFILER.STOP_PROFILER();  END;  执行后使用下面的代码检查:  SELECT C.LINE#, C.TOTAL_OCCUR, C.TOTAL_TIME, C.MIN_TIME, C.MAX_TIME  FROM PLSQL_PROFILER_RUNS A, PLSQL_PROFILER_UNITS B, PLSQL_PROFILER_DATA C  WHERE A.RUN_COMMENT = '123'  AND B.UNIT_OWNER = ''  AND A.RUNID = B.RUNID  AND A.RUNID = C.RUNID  AND B.UNIT_NUMBER = C.UNIT_NUMBER  注意:每次DBMS_PROFILER.START_PROFILER的输入参数需要改变,否则便不能分别运行后的运行结果了。  除此之外B.UNIT_OWNER =‘’中的约束值如果是在package里面需要是包名,如果是procedure则是procedure的名字。实在在不知道什么名字时可以在PLSQL_PROFILER_UNITS中查一下。