oracle数据库体系架构详解
在学习oracle中,体系结构是重中之重,⼀开始从宏观上掌握它的物理组成、⽂件组成和各种⽂件组成。掌握的越深⼊越好。在实际⼯作遇到疑难问题,其实都可以归结到体系结构中来解释。体系结构是对⼀个系统的框架描述。是设计⼀个系统的宏观⼯作。这好⽐建⼀栋⼤楼。你⾸先应该以图纸的⽅式把整个⼤楼的体系架构描述出来。然后⼀点点的往⾥⾯填充东西。下⾯我们先以⼀个图解的⽅式对oracle体系结构有⼀个基本了解
根据⽰图,便于我们记忆,⽰图分三部分组成,左侧User Process、Server Process、PGA可以看做成Clinet端,上⾯的实例(Instance)和下⾯的数据库(Database)及参数⽂件(parameter file)、密码⽂件(password file)和归档⽇志⽂件(archived logfiles)组成Oracle Server,所以整个⽰图可以理解成⼀个C/S架构。 Oracle Server由两个实体组成:实例(instance)与数据库(database)。这两个实体是独⽴的,不过连接在⼀起。在数据库创建过程中,实例⾸先被创建,然后才创建数据库。在典型的单实例环境中,实例与数据库的关系是⼀对⼀的,⼀个实例连接⼀个数据库,实例与数据库也可以是多对⼀的关系,即不同计算机上的多个实例打开共享磁盘系统上的⼀个公⽤数据库。这种多对⼀关系被称为实际应⽤集(Real Application Clusters,RAC)RAC极⼤提⾼了数据库的性能、容错与可伸缩性(可能耗费更多的存储空间)并且是oracle⽹格(grid)概念的必备部分。
下⾯我们来详细看⼀下oracle数据库的体系架构
Oracle体系架构主要有两⼤部分组成:数据库实例(Instance)和数据库⽂件(database)
数据库实例
指数据库服务器的内存及相关处理程序,它是Oracle的⼼脏。与Oracle性能关系最⼤的是SGA(System Global Area,即系统全局区活共享内存区),SGA包含三个部分:
1、数据缓冲区,可避免重复读取常⽤的数据;
2、⽇志缓冲区,提升了数据增删改的速度,减少磁盘的读写⽽加快速度;
3、共享池,使相同的SQL语句不再编译,提升了SQL的执⾏速度。
oracle数据库实例的另⼀部分就是⼀些后台进程了,他主要包括:
1.系统监控进程
2.进程监控
3.数据库写进程
4.⽇志写进程
5.检验点进程
6.其他进程
这些后台进程合起来完成数据库管理任务
在访问数据库的时候。器后台先启动实例。启动实例前要先分配内存区。然后在启动后台进程。数据库启动过程中必须启动上⾯的前五个进程。否则实例⽆法创建。
注意:在启动oracle数据库的时候。因为有些进程是在开机启动项中⾃动启动的。所以占⽤了很⼤⼀部分内存。如果您电脑上还有⼀些其他占⽤内存⽐较⼤的程序。在启动oracle数据库的时候有可能会因内存不⾜⽽启动失败。
Oracle服务器
Oracle服务器包括两部分:数据库实例和数据库⽂件。他们构成了也就是所谓的数据管理系统(DBMS)
物理结构:oracle的物理结构指的其实就是⼀些存在硬盘上的各种⽂件。其最终⽬的就是存储和获取相关数据。这些存在硬盘上的⽂件组成
了oracle数据库的物理结构
Oracle中主要包括三种⽂件:
1.数据⽂件
2.控制⽂件
3.重做⽇志⽂件
参数⽂件和密码⽂件:
参数⽂件:定义了数据库实例的特性,他是正⽂⽂件
密码⽂件:授予⽤户启动和关闭数据库的实例。主要有⼆进制数据组成
Oracle数据库的内存结构:SGA和PGA
SGA:数据库实例的⼀部分。数据库实例的启动会⾸先分配系统全局区(SGA)
1.共享池:共享sql和pl/sql代码,即把解析的sql代码在这⾥缓存,PL/SQL不仅缓存还共享。这样⼤⼤提⾼了直接访问磁盘获得sql的速度。
1)库⾼速缓存:存储最近使⽤过的sql语句。利⽤LRU(最近最少使⽤)算法来管理缓存。最近最少使⽤算法是⼀种⽐较常⽤的算法。在这⾥当库⾼速缓存接近满的时候。它会把缓存中最近最少使⽤的数据清除缓存中。加⼊新的缓存sql。
查看共享池的⼤⼩使⽤参数shared_pool_size
Sql>show parameter shared_pool_size
设置共享池⼤⼩
Sql>alter system set shared_pool_size=16M
注:在下⾯的的内容中。如果提到有关参数。如没有特殊说明。设置和查看参数值都是⽤以上类似⽅法。以后就不在重复了。并且这些参数必须是在以系统管理员system登陆时才能查看和修改。⽤类似scott⽤户是不能查看和修改的。
Oracle提供了DB_CACHE_SIZE(数据库⼤⼩)和DB_BLOCK_BUFFERS(数据库块个数)设置库⾼速缓存的⼤⼩,即为两者的成绩。
2)数据字典⾼速缓存
存储数据⽂件、表、索引、列、⽤户、权限信息和其他⼀些数据库对象的定义。把相关的数据字典信息放⼊缓存来提⾼查询的响应时间。其⼤⼩取决于共享池的⼤⼩。
2.数据库⾼速缓存
存储了最近从数据⽂件读⼊的数据块信息或⽤户更改后需要写回数据库的数据信息。内存读取⽐磁盘读取的速度快的多。提⾼了访问速度。这⾥的存取也采⽤了LRU(最近最少使⽤)算法。
Oracle数据库引⼊了缓冲区顾问参数(Buffer cache advisory parameter)⽤于启动和关闭统计信息。这些信息⽤于预测不同缓冲区的⼤⼩导致的不同⾏为特性。三种状态:OFF:ON:READY
设置顾问缓存为开启状态后。可以通过动态性能视图:v$db_cache_advice查看缓冲区的建议信息
3.重做⽇志缓存
在执⾏insert、update等操作后。数据发⽣了改变。这些变化的数据在写⼊数据库⾼速缓存前会先写⼊重做⽇志缓冲区。包括变化之前的数据。可以通过初始化参数log_buffer查看它的⼤⼩。此参数为静态参数,不能修改。
4.⼤池和java池
⼤型池(Large Pool)
在SGA中⼤型池是可选的缓冲区。它可以根据需要有管理权进⾏配置。它可以提供⼀个⼤的区以供象数据库的备份与恢复等操作。
oracle数据库表结构怎么看在以下⼏种情形下会启⽤:
⼀,backup 和 restore 操作的时候
⼆,当启动UGA, I/O slaves的时候
三,设置MTS服务器的时候,⽤户信息的存放也使⽤到Large Pool
可以使⽤以下命令进⾏更改Large Pool的⼤⼩:
ALTER SYSTEM SET Large_Pool_Size = 64m;
Java池⽤于编译java语⾔编写的指令。通过java_pool_size查看和修改⼤⼩。⼤⼩由数据库在SGA⾃动分配和管理。所以查看的时候值为0; Oracle的连接和会话
连接 (connection)与会话 (session)这两个概念均与⽤户进程 (user process)紧密相关,但⼆者⼜具有不
同的含义。
连接:⽤户进程和 Oracle 实例间的通信通道(communication pathway)。这个通信通道是通过进程间的通信机制(interprocess communication mechanisms)(在同⼀个计算机上运⾏⽤户进程和 Oracle 进程)或⽹络软件(network software)(当数据库应⽤程序与 Oracle 服务器运⾏在不同的计算机上时,就需要通过⽹络来通信)建⽴的。
会话:⽤户通过⽤户进程与 Oracle 实例建⽴的连接[此处连接与上⽂中的连接含义不同,主要指⽤户和数据库间的联系 ]。例如,当⽤户启动 SQL*Plus 时必须提供有效的⽤户名和密码,之后 Oracle 为此⽤户建⽴⼀个会话。从⽤户开始连接到⽤户断开连接(或退出数据库应⽤程序)期间,会话⼀直持续。
Oracle 数据库中的同⼀个⽤户可以同时创建多个会话。例如,⽤户名/密码为的SCOTT/TIGER ⽤户可以多次连接到同⼀个 Oracle 实例。
当系统没有运⾏在共享服务模式下时,Oracle 为每个⽤户会话创建⼀个服务进程(server process)。⽽当系统运⾏在共享服务模式下时,多个⽤户会话可以共享同⼀个服务进程。
⼀、Oracle的逻辑结构
Oracle的逻辑结构是⼀种层次结构。主要由:表空间、段、区和数据块等概念组成。逻辑结构是⾯向⽤
户的,⽤户使⽤Oracle开发应⽤程序使⽤的就是逻辑结构。数据库存储层次结构及其构成关系,结构对象也从数据块到表空间形成了不同层次的粒度关系。
1.数据块(Data Blocks)
数据块是Oracle最⼩的存储单位,Oracle数据存放在“块”中。⼀个块占⽤⼀定的磁盘空间。特别注意的是,这⾥的“块”是Oracle的“数据块”,不是操作系统的“块”。
Oracle每次请求数据的时候,都是以块为单位。也就是说,Oracle每次请求的数据是块的整数倍。如果Oracle请求的数据量不到⼀
块,Oracle也会读取整个块。所以说,“块”是Oracle读写数据的最⼩单位或者最基本的单位。
块的标准⼤⼩由初始化参数DB_BLOCK_SIZE指定。具有标准⼤⼩的块称为标准块(Standard Block)。块的⼤⼩和标准块的⼤⼩不同的块叫⾮标准块(Nonstandard Block)。
操作系统每次执⾏I/O的时候,是以操作系统的块为单位;Oracle每次执⾏I/O的时候,都是以Oracle的块为单位。
Oracle数据块⼤⼩⼀般是操作系统块的整数倍。
数据块的格式(Data Block Format)
块中存放表的数据和索引的数据,⽆论存放哪种类型的数据,块的格式都是相同的,块由块头(header/Common and Variable),表⽬录(Table Directory),⾏⽬录(Row Directory),空余空间(Free Space)和⾏数据(Row Data)五部分组成,如下图
块头(header/Common and Variable):存放块的基本信息,如:块的物理地址,块所属的段的类型(是数据段还是索引段)。
表⽬录(Table Directory):存放表的信息,即:如果⼀些表的数据被存放在这个块中,那么,这些表的相关信息将被存放在“表⽬录”中。
⾏⽬录(Row Directory):如果块中有⾏数据存在,则,这些⾏的信息将被记录在⾏⽬录中。这些信息包括⾏的地址等。
⾏数据(Row Data):是真正存放表数据和索引数据的地⽅。这部分空间是已被数据⾏占⽤的空间。
空余空间(Free Space):空余空间是⼀个块中未使⽤的区域,这⽚区域⽤于新⾏的插⼊和已经存在的⾏的更新。
头部信息区(Overhead):我们把块头(header/Common and Variable),表⽬录(Table Directory),⾏⽬录(Row Directory)这三部分合称为头部信息区(Overhead)。头部信息区不存放数据,它存放的整个块的信息。头部信息区的⼤⼩是可变的。⼀般来说,头部信息区的⼤⼩介于84字节(bytes)到107字节(bytes)之间。
数据块中⾃由空间的使⽤
当往数据库中插⼊(INSERT)数据的时候,块中的⾃由空间会减少;当对块中已经存在的⾏进⾏修改(UPDATE)的时候(使记录长度增加),块中的⾃由空间也会减少。
DELETE语句和UPDATE语句会使块中的⾃由空间增加。当使⽤DELETE语句删除块中的记录或者使⽤UPDATE语句把列的值更改成⼀个更⼩值的时候,Oracle会释放出⼀部分⾃由空间。释放出的⾃由空间并不⼀定是连续的。通常情况下,Oracle不会对块中不连续的⾃由空间进⾏合并。因为合并数据块中不连续的⾃由空间会影响数据库的性能。只有当⽤户进⾏数据插⼊(INSERT)或者更新(UPDATE)操作,却不到连续的⾃由空间的时候,Oracle才会合并数据块中不连续的⾃由空间。
对于块中的⾃由空间,Oracle提供两种管理⽅式:⾃动管理,⼿动管理
⾏链接和⾏迁移(Row Chaining and Migrating)
⾏链接(Row Chaining):如果我们往数据库中插⼊(INSERT)⼀⾏数据,这⾏数据很⼤,以⾄于⼀个数据块存不下⼀整⾏,Oracle就会把⼀
⾏数据分作⼏段存在⼏个数据块中,这个过程叫⾏链接(Row Chaining)。如下图所⽰:
如果⼀⾏数据是普通⾏,这⾏数据能够存放在⼀个数据块中;如果⼀⾏数据是链接⾏,这⾏数据存放在多个数据块中。
⾏迁移(Row Migrating):数据块中存在⼀条记录,⽤户执⾏UPDATE更新这条记录,这个UPDATE操作使这条记录变长,这时候,Oracle 在这个数据块中进⾏查,但是不到能够容纳下这条记录的空间,⽆奈之下,Oracle只能把整⾏数据移到⼀个新的数据块。原来的数据块中保留⼀个“指针”,这个“指针”指向新的数据块。被移动的这条记录的ROWID保持不变。⾏迁移的原理如下图所⽰:
⽆论是⾏链接还是⾏迁移,都会影响数据库的性能。Oracle在读取这样的记录的时候,Oracle会扫描多个数据块,执⾏更多的I/O。
块中⾃由空间的⾃动管理
Oracle使⽤位图(bitmap)来管理和跟踪数据块,这种块的空间管理⽅式叫“⾃动管理”。⾃动管理有下⾯的好处:
◆易于使⽤
◆更好地利⽤空间
◆可以对空间进⾏实时调整
块中⾃由空间的⼿动管理
⽤户可以通过PCTFREE, PCTUSED来调整块中空间的使⽤,这种管理⽅式叫⼿动管理。相对于⾃动管理,⼿动管理⽅式⽐较⿇烦,不容易掌握,容易造成块中空间的浪费。
PCTUSED也是⽤于设置⼀个百分⽐,当块中已使⽤的空间的⽐例⼩于这个百分⽐的时候,这个块才被标识为有效状态。只有有效的块才被允许插⼊数据。
PCTFREE参数⽤于指定块中必须保留的最⼩空闲空间百分例,默认值为10。之所以要预留这样的空间,是因为UPDATE时,需要这些空间。如果UPDATE时,没有空余空间,Oracle就会分配⼀个新的块,这会产⽣⾏迁移(Row Migrating)。
例如,假定在Create table语句中指定了pctfree为20,则说明在该表的数据段内每个数据块的20%被作为可利⽤的空闲空间,⽤于更新已在数据块内存在的数据⾏其余80%是⽤于插⼊新的数据⾏,直到达到
80%为⽌。显然,pctfree值越⼩,则为现存⾏更新所预留的空间越少。因此,如果pctfree设置得太⾼,则在全表扫描期间增加I/O,浪费磁盘空间;如果pctfree设置得太低,则会导致⾏迁移。
pctused参数设置了数据块是否是空闲的界限。当数据块的使⽤空间低于pctused的值时,此数据块标志为空闲,该空闲空间仅⽤于插⼊新的⾏。如果数据块已经达到了由pctfree所确定的上边界时,Oracle就认为此数据块已经⽆法再插⼊新的⾏。例如,假定在Create table语句中指定pctused为40,则当⼩于或等于39时,该数据块才是可⽤的。所以,可将数据块填得更满,这样可节省空间,但却增加了处理开销,因为数据块的空闲空间总是要被更新的⾏占据,所以对数据块需要频繁地进⾏重新组织。⽐较低的pctused增加了数据库的空闲空间,但减少了更新操作的处理开销。所以,如果pctused设置过⾼,则会降低磁盘的利⽤率导致⾏迁移;若pctused设置过低,则浪费磁盘空间,增加全表扫描时的I/O输出。pctused是与pctfree相对的参数。
那么,如何选择pctfree和pctused的值呢?有个公式可供参考。显然,pctfree和pctused的之和不能超过100。若两者之和低于100,则空间的利⽤与系统的I/O之间的最佳平衡点是:pctfree与pctused之和等于100%减去⼀⾏的⼤⼩占块空间⼤⼩的百分⽐。例如,如果块⼤⼩为2048字节,则它需要100个字节的开销,⽽⾏⼤⼩是390字节(为可⽤块的20%)。为了充分利⽤空间,pctfree与pctused之和最好为80%。
那么,怎样确定数据块⼤⼩呢?有两个因素需要考虑:
⼀是数据库环境类型。例如,是DSS环境还是OLTP环境?在数据仓库环境(OLAP或DSS)下,⽤户需要进⾏许多运⾏时间很长的查询,所以应当使⽤⼤的数据块。在OLTP系统中,⽤户处理⼤量的⼩型事务,采⽤较⼩数据块能够获得更好的效果。
⼆是SGA的⼤⼩。数据库缓冲区的⼤⼩由数据块⼤⼩和初始化⽂件的db_block_buffers参数决定。最好设为操作系统I/O的整数倍。
(以上摘⾃)
2.数据区(Extent)
是⼀组连续的数据块。当⼀个表、回滚段或临时段创建或需要附加空间时,系统总是为之分配⼀个新的数据区。⼀个数据区不能跨越多个⽂件,因为它包含连续的数据块。使⽤区的⽬的是⽤来保存特定数据类型的数据,也是表中数据增长的基本单位。在Oracle数据库中,分配空间就是以数据区为单位的。⼀个Oracle对象包含⾄少⼀个数据区。设置⼀个表或索引的存储参数包含设置它的数据区⼤⼩。
3.段(Segment)
是由多个数据区构成的,它是为特定的数据库对象(如表段、索引段、回滚段、临时段)分配的⼀系列数据区。段内包含的数据区可以不连续,并且可以跨越多个⽂件。使⽤段的⽬的是⽤来保存特定对象。
⼀个Oracle数据库有4种类型的段:
数据段:数据段也称为表段,它包含数据并且与表和簇相关。当创建⼀个表时,系统⾃动创建⼀个以该表的名字命名的数据段。
索引段:包含了⽤于提⾼系统性能的索引。⼀旦建⽴索引,系统⾃动创建⼀个以该索引的名字命名的索引段。
回滚段:包含了回滚信息,并在数据库恢复期间使⽤,以便为数据库提供读⼊⼀致性和回滚未提交的事务,即⽤来回滚事务的数据空间。当⼀个事务开始处理时,系统为之分配回滚段,回滚段可以动态创建和撤销。系统有个默认的回滚段,其管理⽅式既可以是⾃动的,也可以是⼿⼯的。
临时段:它是Oracle在运⾏过程中⾃⾏创建的段。当⼀个SQL语句需要临时⼯作区时,由Oracle建⽴临时段。⼀旦语句执⾏完毕,临时段的区间便退回给系统。
4.表空间(tablespace)
是数据库的逻辑划分。任何数据库对象在存储时都必须存储在某个表空间中。表空间对应于若⼲个磁盘⽂件,即表空间是由⼀个或多个磁盘⽂件构成的。表空间相当于操作系统中的⽂件夹,也是数据库逻辑结构与物理⽂件之间的⼀个映射。每个数据库⾄少有⼀个表空间(system tablespace),表空间的⼤⼩
等于所有从属于它的数据⽂件⼤⼩的总和。
(1)系统表空间(system tablespace)
是每个Oracle数据库都必须具备的。其功能是在系统表空间中存放诸如表空间名称、表空间所含数据⽂件等数据库管理所需的信息。系统表空间的名称是不可更改的。系统表空间必须在任何时候都可以⽤,也是数据库运⾏的必要条件。因此,系统表空间是不能脱机的。
系统表空间包括数据字典、存储过程、触发器和系统回滚段。为避免系统表空间产⽣存储碎⽚以及争⽤系统资源的问题,应创建⼀个独⽴的表空间⽤来单独存储⽤户数据。
(2)SYSAUX表空间
是随着数据库的创建⽽创建的,它充当SYSTEM的辅助表空间,主要存储除数据字典以外的其他对象。SYSAUX也是许多Oracle 数据库的默认表空间,它减少了由数据库和DBA管理的表空间数量,降低了SYSTEM表空间的负荷。
(3)临时表空间
相对于其他表空间⽽⾔,临时表空间(temp tablespace)主要⽤于存储Oracle数据库运⾏期间所产⽣的
临时数据。数据库可以建⽴多个临时表空间。当数据库关闭后,临时表空间中所有数据将全部被清除。除临时表空间外,其他表空间都属于永久性表空间。
(4)撤销表空间
⽤于保存Oracle数据库撤销信息,即保存⽤户回滚段的表空间称之为回滚表空间(或简称为RBS撤销表空间(undo tablespace))。在Oracle8i中是rollback tablespace,从Oracle9i开始改为undo tablespace。在Oracle 10g中初始创建的只有6个表空间sysaux、system、temp、undotbs1、example和users。其中temp是临时表空间,undotbs1是undo撤销表空间。
(5)USERS表空间
⽤户表空间,⽤于存放永久性⽤户对象的数据和私有信息。每个数据块都应该有⼀个⽤户表空间,以便在创建⽤户是将其分配给⽤户。
⼆、物理结构
Oracle物理结构包含了数据⽂件、⽇志⽂件和控制⽂件
1.数据⽂件
每⼀个ORACLE数据库有⼀个或多个物理的数据⽂件(data file)。⼀个数据库的数据⽂件包含全部数据库数据。逻辑数据库结构(如表、索引)的数据物理地存储在数据库的数据⽂件中。数据⽂件有下列特征:
⼀个数据⽂件仅与⼀个数据库联系。
⼀旦建⽴,数据⽂件不能改变⼤⼩.
⼀个表空间(数据库存储的逻辑单位)由⼀个或多个数据⽂件组成。
数据⽂件中的数据在需要时可以读取并存储在ORACLE内存储区中。例如:⽤户要存取数据库⼀表的某些数据,如果请求信息不在数据库的内存存储区内,则从相应的数据⽂件中读取并存储在内存。当修改和插⼊新数据时,不必⽴刻写⼊数据⽂件。为了减少磁盘输出的总数,提⾼性能,数据存储在内存,然后由ORACLE后台进程DBWR决定如何将其写⼊到相应的数据⽂件。
2.⽇志⽂件
每⼀个数据库有两个或多个⽇志⽂件(redo log file)的组,每⼀个⽇志⽂件组⽤于收集数据库⽇志。⽇志的主要功能是记录对数据所作的修改,所以对数据库作的全部修改是记录在⽇志中。在出现故障时,如果不能将修改数据永久地写⼊数据⽂件,则可利⽤⽇志得到该修改,所以从不会丢失已有操作成果。
⽇志⽂件主要是保护数据库以防⽌故障。为了防⽌⽇志⽂件本⾝的故障,ORACLE允许镜象⽇志(mirrored redo log),以致可在不同磁盘上维护两个或多个⽇志副本。
⽇志⽂件中的信息仅在系统故障或介质故障恢复数据库时使⽤,这些故障阻⽌将数据库数据写⼊到数据库的数据⽂件。然⽽任何丢失的数据在下⼀次数据库打开时,ORACLE⾃动地应⽤⽇志⽂件中的信息来恢复数据库数据⽂件。
Oralce两种⽇志⽂件类型:
联机⽇志⽂件
这是Oracle⽤来循环记录数据库改变的操作系统⽂件
归档⽇志⽂件
这是指为避免联机⽇志⽂件重写时丢失重复数据⽽对联机⽇志⽂件所做的备份
Oracle有两种归档⽇志模式,Oracle数据库可以采⽤其中任何⼀种模式:
NOARCHIVELOG
不对⽇志⽂件进⾏归档。这种模式可以⼤⼤减少数据库备份的开销,但可能回导致数据的不可恢复
ARCHIVELOG
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论