-------------------SCN系统改变号---------------------
(1)数据发生变化了,SCN值增加。为了保证数据是同步的,集群有2节点,都能改数据,第1节点改完了,SCN +1。第2节点同步数据,对比两个节点SCN号。
比如:节点1的SCN是 101
节点2的SCN是 100【以大的为准,将节点1的数据同步到节点2】
在oracle中也一样,每做一次改变,SCN号就会+1,或者你不做数据改变,它也会按时间增长,你数据库跑了1小时,时间发生变化了,库的SCN号也会变化。
SCN的作用?
你在启动时,是不是要自动恢复,你没有正常关机,第2次启动库时,它怎么知道你数据库的完整性有问题,它不可能扫描所有文件,不可能扫描所有文件下所有数据。
如果你扫描所有文件,一个生产库至少100G,那你全扫描一下,得多长时间啊?那怎么办?
它会看每个文件的SCN号,发果发现SCN号有不匹配,肯定丢数据的了,怎么办?
例:
控制文件中记录: 非正常关机
数据文件的位置 库中数据文件
system SCN:10000 system SCN:9990
数据文件1 SCN:10000
数据文件N SCN:10000
日志文件的位置
当你再次重启库时,两边的同一个数据文件的SCN号不同,你肯定丢动作了。这样呢,它有针对性的去查询,这样可以提高恢复速度。
在系统中呢,方便还原,库文件上有SCN号,每个对象上也有SCN号。
SCN的概念
SCN是顺序递增的一个数字,在Oracle中用来标识数据库的每一次改动,及其先后顺序。SCN的最大值是0xffff.ffffffff。
1、系统检查点scn
当一个检查点动作完成之后(check point),Oracle就把系统检查点的SCN存储到控制文件中。
select checkpoint_change# from v$database;
2、数据文件检查点scn
当一个检查点动作完成后,Oracle就把每个数据文件的scn单独存放在控制文件中。
select name,checkpoint_change# from v$datafile;
create table haha as select * from scott.emp;【创建了一个haha表,库发生改变】
select name,checkpoint_change# from v$datafile; 【没有变化】
select checkpoint_change# from v$database; 【没有变化】
总结:没有变化,但是你的SCN号肯定是增加了,但是没有更新到数据文件上,也没有更新到控制文件上。
在日志中更新了,为什么不往数据文件、控制文件上更新呢?
因为SCN号是按着时间点和改变次数来变的,变得太频繁了,每变一次,更新一次,每变一次,更新一次,服务器压力太大了。
只有在 输入 alter system checkpoint; 后会把检查点的SCN更新过去。
select name,checkpoint_change# from v$datafile; 【有变化】
select checkpoint_change# from v$database; 【有变化】
3、启动scn
Oracle把这个检查点的scn存储在每个数据文件的文件头中,这个值称为启动scn,
因为它用于在数据库实例启动时,检查是否需要执行数据库恢复。
select name,checkpoint_change# from v$datafile_header;【更新】
4、终止scn【关库的时候,触发记录一个结束的SCN号,也进行一次同步,正常关库也记录一份SCN,保证所有SCN号相同,当你再重启库时,就不用恢复操作了】
每个数据文件的终止scn都存储在控制文件中。
select name,last_change# from v$datafile;
在正常的数据库操作过程中,所有正处于联机读写模式下的数据文件的终止scn都为null.
shutdown immediate;
startup mount;
select name,last_change# from v$datafile;