Oracle数据库的实用型的表现

数据库 Oracle
以下的文章主要是描述Oracle数据库是如何通过Redo来确保相关数据库的事务能被重演的实际操作步骤,以下就是正文的详细内容的介绍。

Oracle是通过Redo来确保数据库的事务能被重演,只有这样才能使得在出现故障之后,相关的数据才可以被恢复。所以Redo对于Oracle数据库来说是至关重要。在数据库中,Redo的功能主要通过3个组件来实现:Redo Log Buffer、LGWR后台进程和Redo Log File(在归档模式下,Redo Log File最终会写出为归档日志文件)。

在Oracle的SGA中,存在一块共享内存,称为Redo Log Buffer,如图6-1所示。

Redo Log Buffer位于SGA之中,是一块循环使用的内存区域,其中保存Oracle数据库变更的相关信息。这些信息以重做条目(Redo Entries)形式存储(Redo Entries也经常被称为Redo Records)。Redo Entries包含重构、重做数据库变更的重要信息,这些变更包括INSERT、UPDATE、DELETE、CREATE、ALTER或者DROP等。在必要的时候Redo Entries被用于数据库恢复。

Redo Entries的内容被Oracle数据库进程从用户的内存空间复制到SGA中的Redo Log Buffer之中。Redo Entries在内存中占用连续的顺序空间,由于Redo Log Buffer是循环使用的,Oracle通过一个后台进程LGWR不断地把Redo Log Buffer的内容写出到Redo Log File中。

 当用户在Buffer Cache中修改数据时,Oracle并不会立即将修改数据写出到数据文件上,因为那样做效率会很低,到目前为止,计算机系统中最繁忙的部分是磁盘的I/O操作,Oracle这样做的目的是为了减少IO的次数,当修改过的数据达到一定数量之后,可以进行高效地批量写出。

大部分传统数据库(当然包括Oracle)在处理数据修改时都遵循no-force-at-commit策略。也就是说,在提交时并不强制写。那么为了保证数据在数据库发生故障时(例如断电)可以恢复,Oracle引入了Redo机制,通过连续的、顺序的日志条目的写出将随机的、分散的数据块的写出推延。

这个推延使得数据的写出可以获得批量效应的性能提升。

同Redo Log Buffer类似,Redo Log File也是循环使用的,Oracle允许使用最少两个日志组。缺省情况下,Oracle数据库创建时会建立3个日志组。

  1. SQL> select group#,members,status from v$log;  
  2. GROUP# MEMBERS STATUS  
  3. INACTIVE  
  4. CURRENT  
  5. INACTIVE 

当一个日志文件写满之后,会切换到另外一个日志文件,这个切换过程称为Log Switch。Log Switch会触发一个检查点,促使DBWR进程将写满的日志文件保护的变更数据写回到数据库。在检查点完成之前,日志文件是不能够被重用的。

由于Redo机制对于数据的保护,当Oracle数据库发生故障时,Oracle就可以通过Redo重演进行数据恢复。那么一个非常重要的问题是,恢复应该从何处开始呢?

如果读取的Redo过多,那么必然导致恢复的时间过长,在生产环境中,我们必需保证恢复时间要尽量得短。Oracle通过检查点(Checkpoint)来缩减恢复时间。回顾一下第1章中所提到的内容:检查点只是一个数据库事件,它存在的根本意义在于减少恢复时间。

当检查点发生时(此时的SCN被称为Checkpoint SCN)Oracle会通知DBWR进程,把修改过的数据,也就是此Checkpoint SCN之前的脏数据(Dirty Buffer)从Buffer Cache写入磁盘,在检查点完成后CKPT进程会相应地更新控制文件和数据文件头,记录检查点信息,标识变更。

在检查点完成之后,此检查点之前修改过的数据都已经写回磁盘,重做日志文件中的相应重做记录对于崩溃/实例恢复不再有用。如果此后数据库崩溃,那么恢复只需要从***一次完成的检查点开始恢复即可。如果Oracle数据库运行在归档模式(所有生产数据库,都建议运行在归档模式),日志文件在重用之前必须写出到归档日志文件,归档日志在介质恢复时可以用来恢复数据库故障。

【编辑推荐】

  1. Oracle数据库的异构服务原理描述
  2. Oracle使用hints的调整机制实操
  3. Oracle移植到mysql中,应注意的事项
  4. 对联机备份Oracle数据的解剖
  5. 在Oracle数据库中使用PL操作COM对象
责任编辑:佚名 来源: 博客园
相关推荐

2022-06-15 15:23:03

实用型代币加密货币以太坊

2019-12-19 11:19:02

区块链实用型Linux

2010-04-09 19:08:31

2009-12-16 13:48:06

Ruby Web开发框

2018-12-12 19:10:01

Oracle数据库自动备份

2012-06-27 14:04:20

宏碁投影机

2010-05-11 18:23:31

MySQL数据库分区

2010-06-13 10:46:52

MySQL 数据库

2011-10-27 14:40:24

笔记本评测

2012-06-19 13:51:20

飞利浦传真机

2010-06-17 13:34:47

SQL Server数

2010-04-14 08:49:43

Oracle数据库系统

2010-04-28 10:45:24

Oracle10g

2011-06-15 10:10:17

Oracle11g

2010-04-14 15:30:41

Oracle数据库

2015-06-08 13:48:15

数据库数据完整性约束表现

2018-06-07 08:31:33

Oracle分布式内存

2010-04-22 17:36:51

Oracle数据库

2011-07-22 09:58:18

Oracle数据库优化策略

2010-04-09 10:32:03

Oracle 数据库
点赞
收藏

51CTO技术栈公众号