一、几个重要的Oracle术语
Oracle服务器:即Oracle server,由Oracle实例和Oracle数据库组成。
Oracle实例:即Oracle instance,是在Oracle启动的第一个阶段根据参数文件,生成的一系列的后台进程和一块共享内存SGA共同组成。
Oracle数据库:即Oracle database,是由Oracle所有的物理文件所组成。其中最关键的有:控制文件、数据文件、redo log文件等。
Oracle实例与Oracle数据库进行交互,Oracle实例来对数据库进行各种操作,从而对外提供数据库的存储和检索服务。
二、Oracle数据库的整体架构
Oracle server由Oracle instance和Oracle database组成。而Oracle instance又由后台进程和共享内存组成,所以Oracle的结构又包含了内存结构和进程结构;而Oracle database由物理文件组成,所以Oracle结构也包含了存储结构。
三、Oracel实例的整体架构
实例由内存和后台进程组成,它暂时存在于RAM和CPU中。当关闭运行的实例时,实例将随即消失。数据库由磁盘上的物理文件组成,不管在运行状态还是停止状态,这些文件就一直存在。因此,实例的生命周期就是其在内存中存在的时间,可以启动和停止。一旦创建数据库,数据库将永久存在。通俗的讲数据库就相当于平时安装某个程序所生成的安装目录,而实例就是运行某个程序时所需要的进程及消耗的内存。
Oracle的内存架构包含两部分系统全局区(SGA)和程序全局区(PGA)。
3.1程序全局区
当Oracle创建一个服务器进程的同时要为该服务器进程分配一个内存区,该内存区称为程序全局区(program glogal area,PGA)。它随着进程的创建而被分配,随着进程的终止而被回收。
3.2系统全局区
在操作系统提供的共享内存段实现的内存结构称为系统全局区(SGA)。SGA在实例启动时分配,在关闭时释放。由上图可知SGA至少包含三种数据结构:数据库缓冲区缓存、日志缓冲区及共享池,还可能包括:大池、JAVA池。
3.2.1共享池(shared pool)
共享池是由库高速缓存(library cache)和数据字典高速缓存(data dictionary cache)两部分组成。主要作用是提高SQL语句以及PL/SQL语句的执行效率,缓存执行过的SQL语句,执行计划;PL/SQL语句的代码块、执行码等(该部分称为library cache);以及在编译SQL, PL/SQL语句时参照的数据字典信息(该部分称为dictionary cache或row cache),是SGA中最重要的部分之一。
a.库缓存是内存区域,按其已分析的格式存储最近执行的代码。分析就是将编程人员编写的代码转换为可执行的代码,这是Oracle根据需要执行的一个过程。通过将代码缓存在共享池,可以在不重新分析的情况下重用,极大地提高性能。
b.数据字典缓存有时称为“行缓存”,它存储最近使用的对象定义:表、索引、用户和其他元数据定义的描述。通过将此类定义放在SGA的内存中,以便使所有会话可以直接访问它们,而不是被迫从磁盘上的数据字典中重复读取它们,从而提高分析性能。
c.PL/SQL区:存储的PL/SQL对象是过程、函数、打包的过程、打包的函数、对象类型定义和触发器。它们全都像源代码那样存储在数据字典中,也使用已编译的格式。当会话调用存储的PL/SQL对象时,它必须从数据字典读取。为了避免重复读取,将对象缓存到共享池的PL/SQL区。
共享池的大小对性能产生重要影响,它应该足够大,以便缓存所有频繁执行的代码和频繁访问的对象定义,但也不能过大,以至于连仅执行一次的语句也要缓存。如果共享池过小,则性能下降,因为服务器会话将反复抢夺其中的空间来分析语句,此后,这些语句会被其他语句重写,在重新执行时,将不得不再次分析。过大的共享池也会对性能产生不良影响,因为搜索需要的时间过长。
3.2.2数据库缓冲区(database buffer cache)
主要作用是缓存曾经读取过的数据块,Oracle数据库中对数据的所有修改操作都是在buffer cache中进行的。因为所有的操作都必须先将物理文件上的数据块读取到buffer cache中,然后才能进行各种操作,是SGA中最重要的部分之一。
数据库缓冲区是oracle用来执行SQL的工作区域。在更新数据时,用户会话不直接更新磁盘上的数据,而是首先复制到数据库缓冲区缓存。更改应用于数据库缓冲区缓存中这些数据块的副本,块将在缓存中保留一段时间,直至其占有的缓冲区需要缓存另一块为止。在查询数据时,数据也要经过缓存。会话计算出那些块包含关键的行,并将它们复制到数据库缓冲区缓存。此后,相关行传输到会话的PGA作进一步处理。此后数据块会在数据库缓存区缓存中保留一段时间。
理想状况下,包含频繁访问的数据的所有块将位于数据库缓冲区缓存中,从而最大程度地减少磁盘I/O的需要。如果缓冲区的缓存中存储的块的映像与磁盘上的映像不同,那么这样的缓冲区常称为“脏缓冲区”。脏缓冲区必须写回到数据文件,然后缓冲区又变得干净了。
数据库缓冲区缓存的大小会对性能产生至关重要的影响。缓存应足够大,以便能缓存所有频繁访问的块,但也不能太大,以至于它会缓存极少使用的块。如果缓存过小,那么将导致磁盘活动过多。
3.2.3重做日志缓冲区(redo log buffer)
日志缓冲区是小型的、用于短期存储将写入到磁盘上的重做日志的变更向量的临时区域。"变更向量"是应用于某些对象的修改,执行DML语句会生成应用于数据的变更向量。有了重做日志,数据库就保证数据永不丢失,每当数据块放生变更时,都会将应用于块的变更向量写到重做日志,如果需要还原数据文件,则通过重做日志,可以将变更向量提取并应用于数据文件备份。
会话服务器进程不将重做记录直接写入到重做日志文件,否则,每当执行DML语句时,会话将不得不等待磁盘I/O操作完成。相反,会话将重做记录写入内存中的日志缓冲区。这样做的速度将远比写入磁盘快。此后,日志缓冲区写出到重做日志文件。写操作由日志写入器后台进程(LGWR)完成。
3.2.4大池(large pool)
大池是一个可选区域,如果创建了大池,则那些在不创建大池的情况下使用共享池内存的不同进程将自动使用大池。大池的一个主要用途是供共享的服务器进程使用。在缺少大池的情况下,这些进程将使用共享池中的内存,将导致对共享池的恶性竞争。如果使用的是共享服务器或并行服务器,那么始终应该创建大池。设置大池的大小与性能无关,如果某个进程需要大内存池,而内存不够用,则此进程将失败并发生错误。如果分配的内存超过需要,语句的执行速度并不会因此加快。
3.2.5JAVA池
只有当应用程序需要在数据库中运行java存储程序时,才需要java池。
四、Oracle进程结构
Oracle的进程主要有后台进程和Server process。后台进程主要对Oracle数据库进程各种维护和操作,而Server process主要来处理用户的请求。用户进程通过监听器来访问Oracle instacne,那么就会触发生成一个Server process进程,来对该用户进程的请求进程处理。后台进程一般有:LGWR, DBWn, ARCn, CKPT, SMON, PMON等等。
(1)DBWn(database writer数据库写进程):
主要作用是将被修改过的buffer cache按照一定的条件写入物理磁盘。
(2)LGWR(log writer,日志写进程):
主要作用是将log buffer中的redo log记录按照一定的条件写入联机的redo log文件。
(3)CKPT(checkpoint,检查点进程):
主要作用是将检查点位置(checkpoint position)写入控制文件和数据文件的头部。
(4)SMON(system monitor,系统监控进程):
主要作用是在数据库启动时,判断实例上次是否正常关闭,如果是非正常关闭,则进程实例恢复。另外,还会合并相连的可以空间。
(5)PMON(process monitor,进程监控):
监控Server process, 如果Server process非正常关闭,则PMON负责清理它占用的各种资源。
(6)ARCn(Archiver process,归档进程):
将切换后的重做日志文件复制到归档日志文件,可以看作是重做日志的备份,Oracle实例能够拥有10个ARCn进程(ARC0~ARC9)。
五、Oracle存储结构
Oracle数据库有物理结构和逻辑结构。数据库的物理结构是数据库中的操作系统文件的集合。数据库的物理结构由数据文件、控制文件和重做日志文件组成。
(1)数据文件(data files):数据文件是数据的存储仓库。
(2)联机重做日志文件(online redo log files):联机重做日志文件包含对数据库所做的更改记录,在发生故障时能够恢复数据。重做日志文件包含联机重做日志文件(对于连续的数据库操作时必须的)和归档日志文件(对于数据库操作是可选的,但对于时间点恢复是必须的)。
(3)控制文件(control files):控制文件包含维护和验证数据库完整性的必要的信息。控制文件虽小,但作用非常大。它包含指向数据库其余部分的指针:联机重做日志文件和数据文件的位置,以及更新的归档日志文件的位置。它还存储着维护数据库完整性所需的信息。
除了三个必须的文件外数据库还能有其它非必须的文件如:参数文件、口令文件及归档日志文件。
(1)实例参数文件:当启动oracle实例时,SGA结构会根据此参数文件的设置内置到内存,后台进程会据此启动。
(2)口令文件:用户通过提交用户名和口令来建立会话。Oracle根据存储在数据字典的用户定义对用户名和口令进行验证。
(3)归档重做日志文件:当重做日志文件满时将重做日志文件进行归档以便还原数据文件备份。