Oracle的体系结构
Oracle并不是像我们日常生活中所说的数据库那么简单。其实Oracle应该叫做Oracle数据库管理系统。它是一款用来管理数据库的软件系统。确切的应该叫做Oracle服务器(Oracle Server)。
 

Oracle服务器包括两个大部分组成:一部分叫做Oracle数据库,一部分叫做Oracle实例。
一:Oracle数据库
    它是指位于硬盘上实际存放的数据的文件,把这些文件组织在一起,成为一个逻辑的实体。我们叫做Oracle数据库。
    存放数据的文件可以被分成两大类:关键文件与非关键文件。
    关键文件:
      数据文件(datafile):存放数据的地方
      控制文件(controlfile):存放了数据库的自我描述信息。比如说数据文件,重做日志文件的位置      等等。
      重做日志文件(redo log file):记录了数据库里发生的所有变化的过程。用于对数据的恢复。
      这个三个文件的优先级从大到小分别是控制文件,重做日志文件,数据文件。
    非关键文件
      参数文件:包含启动实例时参考的各个参数的信息。有init***.ora或spfile两种。
      密码文件:
      归档日志文件:当重做日志文件的空间已经满了的时候。就对把重做日志文件复制一个副本,这个      副本就是归档日志文件,这个日志文件就会被永久的保存下来。而满了的重做日志文件就会被重新      覆盖写满。
      告警文件和跟踪文件:
      备份文件:对数据库所包含的文件进行备份以后生成的文件。
二:Oracle实例
    它是位于物理内存中的数据结构。它是由一个共享的内存池及多个后台进程组成的。共享的内存池可以被所有的进程访问。

Oracle实例的结构:内存结构和后台进程
    内存结构有可以分为两个部分:SGA(系统全局区),PGA(进程或程序全局区,这个是来服务器进程启动时就分配了的)。
    SGA区又可分为以下几个区:
      1:共享池:用于提供sql语句及pl/sql代码的执行效率。这个区又可分为两个区,分别是库缓冲区,数据字典缓冲区。所谓库缓冲区:有分为共享sql区,共享pl/sql区连个区。用LRU算法进行管理这个区中的sql的执行计划。这个区的大小是由共享池的大小而定的。
      2:大池
      3:java池
      4:数据库缓冲区:数据文件在内存中的副本。
      5:日志缓冲区:日志文件在内存中的缓存。是重做日志文件(redo log file)的数据来源。数据里的变化都是先存放在这块区域中的,然后再被写到重做日志文件(redo log file)。
      6:流池
    后台进程:可分为必需进程与非必需进程
    必需进程可分为:
      DBWn(Database Writer):数据库写。主要作用是将Database buffer cache(数据库缓冲区)里那些被更新过、但还没有被写入数据文件的数据写入到数据文件中。这里的n表示可以有多个数据库写操作。
      SMON(System Monitor) :系统监控。主要任务是在实例启动时,判断该实例上次是否正常关闭。如果非正常关闭的,则进行实例回复。这里要涉及到undo的问题(undo里面记录的时旧值的镜像)。
      PMON(Process Monitor):进程监控。主要任务是监控用户的进程。如果某个连上来的用户由于某种原因非正常终止了,则PMON会负责清理用户所占用的资源,比如说事务锁(TX)、用户占用的内存。
      LGWR(Log Writer):日志写。主要将Redo log buffer里的内容写入到重做日志文件中去。
      CKPT(Checkpoint):检查点。会唤醒DBWn进程,并将检查点位置写入到控制文件(controlfile)以及数据文件的头部。
      ARCn(归档进程)。用于将当前写满了的重做日志文件复制到指定的目录下面。形成一个归档日志文件。


Oracle数据库与Oracle实例的关系
    我们打个比方。Oracle数据库就像一个岛,而Oracle实例就是通往这个岛的一座桥。只有通过桥,我们才可以进入岛,对岛进行游玩。同样道理,为了能够操作Oracle数据库中的数据,我们要通过实例来对Oracle数据库进行操作。Oracle数据库是客观存在的,它是保存在硬盘上的。而Oracle实例却是保存在内存中的,当用户关闭操作时,Oracle实例也相应的消失了。
 

整个Oracle数据库与Oracle实例的工作过程
    Oracle服务器要向对外提供数据管理的服务,就必须先启动实例。启动实例要完成以下工作:一:在内存中分配一块共享空间(SGA)。之后Oracle服务器会启动一组后台进程(PGA)。这时实例才已经生成。
   实例启动后,Oracle服务器会将启动的实例与某个数据库关联。这个动作叫做mount。当实例成功mount到某个数据库上时,接下来就可以打开盖数据库所包含的物理文件。于是就可以往里面读写数据了。而所有的读写操作等都是由实例的后台进程来完成。一个实例只能与一个数据库相关联,一个实例只能mount或打开一个数据库。这种情况叫做单实例数据库。而一个数据库同时被多个实例关联,mount,打开就叫做RAC了。


Oracle的逻辑结构
为什么要提出Oracle的逻辑结构呢。不是物理结构就行了吗。操作不是对物理对象进行操作吗?
其实举个例子,我们要找一个信息。我们知道信息是存放在数据文件中的。那么如何找个这个信息呢。那就要从数据文件的起点开始,依次读取每个文件的最小组成单位里所包含的数据,判断是否是我们所需的数据。如果数据文件很多,总数据量很大,那我们要找到猴年马月啊。所以为了更好的管理物理磁盘上的数据文件,Oracle引入了逻辑存储的概念。可以这样理解,Oracle把数据在物理文件里摆放的位置等信息都以数据行的形式存放在了相关的表里。因此,就有了Oracle的逻辑结构。
Oracle的逻辑结构可分为以下内容:
处于顶层的是数据库,接着是表空间(Tablespace),再接着是段(Segment),然后是数据扩展(Extent),最后是数据块(data block)。
    表空间(Tablespace):对应的物理结构就是一个或者多个数据文件。在逻辑上将是存放表,索引的地方。一个表空间可以有多个数据文件,但是一个数据文件只能属于一个表空间。
    段(Segment):可以理解成我们熟悉的表,索引。一个数据文件中是包含多个段的。一个段可以分布在多个数据文件中。
    数据扩展(Extent):多个Extent可以构成一个段。比如说对一个段进行数据添加(对表进行添加记录),是以Extent的形式进行的。一个Extent 不能跨越多个数据文件,否则如果一个Extent分布在多个数据文件中,就不是连续的空间了。
    数据块(data block):最基本的逻辑单位了。若干个连续的数据块构成一个数据扩展(Extent)。