`
- 浏览:
108225 次
- 性别:
- 来自:
大连
-
转载连接:http://space.itpub.net/12932950/viewspace-718270
说明:正好学习到oracle的SGA,发现本文,讲解的非常细致。故转载此处,便于与大家分享。共同学习。
数据库在运行过程中,不可避免地要遇到各种能够导致数据库损坏的情况。比如突然断电、Oracle或者操作系统的程序bug导致数据库内部逻辑结构损坏、磁盘介质损坏等,都有可能造成数据库崩溃,从而导致数据丢失的现象发生。
为了避免,或者说为了修复这些状况所导致的数据丢失现象,Oracle引入了日志缓冲区和日志文件的概念。所谓日志,就是将数据库中所有改变数据块的操作,都原原本本地记录下来。这些改变数据块的操作不仅包括对数据表的DML命令或者引起数据字典内容变化的DDL命令,还包括对索引的改变、对回滚段数据块的改变等。只有将数据库中所有的变化都记录下来,当发生数据库损坏时,才能够通过重新应用这些变化,从而达到恢复数据库的目的。
既然是要记录,那就必然引出一个问题,就是如何记录这些变化?比较容易想到的有两种方式。
第一种是使用逻辑的记录方式,也就是用描述性的语句来记录整个变化过程。比如对于某个update更新操作来说来说,可以记录为两条语句:delete 旧值以及insert 新值。这种方式的优点是非常节省空间,因为对每个操作,只需要记录几条逻辑上的语句即可。但是缺点也很明显,就是一旦需要进行恢复,就会非常消耗资源。设想一下,某个update操作更新了非常多的数据块,由于buffer cache内存有限,很多脏数据块都已经写入了数据文件。但就在更新快结束时,突然发生断电,所做的更新丢失。那么重新启动实例时,Oracle需要应用日志文件里的记录,于是重新发出delete旧值以及insert新值的语句。这个过程需要重新查找数据文件中符合条件的数据块,然后再挑出来进行更新。这个过程将非常消耗时间,而且会占用大量的buffer cache。
第二种方式是使用物理的记录方式,也就是将每个数据块改变前的镜像和改变后的镜像都记录下来。这种方式优点就是恢复起来速度非常快,直接根据日志文件里所记录的数据块地址和内容更新数据文件中对应的数据块。但是缺点也很明显,就是非常占用磁盘空间。
而Oracle在记录日志的方式上,采用了逻辑和物理相结合的方式。也就是说,Oracle针对每个数据块,记录了插入某个值或者删除某个值的描述语句。假如某个update更新了100个数据块,则Oracle会针对每个数据块记录一对delete 旧值和insert 新值的语句,共有100对这样的描述语句。在每一对描述语句中,都记录了相关数据块的物理地址。通过这种逻辑与物理相结合的方式,Oracle在记录变化时能够尽量节省空间,同时在应用变化时,又能比较快速。
为了临时存放所产生的日志信息,Oracle在SGA中开辟了一块内存区域。这块区域就叫做日志缓冲区(log buffer),当满足一定条件以后,Oracle会使用名为LGWR的后台进程将log buffer中的日志信息写入联机日志文件里。
可以使用初始化参数log_buffer来设置日志缓冲区的大小,单位是字节。日志缓冲区会进一步细分为多个块,每个块的尺寸与操作系统的一个块的尺寸相同,基本都是512字节。
日志缓冲区只是日志信息临时存放的区域,这块区域是有限的,而且其中的每个块都是能够循环使用的。这也就说明,日志缓冲区中的内容必须要写入磁盘的文件里,才能永久保留下来,才能在数据库崩溃时能够用来进行恢复。这个文件就叫做联机日志文件。在每个日志缓冲区中的日志块被重用之前,其内容必然已经被写入了磁盘上的联机日志文件中。
联机日志文件就是日志缓冲区的完全副本,组成日志文件的每个日志块的内容都来自于日志缓冲区的日志块。每个日志缓冲区中的日志块都对应到日志文件中的一个日志块。日志缓冲区中的日志块按照发生的先后顺序,放入联机日志文件。
由于日志文件在故障恢复中的重要性,建议至少使用两个日志文件组成一个日志文件组。同一个日志文件组中的日志文件内容一模一样,因为日志缓冲区中的日志块同时会写入日志文件组中的每个日志文件中。每个数据库都必须至少拥有两个日志文件组。这是由于只要数据库一天不停止运行,就会不断产生日志信息,就会不断写入联机日志文件,联机日志文件总会有写满的时候。我们不可能让联机日志文件无限大,也不可能放无限多的联机日志文件,所以联机日志文件必须是循环使用的,在若干个日志文件中轮流的进行写入。一个日志文件写满以后转换到另外一个日志文件继续写的过程叫做日志切换(log switch)。
当一个联机日志文件写满时,可以选择将其归档为脱机日志文件,通常叫做归档日志文件。归档也就是副本,归档的过程也就是将写满的联机日志文件复制到预先指定的目录的过程。只有当一个联机日志文件完成归档以后,该联机日志文件才能够被再次循环使用。强烈建议在生产库中选择这种归档方式,只有在测试环境中可以选择不归档。
可以说,日志缓冲区和日志文件存在的唯一目的就是为了保证被修改的数据不会被丢失。反过来说,也就是为了能够在数据库崩溃的时候,可以用来将数据库恢复到崩溃的那个时间点上。这也就是说,只有将被修改的数据块的日志信息写入了联机日志文件以后,该被修改的数据块才可以说是安全的。如果日志信息在没有被写入日志文件时发生实例崩溃,这时对数据的修改仍将丢失。由此我们可以看出,将日志缓冲区中的日志信息写入日志文件是一个非常重要的过程,这个过程是由一个名为LGWR的后台进程完成的。LGWR 承担了维护系统数据完整性的任务,它保证了数据在任何情况下都不会丢失。
触发LGWR进程将日志缓冲区中的日志信息写入联机日志文件条件包括以下几种。
前台进程触发,包括两种情况。最显而易见的一种情况就是用户发出commit或rollback语句进行提交时,需要触发LGWR将内存里的日志信息写入联机日志文件,因为提交的数据必须被保护而不被丢失;另外一种情况就是在日志缓冲区中找不到足够的内存来放日志信息时,也会触发LGWR进程将一些日志信息写入联机日志文件以后,从而释放一些空间。
每隔三秒钟,LGWR启动一次。
在DBWn启动时,如果发现脏数据块所对应的重做条目还没有写入联机日志文件,则DBWn触发LGWR进程并等待LRWR写完以后才会继续。
日志信息的数量达到整个日志缓冲区的1/3时,触发LGWR。
日志信息的数量达到1MB时,触发LGWR。
查看日志缓冲区使用情况:
SELECT name, value FROM v$sysstat WHERE name IN ('redo entries','redo log space requests') --查看日志缓冲区的使用情况。\
查询出的结果可以计算出日志缓冲区的申请失败率:
申请失败率=requests/entries,申请失败率应该接近于0,否则说明日志缓冲区开设太小,需要增加ORACLE数据库的日志缓冲区。[/size][/size]
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
本文档将深入探讨Redo Log Buffer中缓冲日志写入磁盘的时机以及Redo日志文件的相关知识。 首先,关于Redo Log Buffer中的日志何时会写入磁盘,主要有四种时机: 1. 当写入Redo Log Buffer的日志量达到缓冲区总容量...
标题中的“201-logbuffer.rar”表明这是一个压缩文件,可能是某个项目、研究或系统配置的一部分,其中包含有关“logbuffer”的信息。在IT领域,日志缓冲区(log buffer)是一个重要的概念,特别是在系统管理和故障...
在数据库系统中,当我们对数据进行增删改操作时,...而文章结尾提到的“狸猫技术窝”的专栏和课程,也都是围绕着数据库技术深入讲解的系列,对于想要提升自己在数据库技术方面知识和技能的人来说,是非常有价值的资源。
### Oracle Buffer Cache 深入分析 #### 一、Buffer Cache 概念及重要性 Oracle 数据库的核心功能之一就是高效地管理和访问数据。而为了提高数据访问速度,Oracle 引入了一个重要的内存组件——Buffer Cache(数据...
本文将深入探讨`iobuffer`的原理、功能及应用场景,帮助开发者更好地理解和利用这个强大的工具。 一、ArrayBuffer基础 在理解`iobuffer`之前,我们首先需要了解ArrayBuffer。ArrayBuffer是JavaScript ES6引入的一...
在数据库管理领域,Buffer Pool是数据库系统中一个至关重要的组件,它主要用于缓存数据和索引页,以提高数据...通过深入理解redo log的工作机制,我们可以更好地理解和调整数据库的参数,以应对各种复杂的业务需求。
最后,对于有兴趣深入研究MySQL源码或是想要进一步了解redo log实现细节的开发者而言,了解redo log block的工作原理是理解整个redo log机制的基础。通过对redo log深入的分析和研究,开发者能够更好地解决实际工作...
【】19_buffer状态深入剖析【】20_使用各种SQL来熟知buffercache使用情况【】21_Oracle日志原理剖析【】22_Oracle日志核心意义_快速提交_写缓存【】23_logbuffer相关设置【】24_PGA内存作用和构成【】25_P ...
首先,让我们深入理解如何自定义日志文件名。默认情况下,Log4j的日志文件名通常是固定的或者基于时间戳生成的。然而,我们可以创建一个自定义的`org.apache.log4j.FileAppender`子类来覆盖默认行为。这个子类可以...
Oracle内存主要分为系统全局区(SGA)和程序全局区(PGA),其中SGA又包含数据缓冲区(Data Buffer Cache)、日志缓冲区(Redo Log Buffer)和共享池(Shared SQL Pool)。数据缓冲区是SGA中最重要的部分,也就是Buffer Cache...
根据提供的文件信息,我们可以深入探讨Log4j框架的配置与最佳实践。Log4j是一个流行的Java日志框架,被广泛应用于各种规模的应用程序中。它提供了灵活的日志记录功能,可以方便地定制日志级别、格式及输出目标等。...
1. **异步日志记录**:log4net支持异步Appender,通过配置`bufferSize`和`immediateFlush`属性,可以在不影响应用程序性能的情况下批量写入日志。 2. **日志重定向**:通过`Hierarchy.Root.Reconfigurable`属性,...
log_buffer是redo log buffer的内存分配量,对于其大小的设置,需考虑redo log的触发事件,主要包括: 1. redo log buffer占用量达到1/3 2. 设定的时间间隔(通常为3秒) 3. redo log buffer中重做日志数据量达到1...
Log Buffer是一个循环使用的内存区域,LGWR(Log Writer Process)进程负责将Log Buffer中的记录写入Redo Log文件中。LGWR进程会在以下情况下触发写操作: 1. 当一个事务提交(COMMIT)时。 2. 每隔3秒,即使没有事务...
本文将深入探讨这个库的核心功能、应用场景以及使用方法。 Buffer对象在Node.js中被广泛使用,它是一个二进制数据容器,可以用来存储和操作非文本数据,如图片、音频或视频流。然而,原生Buffer对象在处理不同宽度...
- **调整Log Buffer大小**:适当增大Log Buffer的大小可以减少LGWR进程的写入频率,从而降低IO负载。 - **避免频繁的小写操作**:尽量减少频繁的写入小量数据的操作,因为这会增加LGWR的写入次数。 **2.3 数据文件...
- **批量写入**:日志先缓冲在Redo Log Buffer中,待需要时批量写入磁盘,降低频繁的磁盘写入操作。 - **并发控制**:多个事务共享Redo Log空间,按照语句执行顺序交替记录,避免竞争,提高并发性能。 5. **日志...
vsnprintf(logBuffer, sizeof(logBuffer), fmt, args); qApp->processEvents(); MainWindow *mainWindow = dynamic_cast*>(qApp->activeWindow()); if (mainWindow) { mainWindow->logArea()->append(QString::...
- 当redo log buffer达到一定阈值(如大小的三分之一、1MB、超过三秒或在发生检查点时)或在dbwr之前,会触发LGWR进程将redo log buffer的数据写入磁盘上的redo file文件中。 - 此过程会产生log file sync等待事件...
本教程将通过一个名为"LogTest"的示例,深入解析Log4j的日志处理机制。 **1. Log4j架构** Log4j由三个主要部分构成:Logger(日志器)、Appender(输出器)和Layout(布局)。Logger负责记录日志信息,Appender...