在Oracle数据库服务器上,数据库的整体架构分为两大类:数据库实例、数据库文件(数据库)。
就像字面的意思表述的那样:
数据库,或者说数据文件,即真实存储数据的地方。它可以位于文件系统(NTFS、EXT3、EXT4)或者裸设备(RAW)或者集群文件系统(GFS)又或者Oracle自动存储管理(ASM)。
访问数据文件可以通过操作系统的一些指令去访问(cd、ls,…)或者你可以依靠驱动程序包去访问(oracleasm、asmcmd,…)。
但是,如果你要正确、恰当的解读数据文件,那么,仅仅访问是不够的。
你还需要数据库整体架构中的另一个组成部分,即:数据库实例。
和数据库文件不同,数据库实例位于内存:
它是临时存在的,而数据库文件相对来说则长久的多。
它存在于内存,而数据库文件存在于存储设备。
它是访问数据库文件的方式。

数据库实例是由一块共享内存区域(SGA)以及一组系统运行时进程组成的。

数据库文件就好像是大自然,共享内存区则是我们人的肚子,而运行时进程则是我们的手脚、嘴巴(等等)。
我们通过手脚、嘴巴可以临时的从大自然中获得资源,供给自我的生存。
我们把自己得到的资源与能量存放在肚子里、血肉里、皮囊中。
但我们不可能长久的保存这些资源,当我们死去的时候,最终会被清空、置零。
而真正的资源,却终究是要回归自然的。
相对人类而言,自然对于资源的持有,堪称永恒。

这便是实例与数据文件的关系。

由于内存与磁盘是两块独立的区域,它们之间,因为时间的关系,必定会存在或多或少的差异。
在它们出现差异的时候,我们规定所有的数据从数据库文件生,亦从数据库文件止。
以数据库文件的数据状态为主导。

当内存中的特定数据与数据文件中不一致的时候,内存中的该区域会被打上“脏”的标记。
该标记的意义在于,当需要同步内存数据到磁盘的时候,能够找到需要被同步的对象。

该同步事件,即:检查点(Checkpoint)。

理想的状态是:
在实例关闭的时候,所有内存中的差异数据(变更数据)都因为检查点的发生而将数据写入了磁盘。

但更多的时候,可能在实例非正常关闭的情况下,并没有发生检查点,或者检查点没有正常结束。
这时候,内存中的变更会和数据库文件中的数据存在差异。

如果事情到这里就结束了,没有更多的策略的话,那么,会发生很多数据的变更与新增没有生效的情况。
通俗的说,就是:白做了。

在平时,如果事情白做了,那就需要重做。

在数据库管理系统实现的过程中,为了防止上述重做的情况发生,Oracle引入了REDO。
以便在一定程度上,让这种重做,由计算机系统完成。

为了实现重做,Oracle在每次对数据变更时,将新的数据的副本即时的存放到联机日志组(REDO LOG)中。
通过这种方法,将内存中有价值的差异轻量级的镜像到了磁盘,较之内存,更为长久的被存储下来了。

而在下一次启动实例时,通过比较本地的内存镜像区域(REDO)是否与数据库文件存在差异,判断是否需要通过REDO将上一次实例的状态恢复出来。
这个过程,即:实例恢复。

虽然前一次关掉的实例,和重新启动的实例,时间上来说,不是一个实例。(划分给实例的内存区大小或许一样,但是内存地址也许不尽相同)
但如果上一个实例没有完成将内存中的变更数据交还数据库文件就挂掉了,那么新启动的实例将会继续它上一任的遗留任务。

这和禅宗的灵童转世,或者一些具有使命感的部落或族群的存在方式很像。

或许,SCOTT和Larry在设计Oracle的时候,就从这些细节中得到了些许的启示吧。

————————————————
Ending。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

隐藏
变装