一。概念
联机日志文件又叫重做日志文件,记录了对数据库修改的信息,包括用户对数据修改和数据库管理员对数据库结构的修改。它主要用于在发生故障的时候和数据库备份文件配合恢复数据库,一般发生故障有2个情况:一个是介质损坏另外一个是用户误操作。每个数据库至少有两个日志文件组,每组至少包含1个或者多个日志成员,这里要多个日志成员的原因是防止日志文件组内某个日志文件损坏后及时提供备份,所以同一组的日志成员一般内容信息相同,但是存放位置不同。
在Oracle数据库中,执行数据修改操作后,并不是马上写入数据文件,而是首先生成重做信息,并写入SGA中的一块叫LOG_BUFFER的固定区域,LOG_BUFFER的空间并不是无限大,事实上它非常小,一般设置在3~5MB左右。LOG_BUFFER有一定的触发条件,当满足触发条件后,会有相应进程(LGWR)将LOG_BUFFER中的内容写入一个特定类型的文件,就是传说中的联机重做日志文件。
联机重做日志文件是循环使用的(比如有三组日志文件)。当第一个日志文件达到一定数量时,就会停止写入,而转向第二个日志文件,第二个满转向第三个日志文件.第三个满就向第一个日志文件写入.而第一个日志文件有没有自动备份就涉及到归档或者不归档的问题.当数据库自动对原来的日志文件进行备份的话就叫归档模式,不需要对数据库进行自动备份就叫非归档模式. 这样循环的过程 就叫做日志组切换(Log Switch)
二。触发情况那么什么情况触发LGWR进程写日志文件呢?以下情况将触发LGWR进程写操作:
1).当commit事务发生
2).当redo log buffer存储达到1/3
3).当重做日志缓冲区有超过一个兆字节的更改记录
4).在DBWN将buffer cache修改过的数据块的信息写入到数据文件之前
触发CHECK POINT事件的情况:
(当database buffer cache中用户commit但是还未写入数据文件的数据【简称脏数据】写入数据文件的过程就是一个checkpoint)
1).每次系统做日志切换时或者执行alter system switch logfile。
2).实例通过normal,transactional,immediate选项关闭时
3).通过设置初始化参数FAST_START_MTTR_TARGET强制发生
4) .数据库管理员手工设置ALTER SYSTEM CHECKPOINT、 ALTER TABLESPACE, DATAFILE OFFLINE时。
5).使用alter tablespace[OFFLINE NORMAL|READ ONLY|BEGIN BACKUP] 语句导致指定数据文件发生检查点
三。规划联机重做日志
四。命令操作
1 手工进行重做日志组的切换
查询重做日志信息
SQL> select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 CURRENT
2 INACTIVE
3 INACTIVE
日志组切换 现在在写入第一个组 状态为当前
手工切换 日志组
SQL> alter system switch logfile;
系统已更改。
被切换到了第二组
SQL> select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 ACTIVE
2 CURRENT
3 INACTIVE
2 添加重做日志组
查询所有的重做日志
SQL> select group#,member from v$logfile;
GROUP# MEMBER
---------- --------------------------------------------------
3 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG
2 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG
1 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG
添加一个重做日志组 4
SQL> alter database add logfile group 4 ('C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\
REDO04.LOG') size 10M;
数据库已更改。
发现已经多加入了一条
SQL> select group#,member from v$logfile;
GROUP# MEMBER
---------- --------------------------------------------------
3 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG
2 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG
1 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG
4 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO04.LOG
3 添加重做日志组成员(添加的日志组成员默认是INVALID 当切换日志组时 自动变为空)
SQL> alter database add logfile member 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\RE
DO04_1.LOG' to group 4;
数据库已更改。
SQL> select group#,member from v$logfile;
GROUP# MEMBER
---------- --------------------------------------------------
3 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG
2 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG
1 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG
4 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO04.LOG
4 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO04_1.LOG
4 删除重做日志组
ORACLE 例程已经启动。
Total System Global Area 285212672 bytes
Fixed Size 1248552 bytes
Variable Size 79692504 bytes
Database Buffers 197132288 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
比如 存在一个组4的日志文件 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO04.LOG
SQL> select group#,member from v$logfile;
GROUP# MEMBER
---------- --------------------------------------------------
3 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG
2 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG
1 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG
4 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO04.LOG
G' to 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO04_1.LOG';
数据库已更改。
数据库已更改。
SQL> select group#,member from v$logfile;
GROUP# MEMBER
---------- --------------------------------------------------
3 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG
2 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG
1 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG
4 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO04_1.LOG