oracle查询当天的时间_Oracle 体系结构篇 之SCN 号机制解析

本文详细介绍了Oracle数据库中的系统更改号(SCN)机制,包括系统检查点SCN、数据文件检查点SCN、开始SCN和结束SCN的作用和更新过程。在数据库操作中,SCN用于跟踪数据变化并确保在异常宕机后的恢复一致性。通过查询SQL语句展示了SCN在不同阶段的变化情况,解释了数据库启动时如何根据SCN进行介质恢复和实例恢复的判断。
摘要由CSDN通过智能技术生成

【关键术语】

System Change Number 系统更改号

System Checkpoint SCN 系统检查点

SCNDatafile Checkpoint SCN 数据文件检查点

SCNStart SCN 开始 SCN(Begin SCN)

Stop SCN 结束 SCN(End SCN)

一、数据变化是如何写入数据文件的

在理解SCN之前,我们先看下ORACLE事务中的数据变化是如何写入数据文件的:(可以参考《ORACLE结构体系 之 ORACLE服务器组成》)

  • 1.事务开始;
  • 2.在BUFFER CACHE中寻找需要的数据块,如果没有,则从数据文件读入数据块;
  • 3.生成重做项写入REDO LOG BUFFER(重做日志缓冲区)中,修改BUFFER CACHE(数据库高速缓冲区),该区域被标识为“脏缓冲区”;
  • 4.事务提交,LGWR进程将LOG BUFFER中的重做记录写入ONLINE REDO LOGFILE(联机重做日志文件)中;
  • 5.当发生CHECKPOINT,CKPT进程更新所有数据库文件头的信息,DBWn进程将BUFFER CACHE中的脏数据写入DATA FILE中。
ccbe67464f57c89de367a4e373e2434e.png

经过上述5个步骤,事务中的数据变化最终被写入到数据文件中。

但是,一旦在上述中间环节时,数据库意外宕机了,那么在重新启动时,ORACLE如何知道哪些数据已经写入数据文件,哪些没有写呢?

我们知道,SCN机制能比较完善的解决上述问题。

相对我们人类用世纪、年月日、时分秒计时而言,SCN就相当于ORACLE的计时方法。SCN是一个数字,确切的说是一个只会增加、不会减少的数字。正是它这种只会增加的特性确保了Oracle知道哪些应该被恢复、哪些应该被复制。

总共有4中SCN:

  • 系统检查点(System Checkpoint)SCN 、
  • 数据文件检查点(Datafile Checkpoint)SCN、
  • 结束SCN(Stop SCN)、
  • 开始SCN(Start SCN)。

二、最新 SCN 和四种 SCN

1. 系统最新 SCN

SQL> select current_scn from v$database;CURRENT_SCN---------------------- 847164//通过查询可以发现,该 SCN 一直在发生变化,是系统最新的 SCN 号。

2. System Checkpoint SCN(系统检查点 SCN)

当checkpoin(检查点)完成后,ORACLE 将System Checkpoint SCN号(系统检查点SCN)存放在控制文件中。

我们可以通过下面SQL语句查询:

SQL> select checkpoint_change# from v$database;CHECKPOINT_CHANGE#----------------------------------- 846888//通过查询可以发现,该 SCN 没有发生变化,并且小于系统最新的 SCN 号。//执行检查点SQL> alter system checkpoint;System altered.//查询系统检查点 SCNSQL> select checkpoint_change# from v$database;CHECKPOINT_CHANGE#------------------------------------847491//查询系统当前 SCNSQL> select current_scn from v$database;CURRENT_SCN---------------------- 847495//通过以上实验可以发现,系统检查点 SCN 根据检查点发生变化,即当前数据库同步状态的 SCN。

3. Datafile Checkpoint SCN(数据文件检查点 SCN)

当checkpoint完成后,ORACLE 将Datafile Checkpoint SCN 号存放在控制文件中。

我们可以通过下面SQL语句查询所有数据文件的Datafile Checkpoinnt SCN号。

SQL> select name,checkpoint_change# from v$datafile;NAME CHECKPOINT_CHANGE#------------------------------------------------------------ ----------------------------------/u01/app/oracle/oradata/orcl/system01.dbf 847491/u01/app/oracle/oradata/orcl/sysaux01.dbf 847491/u01/app/oracle/oradata/orcl/undotbs01.dbf 847491/u01/app/oracle/oradata/orcl/users01.dbf 847491/u01/app/oracle/oradata/orcl/example01.dbf 847491//我们发现,每个数据文件都有一个对应的数据文件检查点 SCN 号。

4. Start SCN 号(开始 SCN)

ORACLE 将Start SCN号存放在数据文件头中。这个 SCN 用于检查数据库启动过程是否需要做media recovery(介质恢复).

我们可以通过以下SQL语句查询:

SQL> select name,checkpoint_change# from v$datafile_header;NAME CHECKPOINT_CHANGE#------------------------------------------------------------ ----------------------------------/u01/app/oracle/oradata/orcl/system01.dbf 847491/u01/app/oracle/oradata/orcl/sysaux01.dbf 847491/u01/app/oracle/oradata/orcl/undotbs01.dbf 847491/u01/app/oracle/oradata/orcl/users01.dbf 847491/u01/app/oracle/oradata/orcl/example01.dbf 847491//我们发现,每个数据文件都有一个对应的开始 SCN 号,并和前面保持一致。//将表空间 example 脱机。SQL> alter tablespace example offline;Tablespace altered.//执行检查点SQL> alter system checkpointSystem altered.SQL> select name,checkpoint_change# from v$datafile_header;NAME CHECKPOINT_CHANGE#------------------------------------------------------------ ----------------------------------/u01/app/oracle/oradata/orcl/system01.dbf 848249/u01/app/oracle/oradata/orcl/sysaux01.dbf 848249/u01/app/oracle/oradata/orcl/undotbs01.dbf 848249/u01/app/oracle/oradata/orcl/users01.dbf 8482490//我们看到,被脱机的表空间对应的数据文件头部的 SCN 无法读取到SQL> select name,checkpoint_change# from v$datafile;NAME CHECKPOINT_CHANGE#------------------------------------------------------------ ----------------------------------/u01/app/oracle/oradata/orcl/system01.dbf 848249/u01/app/oracle/oradata/orcl/sysaux01.dbf 848249/u01/app/oracle/oradata/orcl/undotbs01.dbf 848249/u01/app/oracle/oradata/orcl/users01.dbf 848249/u01/app/oracle/oradata/orcl/example01.dbf 848238//我们看到,被脱机的表空间对应的数据文件存在控制文件头部的 SCN 保留在我们脱机的那一时间。

5. Stop SCN 号(结束 SCN)

ORACLE 将Stop SCN 号存放在控制文件中。这个 SCN 号用于检查数据库启动过程是否需要做instance recovery(实例恢复)。

我们可以通过以下SQL语句查询:

SQL> select name,last_change# from v$datafile;NAME LAST_CHANGE#------------------------------------------------------------ ----------------------------------/u01/app/oracle/oradata/orcl/system01.dbf/u01/app/oracle/oradata/orcl/sysaux01.dbf/u01/app/oracle/oradata/orcl/undotbs01.dbf/u01/app/oracle/oradata/orcl/users01.dbf/u01/app/oracle/oradata/orcl/example01.dbf 848238//在数据库正常运行的情况下,对可读写的 online 的数据文件,该 SCN 号为 NULL。

三、过程详解

四种SCN中,3种SCN存在于控制文件中,Start SCN则存在于数据文件的文件头中。

在控制文件中,System Checkpoint SCN是针对整个数据库全局的,因而只存在一个, 而Datafile Checkpoint SCN和Stop SCN是针对每个数据文件的,因而一个数据文件就对应在控制文件中存在一份Datafile Checkpoint SCN和Stop SCN。

1. STOP SCN 的变化

在数据库正常运行期间,Stop SCN(通过视图v$datafile的字段last_change#可以查询)是一个无穷大的数字或者说是NULL。

2. 其他 SCN 的变化

66a6b329db9b80ccd6fbfa7a5480aead.png

记录日志时,自动记录最新的 SCN 到日志中。因此,每一条日志都包含了一个时间。 当 DBWn 进程启动时,将依照日志记录写入一段数据。这一段日志记录的时间段必定有一个最早时间和一个最新(迟)时间。最早的时间我们称为 LOW SCN(即上次清空日志后的第一条记录),最新时间我们称为 NEXT SCN(即下次日志清空前的最近一条记录)

这 里 , 由 CKPT 进 程 将 NEXT SCN 的 值 同 步 更 新 到 START SCN 、 SYSTEMCHECKPOINT SCN 和 DATAFILE CHECKPOINT SCN 中。以确保所有文件的一致性。

3. 最新的 SCN 如何生成

系统是如何产生一个最新的SCN的?实际上,这个数字是由当时的timestamp转换过来的。每当需要产生一个最新的SCN到redo记录时,系统获取当时的timestamp,将其转换为数字作为SCN。

4. SCN 号与数据库启动

1) 检查是否需要介质恢复

在数据库启动过程中,当System Checkpoint SCN、Datafile Checkpoint SCN和Start SCN 号都相同时,数据库可以正常启动,不需要做media recovery。三者当中有一个不同时,则需要做media recovery.

2) 检查是否需要实例恢复

如果在启动的过程中,End SCN 号为NULL,则需要做instance recovery.ORACLE 在启动过程中首先检查是否需要media recovery,然后再检查是否需要instance recovery.

5. SCN 号与数据库关闭

如果数据库的正常关闭的话,将会触发一个checkpoint,同时将数据文件的END SCN号设置为相应数据文件的 Start SCN号。当数据库启动时,发现它们是一致的,则不需要做instance recovery。在数据库正常启动后,ORACLE会将END SCN 号设置为NULL.如果数据库异常关闭的话,则END SCN号将为NULL.

6. 为什么需要 System SCN 号与 Datafile 号

为什么 ORACLE会在控制文件中记录System checkpoint SCN 号的同时,还需要为每个数据文件记录Datafile Checkpoint SCN 号?

1) 对只读表空间,其数据文件的Datafile Checkpoint SCN、Start SCN和END SCN号均相同。这三个 SCN在表空间处于只读期间都将被冻结。

2) 如果控制文件不是当前的控制文件,则System checkpoint会小于Start SCN或ENDSCN号。记录这些SCN号,可以区分控制文件是否是当前的控制文件。

54b7d8266a7ac09e1dbd21e721b2b00c.png

写在最后的话

感谢各位的支持与阅读,后续会继续推送相关知识和交流,欢迎交流、转发和关注,感谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值