
Online RedoLog Manage
联机在线重做日志工作原理
数据库使用过程中,可能会出现断电、死机等意外情况,利用重做日志文件,在数据库发生故障时,可以重新处理事务。每个事务在处理的同时也会被写入重做日志缓冲区,然后由LGWR进程写入到重做日志文件。这样,如果发生介质故障,重做日志文件将提供恢复进制,但也存在例外情况。例如,在启用NOLOGGING字句的情况下,对象中的直接加载插入。
重做日志文件用来在例程失败等情况下恢复尚未写入数据文件,但是已经提交的数据。重做日志文件只用于恢复。
①重做日志结构:
·记录对数据所做的所有更改
·提供恢复机制
·可以划分为组
·至少需要两个组
日志组(Redo Log Group)是一组相同的重做日志文件副本称作重做日志组,LGWR后台进程向组内所有联机重做日志文件并发写入相同信息,为了保证数据库正常操作,Oracle服务器最少需要两个联机重做日志文件组。属于同一日志组的每个日志文件被称为日志成员,并且同一个日志文件组的不同日志成员互为镜像,即组内的每个成员都有相同的日志序列号和同样的大小。Oracle服务器每次写入日志组时,都分配一个日志序列号以唯一地标识每个重做日志文件。当前日志序列号存储在控制文件和所有数据文件的头部。
假定数据库包含3个日志组,初始阶段后台进程LGWR将事务变化写入日志组1的两个成员中,在日志组1写满后,LGWR进程切换到日志组2,并将事务变化写入到日志组2的两个成员中;在日志组2写满后,LGWR进程切换到日志组3,并将事务变化写入到日志组3的两个成员中。当日志组3写满后,LGWR又切换到日志组1,并将事务变化写入到日志组1。以上过程说明所有事务变化都可以通过日志组予以保留。这样,即使将来出现实例失败或介质失败时,DBA将会使用这些已经保留下来的事务变化进行实例恢复或介质恢复,最终可以确保Oracle不会出现数据丢失。
②日志序列号和日志切换
Oracle服务将对数据库所做的所有更改按顺序记录到重做日志缓冲区中。LGWR进程把重做条目将重做日志缓冲区写入联机重做日志组的其中一个组,该组叫做当前重做日志组。
LGWR进程在以下情况写入:
·当提交事务时
·当重做日志缓冲区被写满了1/3时
·当重做日志缓冲区内的已更改记录超过1MB时
·每隔3秒
在DBWn将数据库缓冲区中修改的块写入数据文件之前:
重做日志文件以循环方式使用,每个重做日志文件组用一个递增日志序列号来标识,每次重新使用日志时就会覆盖原来的序列号。
LGWR按顺序向联机重做日志文件写入重做信息。一旦当前联机重做日志文件组被写满,LGWR就开始写入下个组,这叫做日志切换。
日志切换时,Oracle服务器进行如下任务:
(ALTER SYSTEM SWITCH LOGFILE)
· 日志序列号自动+1,并将日志序列号联通SCN信息写入到控制文件的日志历史记录中。
· 促使CKPT进程发出检查点,从而使得后台CKPT将检查点时刻的SCN信息写入到控制文件和数据文件头部,并促使后台进程DBWR将数据高速缓存中的脏缓冲区写入到数据文件中。
· 当数据库处于ARCHIVELOG模式时,日志切换还会促使ARCH进程开始归档。③检查点
检查点是一个数据库事件,它用于同步所有数据文件、控制文件以及重做日志文件。当后台进程CKPT发出检查点时,会执行以下两个任务:
A:后台进程CKPT会修改控制文件和数据文件头部,并将当前SCN信息写入到这两种文件中,从而使得数据文件、控制文件和重做日志处于一致状态。
B:当后台进程CKPT工作时,同时使得后台进程DBWR开始工作,并且将数据库高速缓存区中的脏缓冲区写入到数据文件中,DBWn写入的缓冲区中数量是由FAST_START_MTTR_TARGET参数决定的(如果已指定)缺省值为0。
检查点发生情况:
·每次日志切换时
·当使用NORMAL、TRANSACTIONAL、IMMEDIATE选项关闭例程时。
·通过设置初始化参数FAST_START_MTTR_TARGET强制执行时
·数据库管理员通过手动方式请求时
· ALTER TABLESPACE(OFFLINE NORMAL | READ ONLY | BEGIN BACKUP)命令导致对特定数据文件执行检查点操作时。
④日志管理策略
规划重做日志配置时,考虑的点:
A:重做日志组的个数
某些情况下,数据库实例可能只需要两个组。在其他情况下,数据库实例 可能需要更多的组以保证各个组始终可供LGWR进程使用。例如,如果跟 踪文件或警告文件出现消息Checkpoint no complete或Redo Log G roup not archived,表明LGWR经常不得不因为检查点操作尚未完成或 者日志组尚未归档而等待,就需要添加组。
B:多元备份重做日志文件
重做日志文件对于数据库正常运作和维护都是至关重要的,因此建议创建 复合重做日志文件来提高重做日志的可靠性。即一个重做日志组中包含多 个相互镜像的重做日志成员。
C:重做日志文件的位置
对联机重做日志文件进行多元备份时,应将组内的成员放置在不同磁盘 上。这样,即使一个成员不可用而其他成员可用,该实例也不会关闭。将 归档日志文件和联机重做日志文件分放在不同磁盘上,以减少ARCN和LG WR后台进程之间的证用。数据文件和联机重做日志文件应当放置在不同 的磁盘上以减少LGWR和DBWn的争用,并降低发生介质故障时同时丢失 数据和联机重做日志文件的风险。
D:重做日志文件的大小
联机重做日志文件最小为50kb,最大文件大小视操作系统而定。假定日志 文件组尺寸很小(500kb),那么可能会导致日志切换非常频繁,间接地增 加检查点次数,从而降低系统性能。假定日志组尺寸很大(100M),那 么出现意外情况时很可能导致实例恢复的事件很长。
如果Oracle处于ARCHIVELOG模式,还要考虑存放归档日志的存储介质(磁带或磁盘),以使得存储介质剩余空间最小。
影响联机重做日志的配置
日志切换和检查点的数量
重做记录的量和个数
存储介质的空间量。例如启动归档时磁带上的空间量
联机重做日志操作
Oracle中,事务对数据库所做的修改将以重做记录的形式保存在重做日志缓冲区中。在提交事务时,由LGWR进程将缓存区中该事务相关的重做记录全部写入重做日志文件,这时,事务认为已经成功提交。这种机制称为“快速提交”。
通常,DBA会在创建数据库时按照计划创建所需重做日志组和各个组成员文件。然而在有些情况下,会需要通过手工方式为数据库添加重做日志组和成员。例如,如果当前某个重做日志组由于某种原因无法使用,DBA需要创建一个新的重做日志组来代替它进行工作。在另外些情况下,DBA可能会需要改变现有重做日志文件的名称和位置,或者删除重做日志组或成员。
①添加日志组
创建一个新的联机重做日志文件组。
alter database [database] add logfile [group interger] filespec [,[group integer] filespec]
可以通过文件说明来指定成员名称和位置,也可以选择每个重做日志文件组的group参数值。如果省略了该参数,Oracle服务器自动生成其值。
Example:为Oracle Server增加一个重做日志组,组中包含两个成员,大小为4MB,并查询动态性视图确认增加。
Step1:管理员身份登录

Step2:创建新日志组

Step3:查询动态性能性

由于没有指定group字句,这时Oracle将自动为新建的重做日志组设置组号,一般是当前组后之后递增,因为当前数据库已经包含了3个日志组。因此,新日志组组号4,其中包含两个成员,是重做日志组成员所在的路径和名称,SIZE 4M代表每个成员的大小是4MB,v$LOGFILE视图包含了重做日志组中所有成员文件的基本信息。
Method:显式指定组号:

②添加成员
有时,DBA可能需要为已有的重做日志组添新的成员日志文件。
命令:alter database [database] add logfile member [‘filename’ [REUSE] TO {GROUP integer|(‘filename’[,’filename’]…)} ]
Example:为Oracle Server的第四个重做日志组增加一个成员
Step1:管理员身份登录

Step2:添加新的成员


③删除日志
如果某个重做日志组不再需要使用,可以将整个重做日志组删除。删除一个重做日志组时,其他成员日志文件都被删除。在删除重做日志组之前,首先考虑以下问题:
·无论组中有多少员,一个数据库至少需要使用两个重做日志组。
·只能删除处于INACTIVE状态的重做日志组,如果要删除CURRENT状态的重做日志组,必须执行一次手工日志切换,将它切换到INACTIVE状态。
· 如果数据库处于归档模式下,在删除重做日志组之前,必须确定它已经被归档。
因此,在删除重做日志组之前,必须通过查询v$log动态性能视图来获取各个工作日志组的状态。

命令:
alter database [database] drop logfile {group integer|(‘filename’[,’filename’]…))[,{group integer|(‘filename’[,’filename’]…)}]…
Example:删除日志组3

若要增大/减少联机重做日志文件组的大小,需添加新的联机重做日志文件组(具有新的大小),然后删除旧组。
除了需要删除重做日志组外,更为常见的情况是仅需删除重组日志组中某个成员日志文件。例如,由于存放日志文件的硬盘发生物理损坏,为防止ORACLE继续写入已经损坏的重做日志文件,则需要将它从重做日志组中删除。如果要删除一个或多个待定的联机重做日志文件成员,可使用下面的alter database drop logfile member命令。
命令:
alter database [database] drop logfile member
‘filename’[,’filename’]…
Example:删除日志组4的第3个日志组成员


④清除日志
在数据库运行过程中,联机重做日志文件可能会因为某些原因而损坏。如果出现这种情况,数据库最终会由于无法将损坏的重做日志文件归档而停止。如果发生这种情况,可以在不关闭数据库情况下,手工清空损坏的重做日志文件的内容,以避免出现停止运行的情况。
清空重做日志文件就是将重做日志文件中的内容全部初始化,相当于删除该重做日志文件,然后各方面重建它。即使数据库只拥有两个重做日志组,或者要清空的重做日志组是当前的日志组,都可以成功执行清空操作。
Example:清空日志组4
Step1:管理员身份登录:

Step2:清空日志组:

·执行上述命令后,Oracle会自动将日志组4中的重做日志文件全部初始化。但是,如果日志组4尚未归档,则必须指定unarchived字句。
·命令:alter database clear unarchived logfile group 4;
·指定unarchived字句后,Oracle将避免对4号日志组进行归档。
⑤查询日志文件
Method1:

Method2:

重做日志的归档
Oracle数据库可运行在ARCHIVELOG模式和NOARCHIVELOG模式两种模式下。NOARCHIVELOG模式只能用于保护实例失败,而不能用于保护介质失败。为了避免数据库物理文件损坏而引起的数据丢失,数据库可运行在ARCHIVELOG模式,即归档模式。
1、归档日志的作用
Oracle能够将已经写满的重做日志文件在被覆盖之前保存到指定位置上,被保存的重做日志文件的集合称为“归档重做日志“,该操作过程称为”归档”。归档操作可由ARCH后台进程自动完成,也可由DBA手工完成。
归档好处:
·恢复:数据库备份连同联机重做日志文件和归档重做日志文件可共同确保恢复所有已经提交的事务处理。
·备份:可在数据库打开时执行备份。
在NOARCHIVELOG模式下,每次联机重做日志文件已满并且发生日志切换时,都要覆盖原来联机重做日志文件。直到对重做日志文件组的检查点操作完成后,LGWR才覆盖该重做日志文件组。
如果数据库配置为ARCHIVELOG模式运行下,那么必须将已满的联机重做日志文件的不活动(INACTIVE)组归档。因为对数据库所做的所有更改都记录在联机重做日志文件内,数据库管理员可以使用数据库物理备份和归档的联机重做日志文件恢复数据库,而不会丢失任何已提交数据。
2、设置日志归档
①查看数据库的日志操作模式:

Example:
查看数据库日志操作模式,并且将数据库修改为归档模式
Step1:
停止Oracle Server并装载数据库(数据库处于MOUNT状态下才能修改日志操作模式,所以必须停止Oracle Server,然后装载数据库。关闭时不能使用ABORT。)

Step2:
修改日志操作模式并打开数据库

Step3:
查看数据库的归档模式

注意:修改日志操作模式后,必须重新备份数据库。
当数据库处于ARCHIVELOG模式时,在进行日志切换后必须要归档重做日志。因为日志组只有在归档后才能被覆盖,所以如果不归档该日志组,那么当下次切换到该日志组时将会导致LGWR处于等待状态。为了避免这种情况,必须要及时归档重做日志,归档重做日志有手工归档和自动归档两种方法。
Example:修改数据库的归档路径为/u01/backup
Step1:
增加路径,管理员登录并修改参数


Step2:
查看数据库的归档模式


完
小陈今天的分享就到这里啦!
期待下一期的邂逅!




