首页 > Linux操作系统 > Linux操作系统 > 7.管理重做日志(笔记)
7.管理重做日志
重做日志( Redo Log)用于记录数据库变化,当执行DML或DDL操作时,oracle会将数据库变化信息记载到重做日志中.oracle使用重做日志的目的时在出现例程失败或介质失败时实现例程恢复和介质恢复.
重做日志组(Redo Log Group)和重做日志成员(Redo Log Member)
日志组由一组完全相同的重做日志文件组成,每个日志组至少要包含一个重做日志文件.如果一个日志组包含多个重做日志文件,后台进程LGWR会将相同的事务变化写入到同一个日志组的各个重做日志文件中.日志组中的每个重做日志文件都被称为日志成员.同一个日志组的所有日志具有相同的日志序列号和尺寸.
重做入口(Redo Entry)
重做入口也称为重做记录,由一组变化向量组成,这些变化向量包含表块变化(块位置,变化数据),UNDO块变化和UNDO事务表的变化.当用户执行事务操作(DDL和DML)时,服务器进程会将重做记录写入到重做日志缓冲区.并最终由后台进程LGWR将重做记录写入到重做日志中.
当执行事务操作(DML或DDL)时,服务器进程首先将事务变化写入到重做日志缓冲区,并且后台进程LGWR最终会将重做记录写入到重做日志文件,后台进程LGWR在以下情况下开始工作
提交事务(COMMIT)
每个三秒钟
当重做信息超过1M时,
重做日志缓冲区已有三分之一填满.
在DBWR进程将脏缓冲区写入到数据文件之前.
SCN(System Change Number)
SCN是标识数据库变化的唯一标识号,其数据顺序递增.执行事务操作(DDL或DML)时,系统会为每个事务变化生成相应的SCN
日志序列号
日志序列号是重做日志的使用标识号,其数值也是顺序递增的.当进行日志切换是,日志序列号会自动增一,并将该信息写入到控制文件中,
重做线程(Redo Thread)
重做线程有一组相关的重做日志组成.对于单例程数据库来说,只有一个重做线程.而对于RAC(Real Application Cluster)来说,多个例程会同时访问数据库,并且每个例程都有独立的重做线程(重做线程与例程一一对应).
日志切换是指后台进程LGWR停止写一个日志组,并开始写另一个日志组的事件,日志切换包括自动日志切换和手工日志切换两种方式.默认情况下,当日志写满后,后台进程LGWR会自动进行日志切换.
手工日志切换
ALTER SYSTEM SWITCH LOGFILE;
进行日志切换时,oracle会完成以下任务.
促使后台进程CKPT发出检查点,从而使后台进程CKPT将检查点时刻SCN信息写入到控制文件和数据文件头部,并促使后台进程DBWR将脏缓冲区写入到数据文件.
当数据库处于ARCHIVELOG模式时,日志切换促使后台进程ARCH将日志组内容保存到归档日志.
检查点(Checkpoint)是一个数据库事件,它用于同步数据库的所有数据文件,控制文件和重做日志.当发出检查点是, 后台进程CKPT将检查点时刻SCN信息写入到控制文件和数据文件头部,并促使后台进程DBWR将脏缓冲区写入到数据文件.当oracle发出检查点时,后台进程CKPT促使后台进程DBWR开始工作,而后台进程DBWR又促使后台进程LGWR开始工作.因为当发出检查点时CKPT,DBWR,LGWR同时工作,所有数据文件,控制文件和重做日志的SCN完全一致,从而使得三种数据库文件保持完全同步.
需要注意,当执行COMMIT操作时,只有后台进程LGWR会将事务变化写入到重做日志,后台进程DBWR只有在检查点时刻才会将脏缓冲区数据写入到数据文件.出现以下情况时后台进程CKPT会发出检查点.
日志切换.
关闭数据库.(SHUTDOWN ABORT不会)
手工检查点.(ALTER SYSTEM CHECKPOINT)
通过设置初始化参数FAST_START_MTTR_TARGET控制检查点,该初始化参数用于指定例程恢复的最大时间(单位:秒).设置了FAST_START_MTTR_TARGET参数后,oracle会根据该参数自动调节检查点.
例程恢复
例程恢复是指当出现例程失败时由后台进程SMON自动同步数据文件,控制文件和重做日志并打开数据库的过程.
例程恢复的具体步骤如下:
1确定不同步的物理文件.通过比较数据文件,控制文件和重做日志的SCN,后台进程SMON可以确定那些文件处于不同步的状态.
2,REDO.确定了不同步的数据文件后,SMON会重新应用那些在数据文件上未执行的事务操作,并且DBWR会将提交和未提交的数据写入到数据文件以及UNDO段上.
3,REDO之后会打开数据库,此时客户应用可以访问数据库.
4,UNDO.在第二步之后,数据文件既包含被提交的数据,也包含未被提交的数据.打开数据库后,SMON会自动使用UNDO段取消未被提交的数据.
增加日志组:
ALTER DATABASE ADD LOGFILE ‘D:demoredo03.log’ SIZE 10M;
执行上述命令后,DEMO数据库将增加一个尺寸为10M的新日志组,该日志组目前只包含一个日志成员,其日志组号由系统自动分配.
增加日志组时,也可以显式地指定日志组的组号:
ALTER DATABASE ADD LOGFILE GROUP 4 ‘D:demoredo04.log’ SIZE 10M;
需要注意:日志组个数不能超过永久参数MAXLOGFILES的设置.
增加日志成员
建立日志组时,至少要为日志组指定一个日志成员.为了防止日志成员损坏而导致日志组无法使用,oracle建议每个日志组至少包含两个以上的日志成员.如果日志组只有一个日志成员,并且该日志出现损坏,那么当后台进程LGWR切换到该日志组时,oracle会停止工作,并对该数据库执行步完全恢复.
下面以为DEMO数据库的每个日志组增加一个日志成员为例,说明增加日志成员的方法.
ALTER DATABASE ADD LOGFILE MEMBER
‘D:demoredo1b.log’ to GROUP 1,
‘D:demoredo2b.log’ to GROUP 2,
‘D:demoredo3b.log’ to GROUP 3,
‘D:demoredo4b.log’ to GROUP 4;
日志组的成员个数不能超过永久参数MAXLOGMEMBERS的设置.
删除日志成员
当日志成员出现损坏或者丢失时,后台进程LGWR不能将事务变化写入到该日志成员中.
通过查看后台进程LGWR跟踪文件(位置:参数BACKGROUND_DUMP_DEST,
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/312079/viewspace-245221/ ,如需转载,请注明出处,否则将追究法律责任。