这其实是很正常的。
你新创建一个datafile也会发现这个新的datafile的checkpoint scn会比其他文件大。来看:
SQL> alter tablespace users add datafile 'D:\oradata\rmantgt\users02.dbf' size 2M;
表空间已更改。
SQL> col name format a40
SQL> select name,checkpoint_change# from v$Datafile;
NAME CHECKPOINT_CHANGE#
---------------------------------------- ------------------
D:\ORADATA\RMANTGT\SYSTEM01.DBF 286248
D:\ORADATA\RMANTGT\USERS02.DBF 286393
D:\ORADATA\RMANTGT\USERS01.DBF 286248
D:\ORADATA\RMANTGT\UNDO02.DBF 286248
SQL> select name,checkpoint_change# from v$Datafile_header;
NAME CHECKPOINT_CHANGE#
---------------------------------------- ------------------
D:\ORADATA\RMANTGT\SYSTEM01.DBF 286248
D:\ORADATA\RMANTGT\USERS02.DBF 286393
D:\ORADATA\RMANTGT\USERS01.DBF 286248
D:\ORADATA\RMANTGT\UNDO02.DBF 286248
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
286248
可以看到,由于我的数据库目前没有任何活动,所以没有产生任何checkpoin,所以这时,会发现,新增加的users02.dbf的checkpoint scn比其他数据文件要大。因为创建数据文件时的scn肯定是当前最新的scn号。而其他数据文件由于都没有发生任何事务活动,所以它们的scn号保持不变。
但是,控制文件中(v$datafile)记录的scn号必须要和数据文件头部(v$datafile_header)记录的scn号一致。
而我们通常所说的数据库打开时,scn号要一致,主要也是说数据文件头部记录的scn号必须要和控制文件中记录的scn号一致。
通常来说,如果一个数据库是有事务在活动的话,每当发生checkpoint时,oracle会同时用当前最新的checkpoint scn号去更新每个数据文件头部的scn号以及控制文件中记录的各个数据文件的scn号。所以,在一个活动的数据库中,上面三句查询出来的checkpoint_change#是一致的。