1,重做线程(Redo Thread)
重做线程是由一组相关的重做日志组成。
重做线程与实例是一一对应关系。单例程DB只有一个重做线程;RAC 有多个重做线程。
通过查询动态性能视图V$THREAD 可以显示重做线程的详细信息。
SQL> select thread#, status, groups, sequence# from v$thread;
THREAD# STATUS GROUPS SEQUENCE#
---------- ------ ---------- ----------
1 OPEN 3 5
2,重做入口(Redo Entry)
重做入口也被称为重做记录(redo record)或重做数据( redo data),它由一组变化向量组成,这些变化向量包括表块变化(块位置、变化数据)、UNDO 块变化和UNDO 事务表的变化。当用户执行事务操作时(DDL 和 DML )时,服务器进程会将重做记录写入到重做日志缓冲区,并最终由后台进程LGWR 将重做记录写入到重做日志。
3,SCN(System Change Number)
SCN 是用于标识数据库变化的唯一标识号,其数值顺序递增。
当执行事务操作时,系统会为每个事务变化生成相应的SCN。
可以通过查询动态性能视图V$DATABASE ,可以显示当前SCN 值。
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
659539
4,日志切换
日志切换是指后台进程LGWR 停止写一个日志组,并开始写另一个日志组的事件,日志切换包括自动日志切换和手工日志切换两种方式。
手工日志切换:
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
1 1 8 52428800 1 NO CURRENT 667657 01-9月 -08
2 1 6 52428800 1 NO INACTIVE 667530 01-9月 -08
3 1 7 52428800 1 NO INACTIVE 667532 01-9月 -08
SQL> alter system switch logfile;
系统已更改。
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
1 1 8 52428800 1 NO ACTIVE 667657 01-9月 -08
2 1 9 52428800 1 NO CURRENT 668025 01-9月 -08
3 1 7 52428800 1 NO INACTIVE 667532 01-9月 -08
5,日志序列号
日志序列号是重做日志的使用标识号,其数据是顺序递增的。当进行日志切换时,日志序列号会自动增一,并将该信息写入到控制文件中。
当执行日志切换时,ORACLE 会将特定日志序列号所记载的SCN 值范围记载到日志历史记录中。当执行完全恢复或不完全恢复时,备份数据文件需要应用重做信息,而重做信息被记载到归档日志和重做日志中。通过比较备份文件的SCN 值和日志历史记载的SCN 值范围,ORACLE 可以确定要应用的归档日志和重做日志。
通过查询动态性能视图V$LOG_HISTORY,可以显示特定重做线程的日志历史记录。
SQL> select * from v$log_history;
RECID STAMP THREAD# SEQUENCE# FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# RESETLOGS_CHANGE# RESETL
---------- ---------- ---------- ---------- ------------- -------------- ------------ --------------
1 664106849 1 1 534907 30-8月 -08 565110 534907 30-8月 -08
2 664107081 1 2 565110 30-8月 -08 573749 534907 30-8月 -08
3 664194031 1 3 573749 30-8月 -08 600444 534907 30-8月 -08
4 664283991 1 4 600444 31-8月 -08 641616 534907 30-8月 -08
5 664325856 1 5 641616 01-9月 -08 667530 534907 30-8月 -08
6 664325858 1 6 667530 01-9月 -08 667532 534907 30-8月 -08
7 664325940 1 7 667532 01-9月 -08 667657 534907 30-8月 -08
8 664326412 1 8 667657 01-9月 -08 668025 534907 30-8月 -08
6,检查点
检查点(Checkpoint)是一个数据库事件,它用于同步数据库的所有数据文件、控制文件和重做日志。当发出检查点时,后台进程CKPT 会将检查点时刻的SCN 写入到控制文件和数据文件头部,同时会促使后台进程DBWR 将所有脏缓冲区数据写入到文件中。当ORACLE 发出检查点时,CKPT 会促使DBWR 开始工作,而DBWR 又会促使LGWR 开始工作。因为当发出检查点时CKPT、DBWR、LGWR 同时工作,所以数据文件、控制文件和重做日志的SCN 完全一致,从而使得三种数据库文件保持完全同步。
注意:当执行COMMIT 操作时,只有后台进程LGWR 会将事务变化写入到重做日志,而后台进程DBWR 只有在检查点时刻才会将脏缓冲区数据写入到数据文件。
在以下情况中后台进程CKPT 会发出检查点:
- 日志切换。当当前日志组写满之后,后台进程LGWR 会进行日志切换,当进行日志切换时,系统会促使后台进程CKPT 发出检查点。
- 关闭数据库。当执行SHUTDOWN NORMAL、SHUTDOWN TRANSACTIONAL、SHUTDOWN IMMIEDIATE 等命令关闭数据库时,后台进程CKPT 会发出检查点,并且只有在检查点完成之后才会关闭数据库。注意,SHUTDOWN ABORT 命令不会发出检查点。
- 手工检查点。当执行数据库备份时,为了使脏缓冲区数据写入数据文件,DBA 可以执行ALTER SYSTEM CHECKPOINT 强制后台进程CKPT 发出检查点。
- 通过设置初始化参数据 FAST_START_MTTR_TARGET 控制检查点,该初始化参数用于指定例程恢复的最大时间。当设置了 FAST_START_MTTR_TARGET 参数之后,ORACLE 会根据该参数自动调节检查点。