一、完全检查点:当完全检查点发生时,ckpt进程会触发DBwriter进程把所有脏块写入磁盘上。
二、增量检查点:当增量检查点发生时:
1、ckpt进程会把检查点队列的第一个被脏的数据块所对应的日志地址记录到控制文件。
2、当检查点队列连接的脏块太多以及系统的I/O不是很忙,这是会触发DBwriter将最早脏的数据块部分写入磁盘上来缩短检查点队列。
三、当Oracle正常关闭时会触发完全检查点,当Oracle在正常运行期间每隔3秒发生一次增量检查点。
四、每个数据块中都有两个日志地址:LRBA和HRBA
RBA:数据块日志地址
LRBA:数据块第一次被脏的日志地址
HRBA:数据块最近一次被脏的日志地址
五、检查点队列:把数据块按其LRBA地址连接起来的。
注:日志是按时间顺序记录buffer cache的变化,所以检查点队列中数据块是按照其第一次被脏的时间排序的(数据块第一次被脏的时间越早就越靠前,越迟就越靠后)。
六、Log writer进程每隔3秒会将log buffer cache里面的日志写到当前联机日志里(current redo log)。
七、on disk RBA:是current redo log里面的最后一条日志的地址(即current redo log 里面最新一条日志的地址)。
八、实例崩溃恢复过程(Oracle自动恢复):找起点,确定终点,跑日志(前滚)
1、Oracle发现实例非正常关闭需要做实例恢复
2、Oracle在控制文件中通过LRBA地址找到日志的起点
3、Oracle从日志的起点开始跑,跑到redo log的最后一条日志
4、Oracle跑日志跑到终点时,保证所有已提交事物的脏块全部被构造出来,同时一些未提交事物的脏块也被构造出来,Oracle会自动将崩溃前为提交的事物进行回滚
注:实例恢复需要联机日志(不需要归档日志)
九、SCN(system change number)
1、将系统时间通过一个函数转变为一个数字,就是SCN
2、查看当前SCN和时间
scn:select dbms_flashback.get_system_change_number,SCN_TO_TIMESTAMP
(dbms_flashback.get_system_change_number) from dual;
3、常见SCN号:
A、控制文件中:系统SCN、文件SCN、结束SCN
①系统SCN:select checkpoint_change# from v$database;
②文件SCN:select name,checkpoint_change# from v$datafile;
③结束SCN:select name,last_change# from v$datafile;
B、数据文件头部:起始SCN
select name,checkpoint_change# from v$datafile_header;
C、日志文件:
①每个日志文件头部都有first、next两个SCN
select * from v$log;
注:
first SCN就是一个日志文件里面第一条日志的SCN
next SCN就是下一个日志文件里面的第一条日志的SCN
②每条日志里面都有个SCN
D、SCN知识点
①数据库正常启动时,控制文件中系统SCN、文件SCN和数据文件中的起始SCN号应该是相
同的,结束SCN是空(可以理解为无穷大)。
②数据库正常关闭时,用关闭的时间点SCN去更新控制文件中系统SCN、文件SCN、结束
SCN和数据文件中的起始SCN。
③数据库非正常关闭时,控制文件中系统SCN、文件SCN和数据文件中起始SCN为崩溃时的
时间点的SCN,而控制文件中的结束SCN为空,下次启动时,Oracle检查到系统SCN、文件
SCN和起始SCN一样,唯独结束SCN为空,则认为需要做实例恢复。
④数据库正常运行时,当发生脏块写入磁盘时,及redo log里面的active(日志所对应
的脏缓存区还没写入磁盘)变为inactive(日志所对应的脏缓存区已经写入磁盘),则ckpt会用redo log里最老的active的first SCN更新系统SCN、文件SCN和起始SCN。
⑤当用旧的数据文件、控制文件替代新的,然后启动数据库,Oracle发现控制文件里面的系统SCN和current redo log的SCN低,则Oracle会通过跑日志,把旧的数据文件,控制文件跑成最新。
二、增量检查点:当增量检查点发生时:
1、ckpt进程会把检查点队列的第一个被脏的数据块所对应的日志地址记录到控制文件。
2、当检查点队列连接的脏块太多以及系统的I/O不是很忙,这是会触发DBwriter将最早脏的数据块部分写入磁盘上来缩短检查点队列。
三、当Oracle正常关闭时会触发完全检查点,当Oracle在正常运行期间每隔3秒发生一次增量检查点。
四、每个数据块中都有两个日志地址:LRBA和HRBA
RBA:数据块日志地址
LRBA:数据块第一次被脏的日志地址
HRBA:数据块最近一次被脏的日志地址
五、检查点队列:把数据块按其LRBA地址连接起来的。
注:日志是按时间顺序记录buffer cache的变化,所以检查点队列中数据块是按照其第一次被脏的时间排序的(数据块第一次被脏的时间越早就越靠前,越迟就越靠后)。
六、Log writer进程每隔3秒会将log buffer cache里面的日志写到当前联机日志里(current redo log)。
七、on disk RBA:是current redo log里面的最后一条日志的地址(即current redo log 里面最新一条日志的地址)。
八、实例崩溃恢复过程(Oracle自动恢复):找起点,确定终点,跑日志(前滚)
1、Oracle发现实例非正常关闭需要做实例恢复
2、Oracle在控制文件中通过LRBA地址找到日志的起点
3、Oracle从日志的起点开始跑,跑到redo log的最后一条日志
4、Oracle跑日志跑到终点时,保证所有已提交事物的脏块全部被构造出来,同时一些未提交事物的脏块也被构造出来,Oracle会自动将崩溃前为提交的事物进行回滚
注:实例恢复需要联机日志(不需要归档日志)
九、SCN(system change number)
1、将系统时间通过一个函数转变为一个数字,就是SCN
2、查看当前SCN和时间
scn:select dbms_flashback.get_system_change_number,SCN_TO_TIMESTAMP
(dbms_flashback.get_system_change_number) from dual;
3、常见SCN号:
A、控制文件中:系统SCN、文件SCN、结束SCN
①系统SCN:select checkpoint_change# from v$database;
②文件SCN:select name,checkpoint_change# from v$datafile;
③结束SCN:select name,last_change# from v$datafile;
B、数据文件头部:起始SCN
select name,checkpoint_change# from v$datafile_header;
C、日志文件:
①每个日志文件头部都有first、next两个SCN
select * from v$log;
注:
first SCN就是一个日志文件里面第一条日志的SCN
next SCN就是下一个日志文件里面的第一条日志的SCN
②每条日志里面都有个SCN
D、SCN知识点
①数据库正常启动时,控制文件中系统SCN、文件SCN和数据文件中的起始SCN号应该是相
同的,结束SCN是空(可以理解为无穷大)。
②数据库正常关闭时,用关闭的时间点SCN去更新控制文件中系统SCN、文件SCN、结束
SCN和数据文件中的起始SCN。
③数据库非正常关闭时,控制文件中系统SCN、文件SCN和数据文件中起始SCN为崩溃时的
时间点的SCN,而控制文件中的结束SCN为空,下次启动时,Oracle检查到系统SCN、文件
SCN和起始SCN一样,唯独结束SCN为空,则认为需要做实例恢复。
④数据库正常运行时,当发生脏块写入磁盘时,及redo log里面的active(日志所对应
的脏缓存区还没写入磁盘)变为inactive(日志所对应的脏缓存区已经写入磁盘),则ckpt会用redo log里最老的active的first SCN更新系统SCN、文件SCN和起始SCN。
⑤当用旧的数据文件、控制文件替代新的,然后启动数据库,Oracle发现控制文件里面的系统SCN和current redo log的SCN低,则Oracle会通过跑日志,把旧的数据文件,控制文件跑成最新。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29489498/viewspace-1108332/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29489498/viewspace-1108332/