Oracle重做日志


Oracle Redo Log重做日志会记录所有的数据库变化,当执行DML或DDL操作时,oracle会将数据库变化信息记载到重做日志中。Redo Log的主要目的是,万一实例或介质失败,可以使用重做日志来恢复。

(官方文档说明:Redo log, which consists of two or more preallocated files that store all changes made to the database as they occur. Every instance of an Oracle Database has an associated redo log to protect the database in case of an instance failure. )   Oracle在执行任何DML和DDL操作改变数据之前,都会将恢复所需要的信息,先写入重做日志缓冲区,然后再写入 数据库高速缓冲区。  The name redo log indicates its purpose: When the database crashes, the RDBMS can redo (re-process) all changes on datafiles which will take the database data back to the state it was when the last redo record was written.   Redo Log应用的两类主要数据库故障: 1、系统故障:如果数据库所在的服务器断电或者操作系统错误,导致实例失败。 数据库数据的不一致性:未提交的事务对数据的修改已经提交到数据文件中 +  已提交的事务对数据的修改未提交到数据文件中
由于数据库是先写入日志文件,然后再写入数据文件的更新机制,并且2者是异步的方式(提高性能)。
1)针对“未提交的事务对数据的修改已经提交到数据文件中”
数据库重新启动时,从尾到头的逆向扫描日志文件,对未提交的事务执行撤销操作。undo
2)针对“已提交的事务对数据的修改未提交到数据文件中”
数据库重新启动时,从头到尾的正向扫描日志文件,对已提交的事务执行重做操作。redo
故障的恢复:由Oracle根据日志文件内容自动完成,不需要用户干预,所有数据不会丢失,此时数据库打开会占用比正常关闭更长的时间。

2、介质故障:如果包含数据文件的磁盘驱动器出现了永久性故障,Oracle会使用归档重做日志及在线重做日志,将磁盘驱动器的备份恢复到适当的时间点。 引发的问题:硬盘数据丢失,破坏性极大。 故障的恢复: 1.重新安装数据库系统 2.装入最新的数据库备份 3.装入自最新的数据库备份之后的所有日志文件备份 需要用户手工完成,如果没有日志文件备份,数据就会有部分丢失。       Redo Log Files SELECT * FROM v$log;   SELECT * FROM v$logfile;
归档重做日志 归档日志(Archive Log)是非活动的重做日志备份.通过使用归档日志,可以保留所有重做历史记录,当数据库处于ARCHIVELOG模式并进行日志切换式,后台进程ARCH会将重做日志的内容保存到归档日志中.当数据库出现介质失败时,使用数据文件备份,归档日志和重做日志可以完全恢复数据库。   生产环境一定要使用归档模式,Thomas Kyte说,如果系统不以 ARCHIVELOG 模式运行,那它根本就不能算是生产系统。 <<Oracle Database 9i10g11g编程艺术:深入数据库体系结构>>上描述的一个介质故障的案例比较清楚: 假设你每周的星期六做一次备份。现在是星期五下午,已经生成了这一周的数百个重做日志,突然你 的磁盘出问题了。如果没有以 ARCHIVELOG 模式运行,那么现在的选择只有:
  • 删除与失败磁盘相关的表空间。只要一个表空间有该磁盘上的文件,就要删除这个表空间(包括表空间的内容)。如果影响到SYSTEM 表空间(Oracle 的数据字典),就不能用 这个办法 。 
  • 恢复上周六的数据,这一周的工作就白做了。
不论是哪种选择都不太好。这两种做法都意味着你会丢失数据。不过另一方面,如果之前以 ARCHIVELOG 模式运行,那么只需再找一个磁盘就行了。你要根据上周六的备份将受影响的文件恢复到这个磁盘上。最后,再对这些文件应用归档重做日志和(最终的)在线重做日志,实际上是以一种快进的方式重放整个星期的事务。这样一来,什么也不会丢失。数据会恢复到发生失败的那个时间点。   Oracle日志挖掘    参考: http://en.wikipedia.org/wiki/Redo_log 数据库故障   Oracle Redo Log 机制 小结   

相关内容