监视错误和警报
以下各节介绍如何监视数据库错误和警报。它包含以下主题:
- 使用跟踪文件和警报日志监视错误
- 使用服务器生成的警报监视数据库操作
监视数据库中错误和警报的最简单和最好的方法是在企业管理器中的数据库主页。本节提供了使用数据字典视图,PL / SQL包和其他命令行工具进行监视的备用方法。
使用跟踪文件和警报日志监视错误
每个服务器和后台进程都可以写入关联的跟踪文件。当进程检测到内部错误时,它将有关错误的信息转储到其跟踪文件。写入跟踪文件的某些信息专供数据库管理员使用,其他信息用于Oracle支持服务。跟踪文件信息也用于调整应用程序和实例。
严重错误还会在自动诊断信息库中创建事件和事件转储。有关更多信息,请参阅第9章“管理诊断数据”。
警报日志是按时间顺序排列的消息和错误日志,包括以下项目:
- 所有发生的内部错误(ORA-00600),块损坏错误(ORA-01578)和死锁错误(ORA-00060)
- 管理操作,例如CREATE,ALTER和DROP语句以及STARTUP,SHUTDOWN和ARCHIVELOG语句
- 与共享服务器和调度程序进程相关的消息和错误
- 物化视图自动刷新期间发生的错误
- 在数据库和实例启动时具有非缺省值的所有初始化参数的值
Oracle数据库使用警报日志来记录这些操作,作为在操作员控制台上显示信息的替代方法(尽管某些系统也在控制台上显示信息)。如果操作成功,则会在警报日志中写入“已完成”消息以及时间戳。
警报日志保持为XML格式的文件和文本格式的文件。您可以使用任何文本编辑器查看警报日志的任何一种格式,也可以使用ADRCI实用程序查看剥离了XML标签的文件的XML格式版本。
定期检查实例的警报日志和跟踪文件,以了解后台进程是否遇到错误。例如,当日志写入进程(LGWR)无法写入日志组的成员时,指示问题性质的错误消息将写入LGWR跟踪文件和警报日志。这样的错误信息意味着媒体或I / O问题已发生,应立即予以纠正。
除了其他重要的统计数据外,Oracle数据库还将初始化参数的值写入警报日志。
后台和服务器进程的警报日志和所有跟踪文件被写入自动诊断信息库,其位置由DIAGNOSTIC_DEST初始化参数指定。跟踪文件的名称是特定于操作系统的,但每个文件通常都包含写入文件的进程的名称(如LGWR和RECO)。
- 有关自动诊断信息库的信息,请参见第9章“管理诊断数据”。
- “警报日志”获取有关警报日志的其他信息。
- “查看警报日志”
- 有关ADRCI实用程序的信息,请参阅Oracle数据库实用程序。
- 您的操作系统特定的Oracle文档,以获取有关跟踪文件名称的信息
控制跟踪文件的大小
您可以使用初始化参数MAX_DUMP_FILE_SIZE来控制所有跟踪文件(不包括警报日志)的最大大小,该参数将文件限制为指定数量的操作系统块。要控制警报日志的大小,您必须在不再需要时手动删除该文件。否则,数据库将继续附加到该文件。
您可以安全地删除实例运行时的警报日志,尽管您应该考虑先制作它的存档副本。如果您有将来需要调查实例历史记录的问题,则此存档副本可能会有价值。
控制Oracle数据库写入跟踪文件的时间
后台进程总是在适当的时候写入跟踪文件。对于ARCn后台进程,可以通过初始化参数来控制生成的跟踪信息的数量和类型。此行为在“控制由Archivelog进程生成的跟踪输出”中描述。其他后台进程没有这种灵活性。
跟踪文件是在发生严重错误时代表服务器进程编写的。此外,设置初始化参数SQL_TRACE = TRUE会导致SQL跟踪功能为处理实例的所有SQL语句生成性能统计信息,并将它们写入自动诊断信息库。
或者,您可以请求为服务器进程生成跟踪文件。无论SQL_TRACE初始化参数的当前值如何,每个会话都可以使用SQL语句ALTER SESSION SET SQL_TRACE代表关联的服务器进程启用或禁用跟踪日志记录。此示例为特定会话启用SQL跟踪工具:
ALTER SESSION SET SQL_TRACE TRUE;
使用DBMS_SESSION或DBMS_MONITOR包来控制会话的SQL跟踪。
用于服务器进程的SQL跟踪功能可能会导致严重的系统开销,从而导致严重的性能影响,因此您只应在收集统计信息时启用此功能。
第9章“管理诊断数据”以获取有关数据库如何处理严重错误的更多信息,也称为“事件”。
读取共享服务器会话的跟踪文件
如果启用了共享服务器,则每个使用调度程序的会话都会路由到共享服务器进程,并且仅当会话启用了跟踪(或者遇到错误)时才将跟踪信息写入服务器跟踪文件。因此,要跟踪使用调度程序进行连接的特定会话的跟踪,您可能需要研究几个共享服务器跟踪文件。为了帮助您,Oracle提供了一个命令行实用程序trcsess,它将与用户会话有关的所有跟踪信息合并到一个地方,并按时间排序信息
Oracle数据库性能调优指南,获取有关使用SQL跟踪工具和使用TKPROF和trcsess解释生成的跟踪文件的信息
使用服务器生成的警报监视数据库操作
服务器生成的警报是来自Oracle数据库服务器的即将发生问题的通知。通知可能包含纠正问题的建议。问题条件清除后还会提供通知。
警报在问题发生时或数据与指标的期望值不匹配时自动生成,例如以下内容:
- 每秒物理读取次数
- 用户每秒提交次数
- SQL服务响应时间
服务器生成的警报可以基于阈值级别,也可以仅由于发生事件而发生。基于阈值的警报可以在阈值警告和临界级别触发。这些级别的值可以是客户定义的或内部值,某些警报具有默认阈值级别,您可以根据需要进行更改。例如,默认情况下,当空间使用率超过85%警告或97%临界阈值级别时,会为表空间空间使用率生成服务器生成的警报。不基于阈值级别的警报示例如下:
- 快照太旧
- 可恢复的会话暂停
- 恢复区空间使用情况
将警报消息发送到用户SYS拥有的预定义持久队列ALERT_QUE。 Oracle Enterprise Manager读取此队列并提供关于未完成服务器警报的通知,并且有时会提出纠正问题的操作。警报显示在企业管理器数据库主页上,可以配置为向选定的管理员发送电子邮件或寻呼机通知。如果警报无法写入警报队列,则有关警报的消息将写入Oracle数据库警报日志。
后台进程会定期将数据刷新到自动工作量存储库以捕获度量值的历史记录。系统会定期自动清除警报历史记录表和ALERT_QUE。
设置和检索服务器生成警报的阈值
您可以使用DBMS_SERVER_ALERT PL / SQL程序包的SET_THRESHOLD和GET_THRESHOLD过程来查看和更改服务器警报指标的阈值设置。以下部分提供了使用这些过程的示例:
- 设置阈值级别
- 检索阈值信息
设置和检索阈值的最方便的方法是使用企业管理器的图形界面。有关说明,请参阅Oracle Database 2 Day DBA
Oracle数据库PL / SQL包和类型参考了解关于DBMS_SERVER_ALERT包的信息
设置阈值级别
以下示例显示了如何使用SET_THRESHOLD过程为实例的每个用户调用的CPU时间设置阈值:
DBMS_SERVER_ALERT.SET_THRESHOLD( DBMS_SERVER_ALERT.CPU_TIME_PER_CALL, DBMS_SERVER_ALERT.OPERATOR_GE, '8000', DBMS_SERVER_ALERT.OPERATOR_GE, '10000', 1, 2, 'inst1', DBMS_SERVER_ALERT.OBJECT_TYPE_SERVICE, 'main.regress.rdbms.dev.us.example.com');
在此示例中,如果每次用户呼叫的CPU时间超过8000微秒时发出警告警报,并且当每次用户呼叫的CPU时间超过10,000微秒时发出严重警报。论据包括:
- CPU_TIME_PER_CALL指定度量标识符。有关支持度量标准的列表,请参阅Oracle数据库PL / SQL包和类型参考
- 观察期设定为1分钟。此期限指定发出警报之前条件必须偏离阈值的分钟数。
- 连续出现次数设置为2.此数字指定在警报生成之前度量值必须违反阈值的次数。
- 实例的名称设置为inst1。
- 常量DBMS_ALERT.OBJECT_TYPE_SERVICE指定设置阈值的对象类型。在这个例子中,服务名称是main.regress.rdbms.dev.us.example.com。
检索阈值信息 要检索阈值,请使用GET_THRESHOLD过程。例如:
DECLARE warning_operator BINARY_INTEGER; warning_value VARCHAR2(60); critical_operator BINARY_INTEGER; critical_value VARCHAR2(60); observation_period BINARY_INTEGER; consecutive_occurrences BINARY_INTEGER; BEGIN DBMS_SERVER_ALERT.GET_THRESHOLD( DBMS_SERVER_ALERT.CPU_TIME_PER_CALL, warning_operator, warning_value, critical_operator, critical_value, observation_period, consecutive_occurrences, 'inst1', DBMS_SERVER_ALERT.OBJECT_TYPE_SERVICE, 'main.regress.rdbms.dev.us.example.com'); DBMS_OUTPUT.PUT_LINE('Warning operator: ' || warning_operator); DBMS_OUTPUT.PUT_LINE('Warning value: ' || warning_value); DBMS_OUTPUT.PUT_LINE('Critical operator: ' || critical_operator); DBMS_OUTPUT.PUT_LINE('Critical value: ' || critical_value); DBMS_OUTPUT.PUT_LINE('Observation_period: ' || observation_period); DBMS_OUTPUT.PUT_LINE('Consecutive occurrences:' || consecutive_occurrences); END; /
您还可以使用DBA_THRESHOLDS视图检查特定的阈值设置。例如:
SELECT metrics_name, warning_value, critical_value, consecutive_occurrences FROM DBA_THRESHOLDS WHERE metrics_name LIKE '%CPU Time%';
查看服务器生成的警报
查看服务器生成的警报的最简单方法是访问企业管理器的数据库主页。以下讨论介绍了查看这些警报的其他方法。
如果使用自己的工具而不是企业管理器来显示警报,则必须订阅ALERT_QUE,读取ALERT_QUE,并在设置警报的阈值级别后显示警报通知。要创建代理并将代理订阅到ALERT_QUE,请使用DBMS_AQADM包的CREATE_AQ_AGENT和ADD_SUBSCRIBER过程。
接下来,您必须将数据库用户与订阅代理相关联,因为只有与订阅代理关联的用户才能访问安全ALERT_QUE中的排队消息。您还必须将排队特权分配给用户。使用DBMS_AQADM包的ENABLE_DB_ACCESS和GRANT_QUEUE_PRIVILEGE过程。
或者,您可以注册DBMS_AQ.REGISTER过程,以在警报入队ALERT_QUE时接收异步通知。通知可以是电子邮件,HTTP post或PL / SQL过程的形式。
要阅读警报消息,可以使用DBMS_AQ.DEQUEUE过程或OCIAQDeq调用。消息出列后,使用DBMS_SERVER_ALERT.EXPAND_MESSAGE过程来展开消息的文本。
Oracle数据库PL / SQL包和类型参考以获取有关DBMS_AQ和DBMS_AQADM包的信息
服务器生成的警报数据字典视图
以下数据字典视图提供有关服务器生成警报的信息
View | Description |
DBA_THRESHOLDS | 列出为实例定义的阈值设置 |
DBA_OUTSTANDING_ALERTS | 描述数据库中的未完成警报 |
DBA_ALERT_HISTORY | 列出已清除警报的历史记录 |
V$ALERT_TYPES | 为每个警报提供信息,例如组和类型 |
V$METRICNAME | 包含有关系统指标的名称,标识符和其他信息 |
V$METRIC | 包含系统级度量值 |
V$METRIC_HISTORY | 包含系统级度量值的历史记录 |
Oracle数据库参考,以获取关于静态数据字典视图和动态性能视图的信息
参考资料
https://docs.oracle.com/cd/E11882_01/server.112/e25494/monitoring.htm#ADMIN005