oracle 重做日志文件redo概述
redo--> undo-->datafile
insert一条记录时, 表跟undo的信息都会放进 redo 中, 在commit 或之前, redo 的信息会放进硬盘上. 故障时, redo 便可恢复那些已经commit 了的数据.
redo解释:在Oracle数据库中,执行数据修改操作后,并不是马上写入数据文件,而是首先生成重做信息,并写入SGA中的一块叫LOG_BUFFER的固定区域,LOG_BUFFER的空间并不是无限大,事实上它非常小,一般设置在3~5MB左右。LOG_BUFFER有一定的触发条件,当满足触发条件后,会有相应进程将LOG_BUFFER中的内容写入一个特定类型的文件,就是传说中的联机重做日志文件。
在数据库中,Redo的功能主要通过 3 个组件来实现:Redo Log Buffer、LGWR 后台进程 和Redo Log File(在归档模式下,Redo Log File 最终会写出为归档日志文件)。 在Oracle的SGA 中,存在一块共享内存,称为 Redo Log Buffer.
Redo Log Buffer 位于SGA 之中,是一块循环使用的内存区域,其中保存数据库变更的 相关信息。这些信息以重做条目(Redo Entries )、形式存储(Redo Entries 也经常被称为 Redo Records)。Redo Entries 包含重构、重做数据库变更的重要信息,这些变更包括 INSERT、 UPDATE、DELETE 、CREATE 、ALTER 或者DROP等。在必要的时候 Redo Entries 被用于数据库 恢复
归档模式模式的产生:当第一个日志文件达到一定数量时,就会停止写入,而转向第二个日志文件,第二个满转向第三个日志文件.第三个满就向第一个日志文件写入.而第一个日志文件有没有自动备份就涉及到归档或者不归档的问题.当数据库自动对原来的日志文件进行备份的话就叫归档模式,不需要对数据库进行自动备份就叫非归档模式.
以下情况将触发LGWR进程写操作:
1).当commit事务发生 2).当redo log buffer存储达到1/3 3).当重做日志缓冲区有超过一个兆字节的更改记录 4).在DBWN将buffer cache修改过的数据块的信息写入到数据文件之前
触发CHECK POINT事件的情况:
1).每次日志切换时。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] 语句导致指定数据文件发生检查点
非归档模式和归档模式比较:
非归档模式只能做冷备份,归档模式可以做热备份并且可以做增量备份和部分恢复.
在非归档模式下执行数据库备份时,基本上数据管理员通过重做日志文件不能够恢复全部的数据,所以必须备份所有的数据文件和控制文件,而且必须使用 shutdown normal等命令关闭数据库.
而在归档模式下.当出现介质损坏(硬盘损坏或者误删数据文件)或者例程失败(服务器断电),数据库管理员可以通过归档日志来防止数据丢失,而非归档模式只能应对instance失败.在归档模式下,数据库处于open状态,仍然可以备份数据库,而不影响数据库的正常使用.不仅可以做完全恢复而且可以将数据库恢复到特定的点.
非归档模式和归档模式各有各的优点,选择时可以参考:1,数据库中数据变化的频繁程度;2,企业对数据丢失的态度;3,数据库是否需要7x24运行,因为非归档模式需要关闭数据库才能进行备份(冷备).
查看归档:
1、SQL> select name,log_mode from v$database;
2、SQL> archive log list
归档和非归档的切换:
1、关闭服务:
SQL> SHUTDOWN IMMEDIATE;
2、不加载数据文件(只加载控制文件和日志文件)启动服务:
SQL> STARTUP MOUNT;
3、查看日志归档模式:
SQL> ARCHIVE LOG LIST
4、配置数据库启用日志归档模式(只能在mount下启动归档模式)
SQL> ALTER DATABASE ARCHIVELOG;
5、加载并打开数据文件:
SQL> ALTER DATABASE OPEN;
数据库已更改。
SQL> ALTER SYSTEM SET LOG_ARCHIVE_START=TRUE SCOPE=SPFILE;
系统已更改。
日志切换和检查点切换:
SQL> alter system switch logfile;
日志切换就是停止写当前日志组,转而写另外一个新的日志组、系统可以自动切换,也可以手工切换。当发生SWITCH LOGIFLE时,系统会在后台完成CHECKPOINT的操作。CHECKPOINT是一个事件,它用于减少instant recovery的时间.当CHECKPOINT发生时,它会触发DBWR进程,把database buffer中变化了的数据写入数据文件,同时chkp进程更新control file和datafile header,以使它们保持一致。检查点其实是一个后台进程,用来保证所有修改过的数据库缓冲区的东西都写入数据库文件。它由参数LOG_CHECKPOINT_TIMEOUT和LOG_CHECKPOINT_INTERVAL来决定。检查点完成后,系统将更新数据库头和控制文件,也保证数据库的同步。这里主要体现在一个系统改变号上SCN(也叫检查点号)。它分别出现在v$log表的FIRST_CHANGE#列和V$DATAFILE的CHECKPOINT_CHANGE#列还有V$DATABASE的CHECKPOINT_CHANGE#上。 只要说明三个值相同,那么数据库就没有不同步的现象。否则就要进行介质恢复。这里可以通过日志切换改变新的检验点号。当然引起SCN改变的情况还有很多。
联机日志文件的规划
联机日志文件的规划原则如下:
1:分散放开,多路复用。一般会将同一组的不同日志成员文件放到不同的磁盘或不同的裸设备上。以提高安全性。
2:把重做日志放在速度最快的硬盘上(即:日志所在的磁盘应当具有较高的I/O),一般会将日志文件放在裸设备上。
3:把重做日志文件设为合理大小:例如,增大日志文件大小可以加快一些大型的INSERT、UPDATE、DELETE操作,也能降低日志文件切换频率。减少一些日志等待事件。一般根据具体业务情况有所不同。一般日志组大小应满足自动切换间隔至少15-20分钟左右业务需求
4:ORACLE推荐,同一个重做日值组下的所有重做日志文件大小、成员个数一致.
联机重做日志状态:
日志文件组的状态一般有INACTIVE、ACTIVE、CURRENT、UNUSED、CLEARING、CLEARING_CURRNT等六种状态:
SQL> SELECT STATUS FROM V$LOG;
创建新的日志组:
ALTER DATABASE ADD LOGFILE GROUP 1('/oradata/redo01_1.log', '/oradata/redo01_2.log') SIZE 8G REUSE;
删除旧的日志组:
ALTER DATABASE DROP LOGFILE GROUP 1;
注意事项:
1)执行命令后只是在数据字典中删除了。对应日志文件还在,只有手动删除日志文件,才能真正的删除日志文件。
2)不能删除仅有的2个文件组;
redo->每次操作都先记录到redo日志中,当出现实例故障(像断电),导致数据未能更新到数据文件,则数据库重启时须redo,重新把数据更新到数据文件,
3)不能删除正在活动的文件组(即CURRENT、ACTIVE状态的日志文件);
4)不能删除当前组的成员,当日志组只有一个成员时,不能删除日志组成员。
5)不能删除还没有归档的文件组
SQL> select * from v$log;
增加日志组文件
ALTER DATABASE ADD LOGFILE MEMBER 'E:\APP\KERRY\ORADATA\ORCL\REDO011.LOG' TO GROUP 1
删除日志组文件
不能删除日志组中唯一的日志文件,可以使用删除组的方法直接删除组;不能删除没有归档或者还在活动的日志;
ALTER DATABASE DROP LOGFILE MEMBER 'E:\APP\KERRY\ORADATA\ORCL\REDO011.LOG'
重命名日志组文件
ALTER DATABASE RENAME FILE 'E:\APP\KERRY\ORADATA\ORCL\REDO02.LOG' TO 'D:\REDO02.LOG';
清空日志文件数据
清空是说删除日志文件的内容。主要用于数据库无法进行有效恢复的时候。比如标识为current的日志文件组所有文件都坏了等。只有非active 和非current状态的组才能被清空
ALTER DATABASE CLEAR LOGFILE 'XXX\XXX\XX.LOG';
ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP NUMBER;
查询日志组相关信息:
SELECT * FROM V$LOG; SELECT * FROM V$LOGFILE;SELECT * FROM V$ARCHIVED_LOG; SELECT * FROM V$RECOVER_FILE; SELECT * FROM V$LOG_HISTORY; SELECT * FROM V$LOGHIST;
SELECT * FROM V$FLASH_RECOVERY_AREA_USAGE; --查看闪回日志使用状况
--查看日志组切换时间间隔
SELECT N.RECID AS RECID,N.FIRST_TIME AS FIRST_TIME,
M.FIRST_TIME AS END_TIME,ROUND((M.FIRST_TIME - N.FIRST_TIME) * 24 * 60, 2) AS MINUTES
FROM V$LOG_HISTORY M, V$LOG_HISTORY N
WHERE M.RECID = N.RECID + 1
ORDER BY M.RECID;