The redo log records all changes made to data, including both uncommitted and committed changes.
Oracle通过Redo来保证数据库的事务可以被重演,从而使得在故障之后,数据可以被恢复。在数据库中,Redo的功能主要通过3个组件来实现:Redo Log Buffer、LGWR后台进程和Redo Log File(在归档模式下,Redo Log File最终会经由ARCn进程写出为归档日志文件)。
Redo Log Buffer位于SGA之中,是一块循环使用的内存区域,其保存数据库变更的相关信息。这些信息以重做条目(Redo Entries)形式存储(Redo Entries也经常称为Redo Records)。Redo Entries包含重构、重做数据库变更的重要信息,这些变更包括INSERT、UPDATE、DELETE、CREATE、ALTER或者DROP等。
Redo Entries的内容被Oracle数据库进程从用户的内存空间(PGA)复制到SGA中的Redo Log Buffer之中。Redo Entries在内存中占用连续的顺序空间,由于Redo Log Buffer是循环使用的,Oracle通过一个后台进程LGWR不断把Redo Log Buffer的内容写出到Redo Log File中,Redo Log File同样是循环使用的。
比如我们昨天晚上备份了数据库,但是今天中午发现磁盘坏掉了,那么我怎样恢复。
我们先通过备份文件恢复到昨天晚上,然后再通过归档Redo日志和在线Redo日志恢复到今天中午。
Redo Log Buffer:如果数据需要写到在线重做日志中,则在写至磁盘之前要在Redo Buffer中临时缓存这些数据。由于内存到内存的传输比内存到磁盘的传输快得多,因此使用重做日志Buffer可以加快数据库的操作。数据在重做缓冲区的提留时间不会太长。实际上LGWR会在一下某个情况发生时启动对这个区的刷新输出(flush):
* 每3秒一次
* 无论何时有人提交请求
* 要求LGWR切换日志文件
* 重做缓冲区1/3满,或者包含了1MB的缓存重做日志数据
LGWR:日志写入器,LGWR负责将SGA中重做日志缓冲区的内容刷新到磁盘上的后台进程。
ARCn:归档进程,ARCn的任务就是,当LGWR将在线日志文件填满时,就将其复制到另外一个位置。此后这些归档的重做日志文件可以用于完成介质恢复。
Redo Log Files:重做日志文件,可以查询v$logfile找到对应的日志文件。
在数据更新操作commit前,将更改的SQL脚本写入重做日志。主要用于数据库的增量备份和增量恢复。
Redo Logs分为在线重做日志和归档重做日志
每个Oracle数据库都至少有两个Online重做日志组,每个组中至少有一个重做日志文件,这些在线重做日志组以循环方式使用。(用户可以通过视图操作添加/修改/删除日志组和日志文件来自定义在线重做日志),每组内的日志文件的内容完全相同,且保存在不同的位置,用于磁盘日志镜像,以做多次备份提高安全性。默认情况这n组通常只有一组处于活动状态,不断地同步写入已操作的脚本,当日志文件写满时(达到指定的空间配额),如果当前数据库处于归档模式,则将在线日志归档到硬盘,成为归档日志;若当前数据库处于非归档模式,则不进行归档操作,而当前在线日志的内容会被下一次重新写入覆盖而无法保存。因此,通常对于生产环境的数据库在运行时,是要处于归档模式下的,以保存数据更新的日志。当前归档日志组写满后,Oracle会切换到下一日志组,继续写入,就这样循环切换;当处于归档模式下,切换至原已写满的日志组,若该日志组归档完毕则覆盖写入,若没有则只能使用日志缓冲区,等待归档完毕之后才能覆盖写入。当然,处于非归档模式下是直接覆盖写入的。
归档重做日志文件实际上就是已填满的“旧”的在线重做日志文件的副本。系统将日志文件填满时,ARCH进程会在另一个位置建立重做日志文件的一个副本,也可以在本地或者远程位置上建立多个另外的副本。如果由于磁盘损坏或者其他物理故障而导致失败,就会用这些归档重做日志文件来执行介质恢复。
默认情况下,一个数据库默认为非归档模式,如果是非归档模式的话,也就说明我们没有办法通过日志来对数据库做一个恢复。
Archived redo logs should be backed up and deleted regularly.
Online redo logs should not be backed up.
LGWR重复循环的写重做日志文件,当一个日志文件被写满之后,LGWR就会写下一个Redo Log文件,当最后一个日志文件满了之后,LGWR就会返回来写第一个日志文件。
Reuse of Redo Log Files by LGWR
1.非归档模式
不适用与生产数据库
创建数据库时,缺省的日志管理模式为非归档模式
当日志切换,检查点产生后,联机重做日志文件即可被重新使用
联机日志被覆盖后,介质恢复仅仅支持到最近的完整备份
不支持联机备份表空间,一个表空间损坏将导致整个数据库不可用,需要删除掉损坏的表空间或从备份恢复
对于操作系统级别的数据库备份需要将数据库一致性关闭
应当备份所有的数据文件、控制文件(单个)、参数文件、密码文件、联机日志文件(可选)
2.归档模式
能够对联机日志文件进行归档,生产数据库强烈建议归档
在日志切换时,下一个即将被写入日志组必须归档完成之后,日志组才可以使用
归档日志的Log sequence number信息会记录到控制文件之中
必须有足够的磁盘空间用于存放归档日志
Oracle 9i 需要设置参数log_archive_start=true 才能够进行自动归档
备份与恢复
支持热备份,且当某个非系统表空间损坏,数据库仍然处于可用状态,且支持在线恢复
使用归档日志能够实现联机或脱机时点恢复(即可以恢复到指定的时间点、指定的归档日志或指定的SCN)
SQLs
V$LOGFILE
存储了Redo logs所放置的位置
SQL> SELECT * FROM v$logfile ORDER BY group#; GROUP# STATUS TYPE MEMBER ---------- ------- ------- ---------------------------------------------------- 1 ONLINE D:\ORACLE\PRODUCT\10.1.0\ORADATA\TEST\REDO01.LOG 2 ONLINE D:\ORACLE\PRODUCT\10.1.0\ORADATA\TEST\REDO02.LOG 3 STALE ONLINE D:\ORACLE\PRODUCT\10.1.0\ORADATA\TEST\REDO03.LOG SQL>
V$LOGFILE视图需要关注的字段是STATUS
INVALID
- File is inaccessible
STALE
- File's contents are incomplete
DELETED
- File is no longer used
null - File is in use
V$LOG
displays log file information from the control file.
SQL> SELECT * FROM v$log; GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------- 1 1 344 10485760 1 NO INACTIVE 2926216 31-7月 -12 2 1 345 10485760 1 NO CURRENT 2931621 31-7月 -12 3 1 343 10485760 1 NO INACTIVE 2900505 30-7月 -12 SQL>
可以看到Redo Log有3个组,关于V$LOG视图,重点要关注STATUS字段
UNUSED
- Online redo log has never been written to. This is the state of a redo log that was just added, or just after aRESETLOGS
, when it is not the current redo log.
CURRENT
- Current redo log. This implies that the redo log is active. The redo log could be open or closed.
ACTIVE
- Log is active but is not the current log. It is needed for crash recovery. It may be in use for block recovery. It may or may not be archived.
CLEARING
- Log is being re-created as an empty log after an ALTER DATABASE CLEAR LOGFILE
statement. After the log is cleared, the status changes toUNUSED
.
CLEARING_CURRENT
- Current log is being cleared of a closed thread. The log can stay in this status if there is some failure in the switch such as an I/O error writing the new log header.
INACTIVE
- Log is no longer needed for instance recovery. It may be in use for media recovery. It may or may not be archived.
查看是否启用了归档模式
SQL> archive log list Database log mode No Archive Mode Automatic archival Disabled Archive destination USE_DB_RECOVERY_FILE_DEST Oldest online log sequence 342 Current log sequence 344 SQL>
或者
SELECT log_mode FROM v$database; Output:NOARCHIVELOG
非归档到归档模式
a.一致性关闭数据库(shutdown [immediate | transactional |normal])
b.启动到mount阶段(startup mount)
c.切换到归档模式(alter database archivelog [manual])
d.切换到open阶段(alterdatabaseopen)
e.对数据做一个完整备份(fullbackup)
--演示非归档到归档模式
SQL> ARCHIVE LOG LIST --查看数据库是否处于归档模式
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 14
Current log sequence 16
SQL> SELECT log_mode FROM v$database;--查看数据库是否处于归档模式
LOG_MODE
------------
NOARCHIVELOG
SQL> SHUTDOWN IMMEDIATE; --一致性关闭数据库
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> STARTUP MOUNT;--启动到mount状态
ORACLE instance started.
Total System Global Area 251658240 bytes
Fixed Size 1218796 bytes
Variable Size 75499284 bytes
Database Buffers 171966464 bytes
Redo Buffers 2973696 bytes
Database mounted.
SQL> ALTER DATABASE ARCHIVELOG;--切换到自动归档模式
Database altered.
SQL> ALTER DATABASE OPEN;--切换到open状态
Database altered.
SQL> ARCHIVE LOG LIST; --查看数据库的归档状态
Database log mode Archive Mode --已置为归档模式
Automatic archival Enabled --对日志进行自动归档
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 14
Next log sequence to archive 16
Current log sequence 16
查看归档相关的参数
SQL> SHOW PARAMETER ARCHIVE --查看归档路径是否已设置,为空值表示未设置 NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ archive_lag_target integer 0 log_archive_config string log_archive_dest string log_archive_dest_1 string log_archive_dest_10 string log_archive_dest_2 string log_archive_dest_3 string log_archive_dest_4 string log_archive_dest_5 string log_archive_dest_6 string log_archive_dest_7 string NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ log_archive_dest_8 string log_archive_dest_9 string log_archive_dest_state_1 string enable log_archive_dest_state_10 string enable log_archive_dest_state_2 string enable log_archive_dest_state_3 string enable log_archive_dest_state_4 string enable log_archive_dest_state_5 string enable log_archive_dest_state_6 string enable log_archive_dest_state_7 string enable log_archive_dest_state_8 string enable NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ log_archive_dest_state_9 string enable log_archive_duplex_dest string log_archive_format string %t_%s_%r.dbf log_archive_local_first boolean TRUE log_archive_max_processes integer 2 log_archive_min_succeed_dest integer 1 log_archive_start boolean FALSE --该参数在9i中使用 log_archive_trace integer 0 remote_archive_enable string true standby_archive_dest string ?/dbs/arch
参考资料:
http://blog.csdn.net/robinson_0612/article/details/5784713
http://v.youku.com/v_show/id_co00XMTM2MzU0MzY=.html
Expert Oracle - Tom Kyte
转载请注明出处:http://blog.csdn.net/pan_tian/article/details/7805077