ITPub博客

首页 > 数据库 > Oracle > 【00】Oracle体系结构详解

【00】Oracle体系结构详解

原创 Oracle 作者:神谕丶 时间:2015-02-05 18:32:20 0 删除 编辑

零.概述:
oracle server由instance和database组成。
每当数据库(database)启动
时,将在内存中分配SGA(system global area),并将一组oracle后台进程启动。
实例(instance)用于控制数据库,数据库用于为实例提供各种数据。

一组实例只能服务一个数据库,某些时候,一个数据库可以有多组实例。
这样的多实例结构,就是real application clusters(RAC)。

实例:由一组后台进程
及在服务器中分配的共享区域。
数据库:基于磁盘的各类物理文件的集合。




一.数据库结构:

  • ·逻辑存储结构:

   
    从小至大可排序为:数据块(block)、区(extent)、段(segment)、表空间(tablespace)。
    



    数据块(block):
        也叫logical blocks,oracle blocks,或者pages(摘自oracle 10g concept)
        是数据存储最小的逻辑单元,也是输入输出操作的最小单位。
        通过以下语句可以查询oracle标准块的大小。
        SQL> select name,value from v$parameter where name='db_block_size';

        block无论存储的是table、index、还是clustered data,其内部结构都相似。
        
        上图显示了block各个组成部分,其中包括:
        Header (common and variable header):包含块的物理地址,所属段的类型。
        Table Directory:存储数据表的相关信息。(?如果是非表块如何处理?)
        Row Directory:存储每个数据行片断(row piece)在行数据区中的地址。
        Free Space:剩余空间,用于新的数据行插入和更新。
                    如果一个block属于表或簇表的数据段,或属于索引的索引段,那么在其可用空间区中还可能会存储事务条目。
                    这样的数据块的数据行如果在执行DML访问时,数据块中就需要保存事务条目。
        Row Data:行数据包含了表或索引数据,行可以跨块(以后会提到行链接和行迁移)。
        其中header、table directory、row directory统称为Overhead,用于存放整个块的引导信息。


     区(extent):
        是oracle存储分配与回收的最小单位。
        当一个段已有的空间被用完之后,oracle将为该段分配新的区。
        
        
     段(segment):
        由一组区构成,
        包括数据段、索引段、临时段、回滚段。
        数据段:表数据段、索引表数据段、分区表数据段、聚簇数据段
        索引段:包括ROWID与索引键值
        临时段:当进行group by、order by、union、intersect、minus、distinct、create index时,
                若内存不足,则oracle将为这些操作分配临时段来保存产生的临时数据。
        回滚段:保存数据修改前的信息,可以用于事务回滚、数据库恢复、读一致性。
                根据使用者不同,还可以分为系统回滚段、非系统回滚段。


     表空间(tablespace):
        
        一个数据库被分割到1到n个被称作表空间的逻辑存储单位。
        表空间可分为:system表空间、sysaux表空间、undo表空间、temporary表空间。
        也可以分为:大文件表空间(Bigfile tablespace)和小文件表空间(Smallfile tablespace)即默认创建的表空间。
        大文件表空间可以增强oracle数据库的存储能力,小文件表空间默认可以存放1024个datafile(10g数据)
        
        注:若无特殊说明(如bigfile tablespace),一般“表空间”就是“小文件表空间”。

        大文件表空间:
        大文件表空间只可用于locally managed,而且段只能为自动管理。        
        但是对于撤销表和临时表而言,段为manually managed时,也可以使用大文件表空间。
        
        system表空间:
        用于存放系统内部表与数据字典。

        sysaux表空间:
        充当system表空间的辅助表空间,存储除数据字典之外的其他数据对象。

        undo表空间:
        只用于存储撤销信息,不可创建如表和索引等信息,一个数据库中可以有零到多个。
        当事务内的第一条DML执行时,当前使用的撤销表空间就回被分配一个撤销段和一个事务表。

        temporary表空间:
        如果system表空间是locally managed,在创建数据库时必须指定一个默认的临时表空间。
        如果system表空间是dictionary managed,且创建数据库时没有定义默认临时表空间,oracle则会将system表空间作为默认的临时存储空间。并且在alert.log中生成一条警告。


        表空间是逻辑存储单位,而实际上数据是存储在数据文件(datafile)中。
        下图是两者的关系:
        
        
        数据文件只能存在于一个表空间中,一个表空间可以存放多个数据文件。
        举个例子,一个最简单的数据库最少需要一个表空间和一个数据文件。



  • ·物理存储结构:

    
    Oracle 数据库由多种操作系统的物理文件组成。
    其中主要包括:数据文件、控制文件、参数文件、重做日志文件、归档日志文件、口令文件、跟踪文件、警告文件。

        
        数据文件:(.dbf)
        用于存放用户应用程序数据和oracle系统内部数据的文件。
        创建表空间时,同时会创建数据文件,在创建表,索引,簇等数据库对象时,但无法指定用哪个数据文件存放。

        控制文件:(.ctl)
        是一种二进制文件,在数据库实例开启的时候,控制文件必须可写,如果控制文件无法被访问,数据库也将无法工作。
        用于存放数据库名及其创建日期,数据文件、日志文件的名称和位置、表空间信息、脱机的数据文件、日志历史信息、当前日志文件序列号、数据库检查点、系统更改号、归档当前信息、回滚段的起止、备份集和备份块等。
        每当添加、重命名或者移除数据文件或重做日志文件时,控制文件就会被更新以反映这些数据库物理结构变化,目的是:oracle可以借此在数据库启动时识别打开的数据库文件和重做日志文件,也可以在恢复数据库时识别当前可用及需要恢复的文件。
        因此,每次更改物理结构时(alter database),如添加一个数据文件,一定要备份控制文件,同时更新备份文件。
        此外,数据库恢复(database recovery)时也要用到控制文件。
        至少需要一个控制文件,否则实例无法启动。
        
        重做日志文件:(.log)
        记录数据库发生过的更改信息,如修改,添加,删除及由oracle内部行为而引起数据库变化的操作。
        如果某种故障导致无法将修改过的数据永久的写入数据文件,那么这些修改内容可以从重做日志中获得。
        每个oracle数据库都有两个或更多的重做日志文件。

        归档日志文件:(.log)
        oracle将在重做日志文件被覆盖之前,将其内容保存至指定位置,被保存的重做日志集合称为“归档日志文件”。
        可以通过
        SQL> select name,log_mode from v$database;来查询归档情况。

        服务器参数文件:(.ora)
        参数文件包含了数据库与实例的配置参数列表,在安装oracle DB的时候会自动创建,文件名为SPFILEsid.ora
        spfile为二进制文件,为动态的,被修改的参数可立即生效。
        
        口令文件(密码文件):
        用于验证sysdba权限的二进制文件,当远程用户以sysdba或sysoper连接时,将用该文件验证。
        该文件会在创建实例的时候自动创建。

        警告文件(.log):
        即警告日志文件,为文本文件,记录运行信息与错误信息。
        运行信息:oracle实例的祁东和关闭,建立表空间,增加数据文件等。
        错误信息:如空间扩展失败,启动实例失败等。
        查询路径:
        SQL> select name,value from v$parameter where name = 'background_dump_dest';

        跟踪文件(.trc):
        包括后台跟踪文件与用户进程跟踪文件,
        后台进程跟踪文件:用于记录后台经常的警告或错误信息。命名格式为__.trc。
        用户进程跟踪文件:用于记录与用户进程的相关信息,用于跟踪sql语句,用于判断sql预计执行性能,由user_dump_dest确认,命名格式为_ora_.trc。        
        查询路径:
        SQL> select value from v$parameter where name = 'background_dump_dest';
        或者改为'user_dump_dest';
        
        
     

二.实例结构:


  • ·内存(SGA&PGA):

              Oracle在内存中存储以下信息:
            程序代码、已连接的会话信息、程序执行过程中所需的信息、需要在oracle进程间共享并进行通信的信息、以及缓存。

            其中基本的内存结构包括SGA与PGA:
            

            SGA(System global area):
            此区域由所有的服务器进程和后台进程共享。
            主要包括了database buffer cache、redo log buffer、shared pool、large pool、java pool、streams pool。

            buffer cache:
            存放oracle最近访问过的数据块(缓冲块),若请求数据在缓冲区中,oracle便直接读取出来并返回给用户,否则服务器进程将数据从磁盘的数据文件中读出,存入缓冲区;
            最常访问的数据块将放置到缓冲区前端,反之放入后端,缓冲区填满时,会挤掉不常被访问的块、
            

            脏数据块:存放着已被修改过的数据,等待被写入到数据文件,当某缓冲块中的数据被修改后,这些块被标记为“脏”。
            空闲缓存块:等待被从数据文件中读取的数据读满。
            保留缓存块(命中):包含正被用户访问的数据块和明确保留以作为将来使用的数据块。

            redo log buffer:
            日志信息在写入重做日志文件前,首先存放到redo log buffer中,再由LGWR写入文件,缓冲区大小由log_buffer决定,可以在实例启动后修改该参数,较大的缓冲区能减少redo log file的I/O次数。

            shared pool:
            用于缓存SQL语句、数据字典、PL/SQL语句,资源所,字符集及其他控制结构。
            库高速缓冲区(又分为共享SQL区与私有SQL区):
                共享SQL区存放SQL于PL/SQL语句的语法分析结果和执行计划。
                私有SQL区存放绑定变量,环境和会话等信息,属于某用户所私有的。
            数据字典缓冲区:
                存放oracle系统内部所需要的数据字典,如用户名,数据对象等。
           
            large pool:
            非必须结构,特殊情况时用于减轻共享池的压力:
                当使用恢复管理器进行备份和恢复操作时;
                使用I/O slave仿真异步I/O功能时;
                执行大量排序操作的SQL语句时;
                当使用并行查询时,大型池作为并行查询进程被彼此交换信息的地方;
            大小由large_pool_size决定。

            java池:
            用来提供内存给java虚拟机用,用于支持在数据库中运行java程序包,大小由java_pool_size决定。

            streams池:
            用于数据库与数据库之间进行数据共享,若没用到oracle流,则不需设置流池,大小由streams_pool_size决定。
        

               

  • ·后台进程:

              是一组运行于oracle服务器端的后台程序,是实例的重要组成部分。
            其中SMON、PMON、DBWR、LGWR和CKPT必须正常启动。
            DBWR(数据写入进程):
            将数据告诉缓冲区中的脏数据写入数据文件的进程。
        
            发生的三种情况:
                在database buffer cache中没有找到足够的空闲缓冲块时;
                在CKPT进程启动后;
                在“脏”数据库在database buffer cache中存放超过3秒时;
            可修改spfile的db_writer_processes来允许多个DBWR,但DBWR数量不应超过CPU数量。
            
            CKPT(检查点进程):
            可视为一个事件,作用就是执行检查点,目的为减少崩溃恢复时间。
            通过修改spfile的checkpoint_process参数为true来启动。
            
            LGWR(日志写入进程):
            将redo log buffer中的重做记录写入重做日志文件中。
            发生的三种情况:
                发生提交时;
                redo log buffer的信息满1/3时;
                日志信息存放超过3秒时;
            
            ARCH(归档进程):
            将已写满的重做日志文件复制到归档日志文件中(归档模式中)。
            可通过修改log_archive_max_processes启动多个ARCH从而提高归档写磁盘的速度。

              
            SMON(系统监控进程):   
            用于在实例启动时负责对数据库进行恢复,回收不再使用的临时空间,将各个表的空间碎片合并。

            PMON(进程监控进程):
            用于在进程启动失败或未响应时,清除此类进程,并释放所占用的资源。

            LCKn(锁定进程):
            用于在并行服务器模式下,实例间的封锁。
            
            RECO(恢复进程):
            用于分布式数据库环境,解决数据不一致,进行恢复工作。

    
        Dnnn(调度进程):
            在共享服务器模式下(多线程)使用。
            
            SNPn(快照进程):
 
            用户处理数据库快照的自动刷新,并通过DMBS_JOB包运行预定的数据库存储过程。

            
            查询当前实例进程的信息:
            SQL> select name,description from v$bgprocess;

                








三.其他:

  • ·其他进程:

            
            用户进程:
            指那些可以产生或执行SQL语句的应用程序。
                连接:指用户进程与实例之间建立的通信路径,通过操作系统上相关通信机制或者网络连接来实现。
                会话:指用户进程与实例之间建立连接后形成的用户与实例间的交互方式,在用户连接的过程中,会话始终存在,直到用户断开连接或终止应用程序。

            服务器进程:
                解析并执行SQL与PL/SQL;
                在database buffer cache中搜索用户进程所需要的数据,若不在,则需从硬盘的数据文件中读取至缓冲区;
                将执行结果返回给用户进程;            



四.附录:
    


  •  




原创,参考自官方文档。

p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 19.0px; font: 13.0px 'Helvetica Neue'}

作者微信号(持续更新)

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29773961/viewspace-1427793/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
微信公众号:神谕的暗影长廊

注册时间:2014-07-28

  • 博文量
    161
  • 访问量
    1195299