4.7.3 重做日志文件
重做日志文件是保证数据库安全的一种重要手段。在重做日志文件中记录的是用户对数据库所做的修改,即一条条的DML和DDL命令。当数据库服务器发生故障时,数据库管理员可以根据重做日志的内容对数据进行恢复,从而保证数据不会因为故障而丢失。
用户在执行DML或DDL操作时,实际的数据处理是在SGA中进行的。服务器进程首先生成一条重做日志,并将它存储在重做日志缓冲区中,然后在数据库高速缓存中修改相应的缓冲区。
在一定的时机下,DBWR进程将数据库高速缓存中脏缓存区的内容写入数据文件中,LGWR将重做日志缓冲区中的内容写入重做日志文件。在一般情况下,LGWR总是先于DBWR进程将重做日志写入重做日志文件。
在重做日志文件中不仅记录重做日志,还记录SCN。如果用户提交事务,SCN将随着重做日志一起被LGWR进程写入重做日志文件。这样如果数据库服务器发生了故障,数据库管理员可以将数据库恢复到最后一个SCN处。如果用户没有提交事务,重做日志也可能被写入重做日志文件,但如果这个事务被回滚,对数据库将不产生任何影响。
在数据库中至少需要两个重做日志文件,数据库服务器将以循环的方式将重做日志写入这些文件。当第一个文件写满后,数据库服务器自动进行日志切换,将重做日志写入下一个文件。当最后一个文件被写满时,数据库服务器重新将重做日志写入第一个文件。如此循环往复进行,重做日志文件中以前的内容将被覆盖。
由于重做日志文件的特殊重要性,Oracle建议为每一个重做文件至少建立一个镜像文件。互为镜像的重做日志文件归为一个日志组,同一个日志组中所有文件的内容和大小完全相同。这些文件应该尽量分布在不同的磁盘上,以免磁盘发生故障时丢失所有的重做日志。数据库服务器在写重做日志时,必须将重做日志同时写入同一个日志组的所有文件。
为了保证重做日志的安全,应该及时对重做日志文件进行归档,产生归档日志文件。归档日志文件可以被备份到磁盘等存储介质上。归档操作必须在数据库的归档模式下进行,并且需要启动一个或多个ARCH进程。在LGWR进程向一个重做日志文件写入重做文件之前,该文件必须被归档,否则LGWR进程将被挂起,所有的事务都停止执行。