重做日志(Redo Log)用于记载事务操作所引起的数据库变化,当执行DML或DDL操作时,服务器进程会将重做记录写入到重做日志缓冲区,并最终由后台进程LGWR将重做记录写入到重做日志中。每个Oracle数据库至少包含两个重做日志组,并且这些重做日志组是循环使用的。
Oracle使用重做日志的目的是在出现例程失败或介质失败时实现例程恢复和介质恢复。
重做日志组(Redo Log Group)和重做日志成员(Redo Log Member)
日志组由一组完全相同的重做日志文件组成,每个日志组至少要包含一个重做日志文件。如果一个日志组包含多个重做日志文件,后台进程LGWR会将相同的事务变化写入到同一个日志组的各个重做日志文件中。日志组中的每个重做日志文件都被称为日志成员,同一个日志组的所有日志成员都具有相同的日志序列号和尺寸。
后台进程LGWR在以下情况开始工作:
- 提交事务(COMMIT)
- 每隔三秒钟
- 当重做信息超过1M时
- 重做日志缓冲区已有三分之一填满
- 在DBWR进程将脏缓冲区写入到数据文件之前
SCN(System Change Number)
SCN是用于标识数据库变化的惟一标识号,其数值顺序递增。执行事务操作(DDL或DML)时,系统会为每个事务变化生成相应的SCN。
日志序列号
日志序列号是重做日志的使用标识号,其数值也是顺序递增的。当进行日志切换时,日志序列号会自动增一,并将该信息写入到控制文件中。
重做线程(Redo Thread)
重做线程由一组相关的重做日志组组成。对于单例程数据库系统来说,只有一个重做线程。而对于RAC(Real Application Cluster)来说,多个例程会同时访问数据库,并且每个例程都有独立的重做线程。(重做线程与例程一一对应)
日志切换
日志切换是指后台进程LGWR停止写一个日志组,并开始写另一个日志组的事件,日志切换包括自动日志切换和手工日志切换两种方式。
手动日志切换:
alter system switch logfile;
日志切换时,Oracle还会完成以下任务:
- 促进后台进程CKPT发出检查点,从而使后台进程CKPT将检查点时刻SCN信息写入到控制文件和数据文件头部,并促使后台进程DBWR将脏缓冲区写入到数据文件。
- 当数据库处于ARCHIVELOG模式时,日志切换促使后台进程ARCH将日志组内容保存到归档日志。
检查点
检查点(Checkpoint)是一个数据库事件,它用于同步数据库的所有数据文件、控制文件、重做日志。当发出检查点时,后台进程CKPT会将检查点时刻的SCN写入到控制文件和数据文件头部,同时促使后台进程DBWR将所有脏缓冲区写入到数据文件中。而后台进程DBWR又促使后台进程LGWR开始工作。因为当发出检查点时CKPT、DBWR、LGWR同时工作,所以数据文件、控制文件和重做日志的SCN完全一致,从而使得三种数据库文件保持完全同步。
注意:当执行COMMIT操作时,只有后台进程LGWR会将事务变化写入到重做日志,后台进程DBWR只有在检查点时刻才会将脏缓冲区写入到数据文件。
出现以下情况时后台进程CKPT会发出检查点:
- 日志切换。日志组写满后,后台进程LGWR会进行日志切换,当进行日志切换时,系统会促使后台进程CKPT发出检查点。
- 关闭数据库。当执行SHUTDOWN NORMAL、SHUTDOWN TRANSACTIONAL、SHUTDOWN IMMEDIATE等命令关闭数据库时,后台进程CKPT会发出检查点,并且只有在检查点完成之后才会关闭数据库。需要注意:SHUTDOWN ABORT命令不会发出检查点。
- 手工检查点。当执行数据库备份时,为了使脏缓冲区数据写入数据文件,DBA可以执行ALTER SYSTEM CHECKPOINT命令,强制后台进程CKPT发出检查点。
例程恢复
例程恢复是指当出现例程失败时由后台进程SMON自动同步数据文件、控制文件和重做日志并打开数据库的过程。
例程失败是指与例程相关的后台进程及内存结构出现故障,例程失败主要有以下几种情况:
- 电源断电导致Oracle Server不可用
- 硬件故障导致Oracle Server不可用,如CPU失败、内存损坏
- 某个必需的后台进程(DBWR、LGWR、PMON、SMON、CKPT)出现失败
例程失败类似于执行SHUTDOWN ABORT命令关闭数据库,解决了硬件问题和电源断电等问题之后,DBA只需要执行STARTUP命令启动例程就可以了,而不需要执行任何恢复命令。当执行STARTUP命令启动例程并装载了数据库之后,后台进程SMON会自动执行例程恢复,最终使数据库所有文件(数据文件、控制文件、重做日志)完全同步。
例程恢复的具体步骤:
- 确定不同步的物理文件。通过比较数据文件、控制文件和重做日志的SCN,后台进程SMON可以确定哪些文件处于不同步的状态。
- REDO。确定了不同步的数据文件后,SMON会重新应用那些在数据文件上未执行的事务操作,并且DBWR会将提交和未提交的数据写到数据文件以及UNDO段上。
- REDO之后会打开数据库,此时客户应用可以访问数据库。
- UNDO。在第二步之后,数据文件既包含被提交的数据,也包含未被提交的数据。打开数据库后,SMON会自动使用UNDO段取消未被提交的数据。
增加日志组
alter database add logfile 'd:\demo\redo03.log' size 10M;
执行了上述命令后,DEMO数据库将增加一个尺寸为10M的新日志组,该日志组目前只包含一个日志成员,其日志组组号由系统自动分配。
增加日志组时,数据库管理员可以显示地指定日志组的组号:
alter database add logfile group 4 'd:\demo\redo04.log' size 10M;
需要注意:日志组个数不能超过永久参数MAXLOGFILES的设置,如果已经达到了该永久参数的限制,增加新日志组将会失败。如果要改变该永久参数的设置,必须重新建立控制文件。
增加日志成员
alter database add logfile member
'd:\demo\redo1b.log' to group 1,
'd:\demo\redo2b.log' to group 2,
'd:\demo\redo3b.log' to group 3,
'd:\demo\redo4b.log' to group 4;
需要注意,日志组的成员个数不能超过永久参数MAXLOGMEMBERS的设置。如果成员个数已经达到了该永久参数的限制,增加日志成员会失败。
删除日志成员
alter database drop logfile member 'D:\DEMO\REDO1B.LOG';
需要注意:当执行alter database drop logfile member语句时,不能删除当前日志组的日志成员。为了删除当前日志组的日志成员,应该首先执行日志切换,然后删除对应的日志成员。如果日志组只有一个成员,则不能执行alter database drop logfile member删除该日志成员。
删除日志组
alter database drop logfile group 4;
执行上述命令删除日志组时,只是从控制文件中逻辑删除了日志组的信息,而不会删除日志组的成员文件,其成员文件必须使用OS命令删除。如果数据库只有两个日志组,也不能使用该命令删除任何一个日志组。
清除重做日志
如果日志组的所有成员被误删除,那么DBA也可以使用ALTER DATABASE CLEAR LOGFILE命令重新生成日志组的成员文件。
alter database clear logfile group 2;
移动日志成员:
1、确定日志组状态
移动日志成员时,它所对应的日志组不能处于CURRENT状态。
select * from v$log ; //日志组信息
select * from v$logfile; //日志成员信息
2、关闭数据库,启动例程到mount状态
host move D:\DEMO_DB\DEMO\REDO03B.LOG D:\DEMO_DB\DEMO\AA\REDO03B.LOG;
alter database rename file 'D:\DEMO_DB\DEMO\REDO03B.LOG'
to 'D:\DEMO_DB\DEMO\AA\REDO03B.LOG';
3、关闭数据库,再启动数据库