4Oracle服务器结构和组成Word下载.docx
- 文档编号:17353060
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:28
- 大小:305.95KB
4Oracle服务器结构和组成Word下载.docx
《4Oracle服务器结构和组成Word下载.docx》由会员分享,可在线阅读,更多相关《4Oracle服务器结构和组成Word下载.docx(28页珍藏版)》请在冰豆网上搜索。
Oracle服务器是一个具有高性能和高可靠性面向对象关系型数据库管理系统,也是一个高效的SQL语句执行环境,Oracle服务器在结构上包含很多部分,将在以下各节中分别论述。
1.1.1Oracle服务器总体结构
Oracle服务器同运行在操作系统下的很多程序一样,通过在后台运行一组可执行程序、在内存中开辟程序运行的存储区域并在磁盘上存储数据来进行运作。
在结构上,Oracle服务器(OracleServer)由实例(Instance)和数据库(Database)两大部分构成。
实例是一组内存结构和Oracle后台进程的集合;
数据库在物理上由多个操作系统文件组成,其中主要包括数据文件、控制文件和重做日志文件。
Oracle服务器=实例+数据库。
在Oracle服务器的组成部分中,有些部分是处理SQL语句必须的,其他的部分则是为了改进数据库的性能,在发生软硬件故障时确保能够对数据库进行恢复,或完成其它的数据库维护工作。
图4-1是Oracle服务器的构成示意图。
Oracle服务器具备以下的特点:
•能够可靠的进行多用户环境下大量数据的处理,允许多用户同时访问相同的数据。
•保证数据访问的高性能。
•有效防止对数据的非法访问。
•对于故障恢复提供高效的解决方案。
图4-1Oracle服务器结构示意图
除了以上部分,Oracle服务器还包含用于验证用户权限、进行系统配置和用于数据库故障恢复的一些非数据库文件;
以及用于处理SQL语句执行的用户进程和服务进程。
1.1.2Oracle实例
如前所述,实例由内存结构和后台进程组成,如图4-2所示。
要访问数据库,首先要启动实例,启动实例时会分配内存并启动后台进程。
每个实例在同一时刻只能打开一个数据库,这样数据库才能够使用。
实例运行后,用户就可以访问实例,由实例来访问数据库。
实例在用户和数据库之间充当中间层。
Oracle实例=内存结构+后台进程。
内存结构描述的就是Oracle数据库对内存的使用构成。
Oracle内存结构被总称为SGA(SystemGlobalArea),主要包括数据高速缓存、重做日志缓冲区和共享池三部分。
而后台进程则主要包括以下几个进程SMON、PMON、DBWn、CKPT、LGWR和ARCn。
图4-2实例结构示意图
1.1.3Oracle数据库
Oracle数据库不仅包含了用于存放数据的数据文件(Datafiles),而且.也包含了用于维护这些数据信息所需要的控制文件(Controlfiles)和重做日志文件(Onlineredologfiles),如图4-3所示。
图4-3数据库结构示意图
数据文件是用于存储数据库数据的物理文件。
在数据文件中存储着数据字典、用户数据以及回滚段(RollbackSegment)数据,Oracle数据库至少要包含一个数据文件。
重做日志用于记录数据库变化,当执行DML(INSERT、UPDATE、DELETE)或DDL(CREATE、ALTER、DROP)语句时,Oracle会将这些变化信息记载到重做日志中,以避免出现意外情况时的数据丢失,使用重做日志的目的是为了在出现意外情况时恢复数据库,Oracle数据库至少要包含两个或两个以上的重做日志。
控制文件是用于记录完整性和维护Oracle数据库的重要物理文件,Oracle数据库至少要包含一个控制文件。
Oracle数据库=数据文件+控制文件+重做日志文件。
除了以上三种文件之外,Oracle还包含了参数文件(Parameterfile)、口令文件(Passwordfile)、归档日志(Archivedredologfiles)、以及跟踪文件和警告文件等,这些文件属于非数据库文件,会在以后的部分进行详细介绍。
1.2Oracle内存结构
Oracle的内存由系统全局区(SystemGlobalArea,简称SGA)和程序全局区(ProgramGlobalArea,简称PGA)组成。
SGA是一组由Oracle分配的共享内存区域,用户和进程可以共享其中的信息,在实例启动时分配。
当实例启动时,SGA存储区被自动分配,当实例关闭时,存储区被回收。
在启动数据库实例时,可以看到SGA分配的信息
SQL>
STARTUPNOMOUNT
ORACLE例程已经启动。
TotalSystemGlobalArea34675092bytes
FixedSize453012bytes
VariableSize29360128bytes
DatabaseBuffers4194304bytes
RedoBuffers667648bytes
在实例启动后也可用SHOWSGA(或SELECT*FROMv$sga)显示SGA信息。
PGA是数据库服务器内存中为进程分配的专用的内存区域,是进程私有的内存区,在进程启动时分配。
1.2.1系统全局区SGA
SGA由以下部分组成,如图4-4所示:
•数据高速缓冲区(DataBufferCache)
•重做日志缓冲区(RedoLogBuffer)
•共享池(SharedPool)
•Java池(JavaPool)
•大池(LargePool)
图4-4SGA结构示意图
SGA越大系统的性能越好,但SGA过大也会起到反作用。
一般情况下,SGA不应超过系统实际内存的1/2。
但从Oracle9i开始支持动态SGA特性,即无需关闭实例就可以改变数据高速缓冲区、共享池和大池的大小。
数据高速缓冲区、共享池的大小也可以根据工作负载自动调整,但SGA的总大小不能超过初始化参数SGA_MAX_SIZE的设置。
初始化参数的设置在后续章节介绍。
影响SGA大小的主要初始化参数有以下几个:
•DB_CACHE_SIZE:
用于缓冲标准数据块的数据高速缓冲区大小。
UNIX系统下默认为48MBNT系统下默认52MB。
•LOG_BUFFER:
重做日志缓冲区大小,以字节为单位。
•SHARED_POOL_SIZE:
共享池大小,以字节为单位。
用于存储共享SQL和PL/SQL的,默认16M,对64位默认64MB。
•LARGE_POOL_SIZE:
大池的大小,默认为0。
•JAVA_POOL_SIZE:
Java池大小,默认24MB。
SGA的总容量=数据高速缓冲区+重做日志缓冲区+共享池+Java池+大池。
SGA的分配单位是granule,granule是连续的虚拟内存分配单位,它的大小取决于参数SGA_MAX_SIZE的大小,当SGA小于128M时为4M,否则为16M。
当动态改变SGA大小时,也是取值为granule的整数倍。
假设当前granule的大小为4M,如果要把DB_CACHE_SIZE设置为14M,实际分配时将为16M,取granule的整数倍。
1.数据高速缓冲区(DatabaseBufferCache)
在Oracle中无论是读取还是修改数据,都是由服务器进程在数据高速缓冲区中完成的。
数据高速缓冲区的作用就是用来缓存最近从数据库中读出的数据块,并可供其他客户进程共享。
用户进程查看数据时,首先检查需要的信息是否在缓冲区内,如果在缓冲区中,就可以直接访问,否则访问物理文件并读取数据块到缓冲区。
我们知道内存的读写速度要比物理设备的读写速度快很多,这样就可以大大提高Oracle数据库的性能。
数据库高速缓冲区分为默认缓冲区、保留缓冲区和循环缓冲区3个子缓冲区,由以下参数决定每部分的大小:
•DB_CACHE_SIZE,默认缓冲区的大小,不能设置为0。
•DB_KEEP_CACHE_SIZE,保留缓冲区的大小,用来保留在内存中最有可能重用的数据块。
•DB_RECYCLE_CACHE_SIZE,循环缓冲区的大小,用来消除在内存中很少有机会重用的数据块。
在Oracle9i中可以定义非标准块,即不同于标准块尺寸的数据块。
非标准块将使用不同的数据高速缓冲区。
其中DB_BLOCK_SIZE用于定义标准块的尺寸,DB_CACHE_SIZE用于指定标准块的数据高速缓存尺寸,而DB_nK_CACHE_SIZE可用于指定其他非标准块的数据高速缓冲区尺寸,其中N为2、4、8、16或32。
数据高速缓存的实际尺寸就是标准块和非标准块的数据高速缓存尺寸的和。
另外,在SGA中包含了类似于队列的LRU列表和脏列表,这两个列表用于记载数据高速缓存中缓冲区的使用情况。
根据缓冲数据块的状态,Oracle将数据高速缓冲区可划分成:
•脏缓冲区(DirtyBuffer)
•自由缓冲区(FreeBuffer)
•忙缓冲区(PinnedBuffer)
当执行INSERT、UPDATE或DELETE时,会对缓冲区内容进行修改,这样缓冲区的内容就会和相对应的数据文件数据不一致,这时缓冲区标识为“脏缓冲区”。
当“脏缓冲区”的内容被写入数据文件后,因为该缓冲区与相应数据文件部分内容一致,所以将这些缓冲区称为“自由缓冲区”。
另外当执行SELECT语句时,会将对应数据文件部分数据读取到数据高速缓存的相应缓冲区,因为缓冲区与数据块内容完全一致,所以这些缓冲区也被称为“自由缓冲区”。
而“忙缓冲区”是指服务器进程正在访问的缓冲区。
“脏列表”的作用就是记录脏缓冲区的情况。
如果某些缓冲区中的数据块被修改,就会加入该列表,只有脏列表中的缓冲区数据块需要写回数据库文件,一旦写回数据库文件,缓冲区就会从脏列表中清除。
Oracle用LRU(LeastRecentlyUsed)算法来管理数据高速缓冲区。
该算法将最近使用的数据块按照使用时间的早晚排成队列,当缓冲区占满后,调入新的数据块时,必须清除已有的数据块,来获得空闲数据块空间,那么,最合理的选择就是清除最早没有使用数据块,因为使用该块的概率相对比较小。
通过规划SGA时合理地设置数据高速缓存的尺寸,尽量的避免缓冲区占满的情况发生,否则就会降低系统的效率。
图4-5缓冲区工作示意图
如图4-5所示,假定数据高速缓存包括10个缓冲区,数据已经占满了这10个缓冲区,并且B1是最早访问(LRU部分)的缓冲区,而B10是最近访问(MRU部分)的缓冲区。
假定此时客户端需要访问新数据,并且要访问的数据不在这10个缓冲区中,那么服务进程会清除LRU部分的B1缓冲区数据,并且将新数据块Bll的数据放到该缓冲区中,并且将该缓冲区标识为“最近访问”的缓冲区;
如果用户所要访问的数据在缓冲区中已经存在,“服务进程”将直接读取或修改其数据,并将对应缓冲区标识为“最近访问”的缓冲区。
LRU(LeastRecentlyUsed)列表按照LRU算法存放缓冲区访问的先后信息。
我们可以回顾一下数据高速缓存工作原理,初始阶段LRU列表中所记载的缓冲区列表顺序为B1、B2、B3、B4、B5、B6、B7、B8、B9、B10,而当读取B11数据块数据时,服务器进程会清除B1数据,此时LRU列表顺序则转变为B2、B3、B4、B5、B6、B7、B8、B9、B10、Bll。
接下来,假定用户要访问的数据存在于B7缓冲区中,此时LRU列表则转变为B2、B3、B4、B5、B6、B8、B9、B10、B11、B7。
【实例5-1】动态的重新设置数据库高速缓冲区的大小。
1)以管理员身份登录
CONNECT/ASSYSDBA
已连接。
2)显示DB_CACHE_SIZE的大小
SHOWPARAMETERdb_cache_size;
NAMETYPEVALUE
------------------------------------------------
db_cache_sizebiginteger4194304
3)动态修改DB_CACHE_SIZE的大小为24M
ALTERSYSTEMSETdb_cache_size=24M
系统已更改。
4)重新显示DB_CACHE_SIZE的大小
结果略
2.重做日志缓冲区(RedoLogBuffer)
当运行Oracle服务器的时候,如果突然断电或系统瘫痪,会不会造成数据的丢失?
Oracle提供了一套复杂的机制来维护数据完整性,并最终确保数据不会丢失。
这就是重做日志文件的作用。
重做日志缓冲区用来记录对数据缓冲区数据进行的修改,可以循环使用。
当用户运行DML(INSERT、UPDATE、DELETE)以及DDL(CREATE、ALTER、DROP)语句时,会改变数据高速缓存中的相应缓冲区。
但是在修改这些缓冲区之前,Oracle会自动生成重做项,首先要将这些缓冲区的变化记载到“重做日志缓冲区”中。
重做日志缓冲区由一条一条的重做项构成,每条重做项记载了被修改的块、修改位置以及新数据。
缓冲区被循环使用,当重做日志缓冲区填满时,数据库系统将重做日志缓冲区的内容写入日志文件。
在系统发生故障时,可以通过重做项重新执行对数据库的修改,实现对实例的恢复。
重做日志缓冲区的大小由LOG_BUFFER初始化参数来决定。
3.共享池(SharedPool)
共享池是程序使用的高速缓冲区,用来存放解析过的SQL语句、PL/SQL代码、过程和包、数据字典、锁、字符集信息,安全属性等。
共享池由库高速缓冲区(LibraryCache)和数据字典高速缓冲区(DataDictionaryCache)组成,如图4-6所示。
库缓冲区用来存储最近执行的SQL语句;
数据字典缓冲区用来存储最近使用的数据定义。
共享存储区的大小由SHARED_POOL_SIZE初始化参数来决定。
同数据高速缓冲区一样,它的大小可以动态的修改,但是SGA的总大小不能超过SGA_MAX_SIZE的设置。
共享池包含固定和可变的结构。
固定结构保持相对不变,可变结构根据用户和程序的需求可以改变大小。
它们的大小由初始化参数和Oracle内部工作算法计算。
1)库高速缓冲区(LibraryCache)
库高速缓冲区又可分为共享SQL区和共享PL/SQL区。
共享SQL区用来存放最近执行的SQL语句信息,包括语句文本、解析树及执行计划。
执行计划就是Oracle为执行特定的SQL语句,产生的优化的执行步骤。
库高速缓冲区由许多上下文区(ContextArea)组成,SQL语句和执行计划存放在相应上下文区中,并且不同SQL语句分别对应于不同的上下文区。
当客户端运行SQL语句时,服务器进程首先检查是否存在对应于该SQL语句的上下文区,若存在,则按照其执行计划直接执行该SQL语句;
否则生成SQL语句执行计划,并将执行计划、SQL语句存放到相应上下文区中,然后执行该SQL语句。
在开发应用程序时,必须要注意使用标准格式来编写SQL语句,使得SQL语句尽可能共享上下文区,以降低SQL语句解析次数,进而提高应用性能。
在解析SQL语句时,认为完全相同的SQL语句有以下特点:
•语句文本相同。
•大小写相同。
•赋值变量相同。
共享PL/SQL区用来存放最近执行的PL/SQL语句,解析和编译过的程序单元和过程(函数、包和触发器)也存放在此区域。
类似于数据高速缓冲区,Oracle也是使用LRU算法来管理库高速缓存的。
通过库高速缓存,可以最小化SQL语句解析次数,进而提高应用程序的性能。
2)数据字典高速缓冲区(DataDictionaryCache)
在Oracle数据库中,数据库的一些信息,包括账户、数据文件、表的描述、用户权限等信息,存储在数据字典表中,数据字典表被存放在SYSTEM表空间的数据文件中。
因为执行任何SQL语句都需要访问数据字典,所以为了提高数据字典的访问性能,Oracle在共享池中专门为存放数据字典信息分配了内存空间,这些内存空间被称为数据字典高速缓冲区。
用来缓存来自于数据字典的定义。
例如,当用户执行"
SELECT*FROMempWHEREempno=7788"
语句时,Oracle需要查询数据字典dba_tables确定表emp是否存在;
如果该表已经存在,还需要查询数据字典dba_tab_columns确定列empno在表emp中是否存在,然后才能生成执行计划。
这些定义在首次查询时存入数据字典高速缓冲区,在后续过程中用到就可以直接使用,而不必重新查询数据字典。
4.大池(LargePool)
大型存储区是SGA的可选区域,对于Oracle的备份和恢复以及执行具有大量排序工作的SQL语句等特定的数据库操作,需要使用大量的缓存,这时可以创建大池,否则上述操作使用的存储空间将在共享存储区或PGA中分配,影响共享存储区或PGA使用的效率。
大池的大小由LARGE_POOL_SIZE初始化参数来决定,可以动态修改。
注意:
大池不使用LRU算法。
5.JAVA池(JavaPool)
Java池是SGA的可选区域,用来为Java命令解析提供内存。
只有在安装和使用JAVA时才需要JAVA池。
Java池的大小由JAVA_POOL_SIZE初始化参数来决定。
Oracle9i默认的大小是24M。
1.2.2程序全局区PGA
当客户进程访问Oracle服务器时,会在Oracle服务器端为用户进程分配相应的服务进程,并且为该服务进程分配相应的内存空间来存放其数据和控制信息,每一个后台进程也同样需要为其分配专用的存储空间,这块内存空间被称为程序全局区(ProgramGlobalArea或ProcessGlobalArea)。
如图4-7表示为服务进程专门分配PGA存储区。
所有进程都可共享SGA,而PGA是非共享的。
当建立服务进程或后台进程时,Oracle会自动为其分配PGA;
而当服务进程或后台进程终止时,Oracle会自动释放PGA所占用的内存空间。
根据专有和共享服务器模式的不同,PGA的内存也会发生变化,但大致可分为三部分:
1.私有SQL区(PrivateSQLArea)
私有SQL区包含绑定信息和运行时内存结构信息。
每个发出SQL语句的会话都有自己的私有SQL区。
每个提交相同的SQL语句的用户都有自己的SQL区,它们使用同一个共享的SQL区。
所以许多私有SQL区与一个相同的共享SQL区相关联。
游标的私有SQL区分成2个区:
驻留区(Persistentarea):
包含绑定信息,只有在游标关闭后才释放。
执行时间区(Run-timearea):
当执行请求的第一步创建,对于INSERT,UPDATE,和DELETE命令,这个区域当语句执行后释放;
对于查询,只有所有行取出后或查询取消后该区域才释放。
私有SQL区即可位于SGA也可位于PGA。
对专有服务器模式私有SQL区位于服务进程的PGA区;
对共享服务器模式私有SQL区位于SGA。
私有SQL区管理由用户进程完成,一个用户进程可以分配的游标私有SQL区个数由OPEN_CURSORS初始化参数限定,默认值是50。
2.会话内存(SessionMemory)
会话内存是为会话变量和会话有关信息分配的内存。
对共享服务器模式,会话内存也是共享的。
3.SQL工作区(SQLWorkAreas)
SQL工作区用于排序(Sort)哈斯连接(Hash-join)位图(Bitmap)合并和位图创建。
该区域大小即可控制也可以自动调整。
从Oracle9i开始,通过设置初始化参数WORKAREA_SIZE_POLICY(默认值为TRUE)和PGA_AGGREGATE_TARGET,工作区可以自动的进行全局管理。
PGA_AGGREGATE_TARGET参数设置实例的PGA目标总量,可以动态的修改。
当设置了此参数,所有的工作区大小就变为自动修改。
在Oracle9i之前,控制SQL工作区的最大尺寸,是通过设置以下参数:
SORT_AREA_SIZE、HASH_AREA_SIZE、BITMAP_MERGE_AREA_SIZE和CREATE_BITMAP_AREA_SIZE完成的。
1.3Oracle进程结构
Oracle的进程分为用户进程、服务器进程和后台进程。
用户进程是在客户机内存上运行的程序,在用户请求连接Oracle数据库时建立。
用户进程不能直接同Oracle服务器交互,而是把操作请求提交给服务进程。
服务进程是在用户同Oracle数据库建立会话之后自动在服务器端创建的进程。
服务进程直接同Oracle服务器交互,执行用户请求并返回结果。
服务进程有专有和共享之分。
后台进程属于Oracle实例的一部分,Oracle的后台进程的作用是对数据进行操作,并维护数据库系统,使其始终处于良好的状态。
每个系统进程的大部分操作都是相互独立的。
1.3.1用户进程与服务器进程
如果用户要提交并执行SQL语句,在用户的客户机上,要运行一个程序如SQL*Plus或其他应用程序,这个程序是作为用户进程(UserProcess)运行的。
当用户需要连接到Oracle服务器时,在Oracle服务器上会启动一个与用户进程对应的进程来为用户进程服务,这个进程称为服务进程(ServerProcess)。
注意,服务进程总是运行在Oracle服务器上面的,而用户进程既可以运行在服务器上面,也可以运行在客户机上面。
图4-9数据库访问示意图
下面通过举例说明服务进程的工作过程,比如去餐馆用餐,客户自己不能去厨房取菜,而需要一个服务员为我们服务,我们只要把点菜单交给服务员,由服务员为我们传达信息并进行用餐的服务。
服务进程的作用好比餐馆的服务员,接收用户进程的请求并返回结果。
客户通过用户进程和服务进程访问Oracle服务器的过程如图4-9所示。
用户进程同服务进程通讯,需要建立一个连接,最简单的情况是用户进程同服务进程位于同一台机器,可通过内部进程通讯机制进行连接;
用户也可
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle 服务器 结构 组成