日期:2014-05-16  浏览次数:20545 次

Oracle体系结构详解(物理结构,内存结构和逻辑结构)
一、oracle实例:
    oracle实例是由一组后台进程和内存结构组成,可以看成是用户与数据库之间的桥梁;
    oracle数据库是一系列物理数据文件的集合(如控制文件,数据文件,参数文件,日志文件,临时文件等)。
    它们的关系:实例可以在没有数据文件的情况下单独启动,(startup nomount)通常没有意义;一个实例在生成期内只能装载(alter database mount)和打开(alter database open)数据库;一个实例只能装载和打开一个数据库;一个数据库可以同时被多个实例装载和打开(即RAC)
二、物理结构:
    物理结构指一系列Oracle文件系统,主要包括数据文件,控制文件,日志文件,参数文件等;首先是通过参数文件找控制文件,再通过控制文件找数据文件和日志文件。可以在一下视图中查询 v$controlfile控制文件;v$datafile数据文件;v$logfile日志文件;
    参数文件(pfile和spfile):init.ora或initSID.ora,通常位于:$ORACLE_BASE/admin/<SID>/pfile;在oracle数据库启动的时候加载(Nomount时加载),初始化文件记载了数据启动参数,内存,控制文件,进程数等。
    控制文件:是个二进制文件,主要记录了数据库名,数据库创建的时间戳,数据文件和日志文件的名字和位置,数据库恢复所需要的同步信息;一个数据库只有一个控制文件,但有时候为了防止控制文件损坏导致数据库无法启动,可以对控制文件做镜像。   所有修改数据库结构的命令都会引起控制文件的修改,并在跟踪文件中做记录。
    数据文件:主要是存储用户和应用程序的所有数据,一个数据库至少包含多个或一个数据文件,一个表空间由一个或多个数据文件组成。用户请求的信息在内存中不存在则从数据文件中读取出来存储在内存中,如果用户修改了某些信息并不是立马更新到数据库中,先存储在内存中,而是
由后台读写进程决定何时更新到数据文件中,这样是位了减少磁盘IO。
    日志文件:(也叫重做日志文件redo log),是oracle记录数据库中数据的变化,每一条数据进行了修改,重做日志都会有记录;日志文件是oracle物理结构中最复杂的一类文件,也是数据库系统安全的重要保证,如果某些异常操作可以通过日志来恢复。日志文件组和日志成员:一个oracle数据库至少包含两个日志文件组,每个日志文件组至少包含一个和多个日志成员,成员之间是镜像关系。如果要将日志文件永久的保存下来,就形成了归档日志了(归档日志archive log是当数据库运行在归档模式下时,一个redo log file(group)写满后,由ARCn进程将重做日志的内容备份到归档日志文件下,然后这个redo log file(group)才能被下一次使用),归档日志必须在归档模式下,(重做日志是循环写的)。
    控制文件,数据文件,日志文件的位置:E:\app\hongzhong\oradata\orcl;

三、内存结构:
oracle的内存结构有:系统全局区(SGA),程序全局区(PGA);
   1、系统全局区下的所有数据被当前实例下所有的后台所共享,当数据库被启动时,系统全局区的内存被自动分配;
      高速缓冲区:是oracle读取数据的时候先从数据文件中把数据读取到该区域,对数据进行更新操作先保存在此区域,然后再由读写进程写入数据文件;主要有保持缓冲池,默认缓冲池和再生缓冲池;保持缓冲池主要是保存类似于代码表常用的不便的数据,再生缓冲池主要保存类似于大表的数据。
      共享池:

      日志缓冲区:主要是用于缓冲事务日志,存放需要写入文件的日志,是一种先进先出的方式缓存的。
      大共享区:(可选的)主要是一些大的进程和数据备份操作的时候用到的。
      固定SGA: 是由oracle自动设置的大小。
      查看当前系统的SGA大小:show parameter sga_max_size; 要修改:alter system set sga_max_size=1200m scope=spfile;
   2、程序全局区(PGA)
      是每个用户进程连接Oracle用户保留的内存,进程创建时分配,进程结束时释放。PGA包括了以下几个结构:
      排序区,游标状态区,会话信息区,堆栈区

四、逻辑结构:
    oracle逻辑结构主要是:数据块(block),数据扩展(extent),段(segment)和表空间(tablespace)之间的关系,数据块是oracle存储的最小单位,表空间是数据库存储的基本逻辑单位;连续的数据块形成一个数据扩展,多个数据扩展形成一个段,数据段和表空间是多对一的关系;一个表空间可以对应多个数据文件,一个数据文件只能对应一个表空间,但是数据文件和段之间不存在对应关系。

【我们分析一个Update 语句的完成 】
①. 用户提交一个Update 语句
②. Server Process 检查内存缓冲.
如果没有该数据块的缓冲,则从磁盘读入
i. 如果没有内存的有效空间,DBWR被启动将未写入磁盘的脏缓冲写入磁盘
ii. 如果有有效空间,则读入
③. 在缓冲内更新数据
i. 申请一个回滚段入口,将旧数据写如回滚段
ii. 加锁并更新数据
iii. 并在同时将修改记录在Redo log buffer中
④. 用户提交一个Commit 语句
i. SCN增加
ii. 将Redo log buffer 写入Redo log file
iii. 返回用户Commit 完成

  段:
段是对象在数据库中占用的空间,虽然段和数据库对象是一一对应的,但段是从数据库存储的角度来看的。一个段只能属于一个表空间,当然一个表空间可以有多个段。 表空间和数据文件是物理存储上的一对多的关系,表空间和段是逻辑存储上的一对多的关系,段不直接和数据文件发生关系。一个段可以属于多个数据文件,关于段可以指定扩展到哪个数据文件上面。 数据库的段可以分为四类:数据段、索引段、回退段、临时段。
1.数据段
  数据段是用于存储数据的段,他存储在数据表空间中。每一个表都有一个数据段(聚簇除外),表的数据存储在数据段中,默认情况下段名与表名相同。以下语句查询段的信息:
SQL>SELECT SEGMENTNAME,TABLESPACE,NAME,BYTES,BLOCKS FROM USER_EXTENTS;
2.索引段
  索引段用于存储索引,以下语句查询索引信息:
SQL>SELECT * FROM ALL_INDEXS
SQL>SELECT * FROM USER_INDEXS
3.回退段
  回退段用于存储用户数据修改之前的值,因而可以在特定条件下回退数据。回退段与事务是一对多的关系,一个事务只能使用一个回退段,而一个回退段可存放一个或多个事务的回退数据。
4.临时段
  临时段用于order by语句的排序以及一些汇总。

  数据块:oracle存储的最小的单位,一个块的大小默认为8KB,