Oracle数据库启动过程验证检查点SCN(一)

2015-01-21 12:22:37 · 作者: · 浏览: 19

1.SCN号是重要的时间机制,两者之间可以相互的转换。


1).将时间转换为SCN号:
SQL> select timestamp_to_scn(sysdate) from dual;


TIMESTAMP_TO_SCN(SYSDATE)
-------------------------
? ? ? ? ? ? ? ? ? 920939


?2).将SCN号转换为具体时间:


SQL> select scn_to_timestamp(920000) from dual;


SCN_TO_TIMESTAMP(920000)
---------------------------------------------------------------------------
07-FEB-10 01.06.11.000000000 AM


3).查看当前数据库最新的SCN号:
SQL> select current_scn from v$database;


CURRENT_SCN
-----------
? ? 920782
? ? 当前最新的SCN号,该SCN号会不停的在内存中被刷新,Oracle 10g每隔3秒就会被刷新。


2.数据库启动过程对SCN号的验证。


? ? 下面我们先来了解4种类型的SCN,这4种类型的SCN实际都是检查点SCN,都是由CKPT进程更新,存储在控制文件和数据文件头中,不同类型的SCN有不同的作用。


1).数据库检查点SCN:


?



SQL> select checkpoint_change# from v$database;


CHECKPOINT_CHANGE#
------------------
? ? ? ? ? ? 920459


? ? 数据库检查点SCN,每执行一次检查点,CKPT进程会更新控制文件中的数据库检查点SCN。


2).数据文件SCN:
?


SQL> select checkpoint_change# from v$datafile;


CHECKPOINT_CHANGE#
------------------
? ? ? ? ? ? 920459
? ? ? ? ? ? 920459
? ? ? ? ? ? 920459
? ? ? ? ? ? 920459
? ? ? ? ? ? 920459
? ? ? ? ? ? 920459
? ? ? ? ? ? 920459
? ? ? ? ? ? 920459
? ? ? ? ? ? 920459
? ? ? ? ? ? 920459
? ? ? ? ? ? 920459


36 rows selected.


? ? 数据文件SCN,每个数据文件都有一个数据文件SCN,每执行一次检查点,由CKPT进程都将更新位于控制文件中的数据文件SCN。


3).数据文件启动SCN:
?


SQL>? select checkpoint_change# from v$datafile_header;


CHECKPOINT_CHANGE#
------------------
? ? ? ? ? ? 920459
? ? ? ? ? ? 920459
? ? ? ? ? ? 920459
? ? ? ? ? ? 920459
? ? ? ? ? ? 920459
? ? ? ? ? ? 920459
? ? ? ? ? ? 920459
? ? ? ? ? ? 920459
? ? ? ? ? ? 920459
? ? ? ? ? ? 920459
? ? ? ? ? ? 920459


36 rows selected.


? ? 启动SCN,每个数据文件都有一个启动SCN,每执行一次检查点,CKPT进程都将更新数据文件头中的检查点SCN,这被叫做启动SCN。


4).数据文件终止SCN:
?


SQL> select last_change# from v$datafile;


LAST_CHANGE#
------------


36 rows selected.


? ? 终止SCN,每个数据文件都有一个终止SCN,该SCN存储在控制文件中,当数据库被OPEN之后,该值即变成#ffffff无穷大。


数据库在启动过程中对SCN的验证分为两个阶段:
? 第一阶段,检查控制文件和数据文件中数据文件的检查点次数是否一致(不同的数据文件检查点次数可能是不同的),如果不一致说明要么控制文件过旧,要么数据文件过旧,需要执行相应的恢复操作;如果一致继续执行下一步检查。


? 第二阶段,检查数据文件的启动SCN和终止SCN是否一致,如果数据库关闭是非正常关闭,那么终止SCN肯定是无穷大,这个时候需要完成一个实例恢复的过程;如果启动SCN和终止SCN相同,那么数据库就可以OPEN了。


? 另外,存储在控制文件中的数据库SCN、数据文件SCN和存储在数据文件头中的启动SCN实际都是在执行检查点时由CKPT进程对控制文件和数据文件头的更新,3者必定是相同的,在执行SHUTDOWN IMMEDIATE|NORMAL|TRANSANTIONAL关闭数据库时会再次触发检查点,这时前面3种类型的SCN和存储在控制文件中的终止SCN必定是相同的。


?下面我们通过对控制文件和数据文件头的转储来验证上面的说法:


1).正常关闭数据库的状态。


SQL> shutdown immediate
?Database closed.
?Database dismounted.
?ORACLE instance shut down.
?SQL> startup mount
?ORACLE instance started.


?Total System Global Area? 599785472 bytes
?Fixed Size? ? ? ? ? ? ? ? ? 2022600 bytes
?Variable Size? ? ? ? ? ? 230687544 bytes
?Database Buffers? ? ? ? ? 360710144 bytes
?Redo Buffers? ? ? ? ? ? ? ? 6365184 bytes
?Database mounted.
?SQL> @?/rdbms/admin/gettrace


?TRACE_FILE_NAME
?--------------------------------------------------------------------------------
?/u01/app/oracle1/admin/orcl/udump/orcl_ora_4132.trc


?SQL> alter session set events 'immediate trace name controlf level 8';


?Session altered.
完成对控制文件的转储,下面来查看一下orcl_ora_4132.trc跟踪文件内容:
a).存储在控制文件中的数据库内容:
***************************************************************************
DATABASE ENTRY
?***************************************************************************
? (size = 316, compat size = 316, section max = 1, section in-use = 1,
? last-recid= 0, old-recno = 0, last-recno = 0)
? (extent = 1, blkno = 1, numrecs = 1)
? 02/19/2014 14:20:20
? DB Name "ORCL"
? Database flags = 0x50404001 0x00001000
? Controlfile Creation Timestamp? 02/19/2014 14:20:21
? Incmplt recovery scn: 0x0000.00000000