深入解析Oracle数据库日志内容,掌握关键信息 (oracle数据库日志内容)

Oracle数据库作为一种高性能的关系型数据库管理系统,被广泛运用于各行各业的数据管理和处理,其在实际应用中具有重要的意义。但是在数据库操作过程中,难免会出现各种各样的问题和错误,如何追踪和解决这些问题,就需要通过查看数据库日志文件来获得关键信息。

数据库日志是数据库管理系统在工作过程中,自动生成的一种记录了数据库活动情况的信息记录文件。这些日志记录包括错误日志、事务日志、归档日志等等。这些日志记录非常重要,可以方便用户进行故障排除、日常运维以及性能分析等工作。

在Oracle数据库中,有两种主要日志类型:重做日志和归档日志。重做日志主要用于记录每一次的数据库更改操作,并在数据库出现故障时进行恢复;归档日志则是对数据库内容的全量备份,通常用于备份数据库和恢复整个数据库。

那么,如何深入解析Oracle数据库的日志内容,掌握关键信息?下面,我们将从以下几个方面进行探讨:

1、在Oracle数据库中查看日志文件

在Oracle数据库中,可以通过以下几种方式来查看日志文件:

(1)使用日志文件文件名称

可以直接使用日志文件的文件名称进行查看:

SQL> select * from v$log_file;

(2)使用redo日志组

使用redo日志组就需要按照redo日志的组编号来进行查询,查看当前正在使用的redo日志:

SQL> select * from v$log;

2、查看日志文件中的错误信息

数据库日志文件中尤其是错误日志等,对于定位故障和解决问题至关重要。在日常运维中需要经常留意并进行监控。查看错误日志的方式有以下两个:

(1)查看数据库的日志文件

可以使用以下命令来查看错误日志:

SQL> show parameter background_dump_dest

可以查看到错误日志所在的路径

SQL> host cd /u01/app/oracle/diag/rdbms/orcl/ORCL/trace

SQL> ls -l *trc

(2)使用Oracle的内置工具

Oracle数据库提供了一个内置工具 – 追踪信息工具,通过该工具可以查看数据库中的错误日志以及其它信息,使用方法如下:

SQL> alter session set events ‘10046 trace name context forever, level 12’;

使用这个命令后,会将系统的所有SQL语句都输出到日志文件中。可以通过 “write trace” 文件查看,其中包含了足够详细的SQL执行信息、错误信息等等。

3、查看数据库中的事务日志

事务日志是记录事务的变化的日志。每当一个事务被更改时,Oracle便会在它的事务日志文件中用log操作记录这个变化,用于恢复和回滚。查看数据库中事务日志的信息,可以通过以下两种方法:

(1)使用Oracle的内置函数

可以使用oracle内置函数 dbms_flashback_transactions来查看数据库中的事务日志,例如:

SQL> set serveroutput on

SQL> declare

v_transaction_id raw(8);

begin

v_transaction_id := ‘0F02023008000001’;

dbms_output.put_line(‘Transaction Id:’ || utl_raw.cast_to_varchar2(v_transaction_id));

dbms_flashback_transactions.get_transaction_info(transaction_id => v_transaction_id);

end;

/

(2)使用第三方工具

通常,Oracle数据库的管理人员会使用第三方工具来进行对Oracle数据库日志文件的分析,以便获得更为详细的日志信息。比如,常用的工具有 Quest Central for Oracle 、Toad for Oracle等等。

在分析Oracle数据库日志时,需要了解日志文件的结构,掌握常见的错误信息和日志记录等,以便更快地定位问题和解决问题。同时,在维护和管理Oracle数据库时,需要注重日志记录的推送和备份,以及对备份文件进行安全控制。

深入解析Oracle数据库日志内容是Oracle数据库管理人员必须具备的技能之一,能够帮助用户更快速、更准确地定位问题并解决问题,保证数据库的正常运行。

相关问题拓展阅读:

oracle数据库的警告日志如何查看

‍测试环境中出现了一个异常的告警现象:一条告警通过 Thanos Ruler 的 HTTP 接口观察到持续处于 active 状态,但是从 AlertManager 这边看这条告警为已解决状态。按照 DMP 平台的设计,告警已解决指的是告警上设置的结束时间已经过了当前时间。一条发送至 AlertManager 的告警为已解决状态有三种可能:1. 手动解决了告警2. 告警只产生了一次,第二次计算告警规则时会发送一个已解决的告警3. AlertManager 接收到的告警会带着一个自动解决时间,如果还没到达自动解决时间,则将该时间重置为 24h 后首先,因为了解到测试环境没有手动解决过异常告警,排除之一条;其次,由于该告警持续处于 active 状态,所以不会是因为告警只产生了一次而接收到已解决状态的告警,排除第二条;最后,告警的告警的产生时间念乱与自动解决时间相差不是 24h,排除第三条。那问题出在什么地方呢?

分析

下面我们开始分析这个问题。综合之一节的描述,初步的猜想是告警在到达 AlertManager 前悉含的某些阶段的处理过程太长,导致告警到达 AlertManager 后就已经过了自动解决时间。我们从分析平台里一条告警的流转过程入手,找出告警在哪个处理阶段耗时过长。首先,一条告警的产生需要两方面的配合:

metric 数据

告警规则

将 metric

数据输入

到告警规则进行计算,如果符合条件则产生告警。DMP 平台集成了 Thanos 的相关组件,数据的提供和计算则会分开,数据还是由 Prometheus Server 提供,而告警规则的计算则交由 Thanos Rule(下文简称 Ruler)处理。下图是 Ruler 组件在集群中所处的位置:

看来,想要弄清楚现告警的产生到 AlertManager 之间的过程,需要先弄清除 Ruler 的大致机制。官方文档对 Ruler 的介绍是:You can think of Rule as a simplified Prometheus that does not require a sidecar and does not scrape and do PromQL evaluation (no QueryAPI)。

不难推测,Ruler 应该是在 Prometheus 上封装了一层,并提供一些额外的功能。通过翻阅资料大致了解,Ruler 使用 Prometheus 提供的库计算告警规则,并提供一些额外的功能。下面是 Ruler 中告警流转过程:

请点击输入图片描述

请点击输入图片描述

首先,图中每个告警规则 Rule 都有一个 active queue(下面简称本地队列),用来保存一个告警规则下的活跃告警。

其次,从本地队列中取出告警,发送至 AlertManager 前,会被放入 Thanos Rule Queue(下面简称缓冲队列),该缓冲队列有两个属性:

capacity(默认值为 10000):控制缓冲队列的大小,

maxBatchSize(默认值为 100):控制单次发送到 AlertManager 的更大告警数

了解了上述过程,再通过翻阅 Ruler 源码发现,一条告警在放入缓冲队列前,会为其设置一个默认的自动解决时间(当前时间 + 3m),这里是影响告警自动解决的开始时间,在这以后,有两个阶段可能影响告警的处理:1. 缓冲队列阶段2. 出缓冲队列到 AlertManager 阶段(

网络延迟

影响)由于测试环境是局域网环境,并且也没在环境上发现网络相关的问题,我们初步排除第二个阶段的影响,下面我们将注意力放在缓冲队列上。通过相关源码发现,告警在缓冲队列中的处理过程大致如下:如果本地队列中存在一条告警,其上次发送之间距离现在超过了 1m(默认值,可修改),则将该告警放入缓冲队列,并从缓冲队列中推送最多 maxBatchSize 个告警发送至 AlertManager。反之,如果所有睁高笑本地队列中的告警,在最近 1m 内都有发送过,那么就不会推送缓冲队列中的告警。也就是说,如果在一段时间内,产生了大量重复的告警,缓冲队列的推送频率会下降。队列的生产

方太

多,消费方太少,该队列中的告警就会产生堆积的现象。因此我们不难猜测,问题原因很可能是是缓冲队列推送频率变低的情况下,单次推送的告警数量太少,导致缓冲队列堆积。下面我们通过两个方面验证上述猜想:首先通过日志可以得到队列在大约 20230s 内推送了大约 2023 次,即平均 10s 推送一次。结合缓冲队列的具体属性,一条存在于队列中的告警大约需要 (capacity/maxBatchSize)*10s = 16m,AlertManager 在接收到告警后早已超过了默认的自动解决时间(3m)。其次,Ruler 提供了 3 个 metric 的值来监控缓冲队列的运行情况:

thanos_alert_queue_alerts_dropped_total

thanos_alert_queue_alerts_pushed_total

thanos_alert_queue_alerts_popped_total

通过观察 thanos_alert_queue_alerts_dropped_total 的值,看到存在告警丢失的总数,也能佐证了缓冲队列在某些时刻存在已满的情况。

解决通过以上的分析,我们基本确定了问题的根源:Ruler 组件内置的缓冲队列堆积造成了告警发送的延迟。针对这个问题,我们选择调整队列的 maxBatchSize 值。下面介绍一下这个值如何设置的思路。由于每计算一次告警规则就会尝试推送一次缓冲队列,我们通过估计一个告警数量的更大值,得到 maxBatchSize 可以设置的最小值。假设你的业务系统需要监控的实体数量分别为 x1、x2、x3、…、xn,实体上的告警规则数量分别有 y1、y2、y3、…、yn,那么一次能产生的告警数量最多是(x1 * y2 + x2 * y2 + x3 * y3 + … + xn * yn),最多推送(y1 + y2 + y3 + … + yn)次,所以要使缓冲队列不堆积,maxBatchSize 应该满足:maxBatchSize >= (x1 * y2 + x2 * y2 + x3 * y3 + … + xn * yn) / (y1 + y2 + y3 + … + yn),假设 x = max(x1,x2, …,xn), 将不等式右边适当放大后为 x,即 maxBatchSize 的最小值为 x。也就是说,可以将 maxBatchSize 设置为系统中数量更大的那一类监控实体,对于 DMP 平台,一般来说是 MySQL 实例。

注意事项

上面的计算过程只是提供一个参考思路,如果最终计算出该值过大,很有可能对 AlertManager 造成压力,因而失去缓冲队列的作用,所以还是需要结合实际情况,具体分析。因为 DMP 将 Ruler 集成到了自己的组件中,所以可以比较方便地对这个值进行修改。如果是依照官方文档的介绍使用的 Ruler 组件,那么需要对源码文件进行定制化修改。

‍‍

告警日志文件是一类特殊的跟踪文件(trace file)。告警日志文件命名烂察一般为alert_.log,其中SID为ORACLE数据库脊历空实例名称。数据库告警日志是樱瞎按时间顺序记录message和错误信息。

什么是oracle 日志文件

重做日志redo

log

file是lgwr进程从oracle实例中的redo

log

buffer写入的,是循环利用的。就是说一个redo

log

file(group)

写满后,才写下一个。

归档日志archive

log是当数据库运行在归脊返档模式下时,一个redo

log

file(group)写满后,由arcn进程将重做日志的内容备份到归档日志文件下,然后这个redo

log

file(group)才能被下一次使用。

不管数据库是否是归档模式,重做日志是肯定要写的。而只有数据库在归档模式下,重做日志才会备份,形成归档日志。

一般来说,归档日志结合全备份,用于数据库出现问题后的恢复使用。

重滚野姿做日志是循环使用的。比如说,有三个重做日志组a、b、c。那么,当a写满后,系统就调用arcn进程,将a备份为归档日志,同时b已经开始使用了。

假设你只有两个组a、b,如果某种情况下,a正在备份,未结束,还不能继续使用,而b也写满了,这个时候,数据库就会出现挂起的情况。所以一般情况下,重做日志更好是三个组或者再多一点,而且大小要适当。

实际上,一个重做日志组满了后,就开始写入归档日志。不是等abc都写满了,再归档,这样肯定就是出现挂起的情况了,oracle不是这样的,归档日志和重做日志都是物理上的文件,只是存放的目录不同,而且重做日志的文件名不变,而归档日志的文件名是备份时系统生成的。

重做日志备份为归档日志后,系统就会把重做日志的内大绝容清空,但文件依然存在,准备下一次使用。

重做日志纪录了你所有做过的dml语句,重做日志循环使用,写满一轮后就要覆盖前面的。如果你是用热备模式,当重做日志写满一个后就将内容写入归档日志,以备将来恢复数据用。

只有数据库运行在归档模式并且初始化参数archive_log_start等于true时,arcn进程才能被启动,进行自动归档。

如果数据库运行在归档模式但archive_log_start等于false时,需要dba手工归档。

重做日志文件也叫联机日志文件,一般数据库有几个日志文件(例如有三个,编号分别为1,2,3)先写1,当1满时再写2,当2满时再写3,当3满时1就归

档出来,产生一个文件写到磁盘上,这个文件就叫归档日志文件.1归档出来后,新的联机日志文件又写到1中,将原来的覆盖,(即联机日志是循环使用的).一

般当产生一个检查点或联机日志写满一定程度时会产生一个归档日志文件.

oracle数据库日志内容的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于oracle数据库日志内容,深入解析Oracle数据库日志内容,掌握关键信息,oracle数据库的警告日志如何查看,什么是oracle 日志文件的信息别忘了在本站进行查找喔。


数据运维技术 » 深入解析Oracle数据库日志内容,掌握关键信息 (oracle数据库日志内容)