零、概述
定期监视数据库的操作是很重要的。这样做不仅可以通知您尚未注意到的错误,而且还可以使您更好地了解数据库的正常操作。熟悉正常行为反过来可以帮助您识别何时出现问题。
一、监控错误和警告
您可以监视数据库错误和警告,以防止、检测和解决问题。
1.使用跟踪文件和警报日志监视错误
跟踪文件是包含用于调查问题的诊断数据的文件。警报日志是一个按时间顺序记录数据库消息和错误的文件。
(1)关于使用跟踪文件和告警日志监控错误
每个服务器和后台进程都可以写入关联的跟踪文件。当进程检测到内部错误时,它将有关错误的信息转储到跟踪文件中。写入跟踪文件的一些信息是为数据库管理员准备的,而其他信息是为Oracle Support Services准备的。跟踪文件信息还用于调优应用程序和实例。
警报日志是按时间顺序记录的消息和错误日志,包括以下项目:
- 发生的所有内部错误(ORA-00600)、块损坏错误(ORA-01578)和死锁错误(ORA-00060)
- 管理操作,例如一些CREATE、ALTER和DROP语句以及STARTUP、SHUTDOWN和ARCHIVELOG语句
- 与共享服务器和调度程序进程的功能有关的消息和错误
- 物化视图自动刷新期间发生的错误
- 在数据库和实例启动时没有默认值的所有初始化参数的值
Oracle数据库使用警报日志记录这些操作,作为在操作员控制台上显示信息的替代方案(尽管有些系统也在控制台上显示信息)。如果操作成功,则在警报日志中写入一条“已完成”消息,以及一个时间戳。
警报日志同时以xml格式的文件和文本格式的文件进行维护。您可以使用任何文本编辑器查看警报日志的任何一种格式,也可以使用ADRCI实用程序查看去掉XML标记的XML格式版本的文件。
# 例如: [oracle@oracle4 /u01/app/oracle/diag/rdbms/orcl/orcl]$ adrci ADRCI: Release 19.0.0.0.0 - Production on Thu Nov 24 16:26:11 2022 Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved. ADR base = "/u01/app/oracle" adrci> show home ADR Homes: diag/rdbms/orcl/orcl adrci> show alert -tail 5; 2022-11-23 23:41:12.434000 +08:00 Please see the VKTM trace file for more details: /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_vktm_78871.trc 2022-11-24 11:38:26.145000 +08:00 Closing scheduler window Closing Resource Manager plan via scheduler window Clearing Resource Manager plan via parameter
复制
定期检查实例的警报日志和跟踪文件,以了解后台进程是否遇到错误。例如,当日志写入进程(LGWR)无法写入日志组的成员时,就会向LGWR跟踪文件和告警日志中写入错误消息,说明问题的性质。这样的错误消息意味着介质或I/O发生了错误,应该立即纠正。
Oracle数据库还将初始化参数的值写入警报日志,以及其他重要的统计信息。
警报日志和所有用于后台和服务器进程的跟踪文件被写入自动诊断存储库(ADR,Automatic Diagnostic Repository),其位置由DIAGNOSTIC_DEST初始化参数指定。跟踪文件的名称是特定于操作系统的,但是每个文件通常包括写入文件的进程的名称(如LGWR和RECO)。
SYS@orcl> show parameter diagnostic_dest; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ diagnostic_dest string /u01/app/oracle
复制
(2)控制告警日志的大小
要控制警报日志的大小,当不再需要该文件时,必须手动删除该文件。否则,数据库将继续追加到文件中。
您可以在实例运行时安全地删除警报日志,不过应该首先考虑制作它的存档副本。如果您将来遇到需要调查实例历史记录的问题,则此存档副本可能会很有价值。
(3)控制跟踪文件的大小
您可以使用初始化参数MAX_DUMP_FILE_SIZE来控制所有跟踪文件(不包括警报日志)的最大大小。
可通过以下方式设置该参数:
- 一个数值指定操作系统块的最大大小。指定的值乘以块大小就得到了限制。
- 后面带K、M或G后缀的数字以千字节、兆字节或千兆字节为单位指定文件大小。
- UNLIMITED是默认值,不指定限制。
Oracle数据库可以根据MAX_DUMP_FILE_SIZE初始化参数所指定的限制自动分割跟踪文件。当达到某个限制时,数据库将使用一个连续的编号重命名当前跟踪文件,并使用原始名称创建一个空文件。
下表描述了跟踪文件如何根据MAX_DUMP_FILE_SIZE的设置进行分段:
MAX_DUMP_FILE_SIZE | Setting Trace File Segmentation |
---|---|
UNLIMITED | 跟踪文件不进行分段。 |
大于15M | 跟踪文件分段的边界是MAX_DUMP_FILE_SIZE设置的1/5。如果跟踪文件的大小小于此边界,则不进行分段。例如,如果MAX_DUMP_FILE_SIZE设置为100M,则边界为20 MB (100 MB的1/5)。 |
小于等于15M | 跟踪文件不进行分段 |
最多可以有5个段,但是段的总大小不能超过MAX_DUMP_FILE_SIZE限制。当跟踪文件的所有段的总大小超过指定的限制时,将删除第一个段之后的最旧段,并创建一个新的空段。因此,跟踪文件总是包含最新的跟踪信息。第一个段没有被删除,因为它可能包含有关进程初始状态的相关信息。
分段改进了跟踪文件的空间管理。具体来说,分段使您能够以以下方式管理跟踪文件:
- 你可以清理掉不再需要的旧跟踪文件。
- 您可以使用较小的跟踪文件诊断问题,并隔离必须被事件打包服务(IPS,incident packaging service )打包的跟踪文件。
注意:不会删除涵盖包含事件的时间范围的任何区段。除了五个默认段之外,还会保留它。
(4)控制 Oracle 数据库何时写入跟踪文件
在ARCn后台进程的情况下,可以通过LOG_ARCHIVE_TRACE初始化参数来控制产生的跟踪信息的数量和类型。
其他后台进程没有这种灵活性。
每当发生严重错误时,就代表服务器进程编写跟踪文件。此外,设置初始化参数SQL_TRACE = TRUE将导致SQL跟踪工具为处理一个实例的所有SQL语句生成性能统计数据,并将它们写入自动诊断存储库。
您还可以请求为服务器进程生成跟踪文件。
无论SQL_TRACE初始化参数的当前值是多少,每个会话都可以使用SQL语句ALTER session SET SQL_TRACE代表关联的服务器进程启用或禁用跟踪日志记录。这个例子为特定的会话启用SQL跟踪功能:
# 1.启用sql跟踪功能 [root@OG1 ~]# sqlplus scott/tiger@orcl SQL> alter session set sql_trace true; Session altered. # 2.然后在该会话中执行一个sql语句 SQL> select * from emp; # 3.查看该会话对应的跟踪文件 SYS@orcl> select vp.tracefile from v$session vs join v$process vp on vs.paddr = vp.addr where vs.username = 'SCOTT'; TRACEFILE ---------------------------------------------------------------------------------------------------- /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_15919.trc # 查看对应跟踪文件是否有sql语句的记录 [oracle@oracle4 /u01/app/oracle/diag/rdbms/orcl/orcl/trace]$ more orcl_ora_15919.trc | tail CLOSE #139802043673144:c=0,e=0,dep=1,type=3,tim=122849016708 ===================== PARSING IN CURSOR #139802043704616 len=17 dep=0 uid=106 oct=3 lid=106 tim=122849016864 hv=1745700775 ad='62f34420' sqlid='a2dk8bdn0ujx7' select * from emp END OF STMT PARSE #139802043704616:c=3911,e=4571,p=0,cr=110,cu=0,mis=1,r=0,dep=0,og=1,plh=3956160932,tim=122849016864 EXEC #139802043704616:c=0,e=41,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=3956160932,tim=122849016938 FETCH #139802043704616:c=568,e=38309,p=6,cr=5,cu=0,mis=0,r=1,dep=0,og=1,plh=3956160932,tim=122849055333 FETCH #139802043704616:c=23,e=24,p=0,cr=2,cu=0,mis=0,r=13,dep=0,og=1,plh=3956160932,tim=122849057661 STAT #139802043704616 id=1 cnt=14 pid=0 pos=1 obj=73203 op='TABLE ACCESS FULL EMP (cr=7 pr=6 pw=0 str=1 time=38302 us cost=3 size=532 card=14)' # 从最后一行我们可以看到,sql查询对EMP表进行全表扫描,且该表有14行数据 # 4.禁用SQL跟踪功能 SQL> alter session set sql_trace false; Session altered.
复制
使用DBMS_SESSION或DBMS_MONITOR包来控制会话的SQL跟踪。
注意:用于服务器进程的SQL跟踪功能可能导致严重的系统开销,从而造成严重的性能影响,因此应该仅在收集统计信息时启用此功能。
(5)读取共享服务器会话的跟踪文件
如果启用了共享服务器,则使用调度程序的每个会话都被路由到共享服务器进程,只有在会话启用了跟踪(或遇到错误)时,才会将跟踪信息写入服务器跟踪文件。因此,要跟踪使用调度程序连接的特定会话的跟踪,您可能必须探查几个共享服务器跟踪文件。
为了帮助您,Oracle提供了一个命令行实用程序trcess,它将与用户会话相关的所有跟踪信息合并到一个地方,并按时间对信息进行排序。
2.使用服务器生成的警报监视数据库
(1)关于使用服务器生成的警报监视数据库
服务器生成的警报可能包含纠正问题的建议。当问题条件被清除时,也提供了通知。
当出现问题或当数据不符合指标的预期值时,警报会自动生成,例如:
- 每秒物理读取数
- 每秒用户提交数
- SQL服务响应时间
服务器生成的警报可以基于阈值级别,也可以仅仅因为事件发生而发出。基于阈值的警报可以在阈值警告和临界级别触发。这些级别的值可以是客户定义的值,也可以是内部值,有些警报具有默认的阈值级别,您可以在适当的时候更改这些阈值级别。例如,默认情况下,当空间使用率的百分比超过85%的警告或97%的临界阈值级别时,将为表空间使用情况生成服务器生成的警报。不基于阈值级别的警报示例有:
- 快照太旧
- 可恢复会话已挂起
- 恢复区空间使用情况
一个警报信息会发送到用户SYS拥有的预定义持久队列ALERT_QUE中。Cloud Control读取此队列,并提供有关未完成服务器警报的通知,有时还会建议纠正问题的操作。警报显示在云控制数据库主页上,可以配置为向选定的管理员发送电子邮件或寻呼机通知。如果告警无法写入告警队列,则会将该告警消息写入Oracle数据库的告警日志。
后台进程定期将数据刷新到自动工作负载存储库(Automatic Workload Repository),以捕获指标值的历史记录。警报历史表和ALERT_QUE由系统定期自动清除。
(2)设置和检索服务器生成警报的阈值
您可以使用DBMS_SERVER_ALERT PL/SQL包的SET_THRESHOLD和GET_THRESHOLD过程查看和更改服务器警报度量的阈值设置。
设置阈值级别
# 1.下面的例子展示了如何使用SET_THRESHOLD过程为一个实例的每个用户调用的CPU时间设置阈值: begin 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, 'orcl'); end; / PL/SQL procedure successfully completed.
复制
在本例中,当每个用户调用的CPU时间超过8000微秒时发出警告警报,当每个用户调用的CPU时间超过10,000微秒时发出紧急警报。参数描述如下:
- CPU_TIME_PER_CALL指定指标标识符。
- 观察时长设置为1分钟。此时间段指定在发出警报之前,条件必须偏离阈值的分钟数。
- 连续发生的次数设置为2。此数字指定在生成警报之前,指标值必须违反阈值的次数。
- 实例的名称设置为inst1
- 常量指定阈值设置的对象类型。在本例中服务器名为orcl
检索阈值信息
set serverouput on; 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, 'orcl'); 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; / Warning operator: 4 Warning value: 8000 Critical operator: 4 Critical value: 10000 Observation_period: 1 Consecutive occurrences:2 PL/SQL procedure successfully completed. # 您还可以使用视图检查特定的阈值设置。例如:DBA_THRESHOLDS SYS@orcl> col metrice_name for a20; SYS@orcl> col critical_value for a10; SYS@orcl> col warning_value for a10; SYS@orcl> col consecutive_occurrences for 99; SYS@orcl> set linesize 200; SYS@orcl> select metrics_name,warning_value,critical_value,consecutive_occurrences from dba_thresholds where metrics_name like '%CPU Time%'; METRICS_NAME WARNING_VA CRITICAL_V CONSECUTIVE_OCCURRENCES ---------------------------------------------------------------- ---------- ---------- ----------------------- CPU Time Per User Call 8000 10000 2
复制
二、监视性能
监视性能包括监视锁和等待事件以及查询一组数据字典视图。
1.监视锁
锁是防止访问相同资源的事务之间破坏性交互的机制。资源可以是用户对象(如表和行),也可以是用户不可见的系统对象(如内存中的共享数据结构和数据字典行)。
Oracle数据库在执行SQL语句时自动获取和管理必要的锁,所以您不需要关心这些细节。但是,数据库还允许您手动锁定数据。
当两个或多个用户正在等待彼此锁定的数据时,就会发生死锁。死锁会阻止一些事务继续工作。Oracle数据库自动检测死锁情况,并通过回滚死锁中涉及的一条语句来解决它们,从而释放一组冲突的行锁。
Oracle数据库是为避免死锁而设计的,而死锁并不常见。它们通常发生在事务显式覆盖数据库的默认锁定时。死锁会影响数据库的性能,因此Oracle提供了一些脚本和视图来监视锁。
# 1.创建锁的视图,catblock.sql SYS@orcl> @?/rdbms/admin/catblock.sql; # 2.运行脚本utllockt.sql,该脚本使用创建的视图以树的方式显示系统中等待锁的会话以及它们正在等待的锁。 SYS@orcl> @?/rdbms/admin/utllockt.sql;
复制
2.关于监视等待事件
等待事件是由服务器进程增加的统计信息,以指示它必须等待某个事件完成才能继续处理。会话可以出于各种原因等待,包括等待更多的输入,等待操作系统完成磁盘写入等服务,或者等待锁或闩锁。
当一个会话在等待资源时,它不会做任何有用的工作。大量的等待是一个值得关注的问题。等待事件数据揭露可能影响性能的各种问题症状,如锁存争用、缓冲区争用和I/O争用。
三、监视隔离的对象
对象隔离使Oracle数据库即使在存在损坏的、不可恢复的对象时也能正常工作。视图V$QUARANTINE包含有关隔离对象的信息。
1.关于对象隔离
对象隔离会隔离产生错误的对象,并监视该对象对系统的影响。
一些Oracle数据库错误,通常会导致进程终止,从而导致数据库终止。遇到此类错误时,对象隔离将尝试隔离导致错误的资源,以便数据库可以继续运行。该资源在内存中是隔离的,因此它不会影响数据库的其他部分。视图V$QUARANTINE存储关于当前隔离的对象的信息。
大多数数据库资源都可能引发错误,导致数据库终止。例如,库缓存内存对象可能引发这样的错误。
在多租户环境中,在某些情况下,多租户容器数据库(CDB)可以使用对象隔离来隔离并终止产生严重错误的可插入数据库(PDB),而不是终止CDB。
被隔离的资源通常保持隔离状态,直到数据库重新启动。如果针对CDB中的PDB隔离了资源,则将隔离该资源,直到关闭并重新打开PDB。