一.oracle内部存储结构,包括内存缓冲池与后台进程。
1、系统全局区(SGA):用来存储最近从数据库查询的数据。数据块缓存区和SQL共享池(Shared SQL Pool)是SGA的最大部分,一般占SGA内存的95%以上。通过减少对数据文件的I/O次数,这些存储区域可以改善数据库的性能。
-----数据块缓冲区:数据块缓存区(data block buffer cache)是SGA中的一个高速缓存区域,用来存储从数据库中读取数据段的数据块(如表、索引和簇)。数据块缓存区的大小由数据库服务器init.ora文件中的DB_LOCK_BUFFERS参数决定(用数据库块的个数表示)。在调整和管理数据库时,调整数据块缓存区的大小是一个重要的部分。
因为数据块缓存区的大小固定,并且其大小通常小于数据库段所使用的空间,所以它不能一次装载下内存中所有的数据库段。通常,数据块缓存区只是数据库 大小的1 %~2 %,oracle使用最近最少使用(LRU)算法来管理可用空间。当存储区需要自由空间时,最近最少使用块将被移出,新数据块将在存储区代替它的位置。通过这种方法,将最频繁使用的数据保 存在存储区中。
然而,如果SGA的大小不足以容纳所有最常使用的数据,那么,不同的对象将争用数据块缓存区中的空间。当多个应用程序共享同一个S G A时,很有可能发生这种情况。此时,每个应用的最近使用段都将与其他应用的最近使用段争夺S G A中的空间。其结果是,对数据块缓存区的数据请求将出现较低的命中率,导致系统性能下降。
-----字典缓存区(data dictionary cache):属于Sql shared pool的一部分,共享池的大小由init.ora中shared_poool_size参数来设置。数据字典表用来存储数据库对象,包括用户账号数据、数据文件名、段名、盘区位置、表说明和权限,当数据库需要这些信息时,会去读取数据字典表中且返回的数据存储在字典缓存区的SGA中。数据字典缓存区通过最近最少使用(LRU)算法来管理,字典缓冲区的大小由数据库内部管理.如果字典缓存区太小,数据库就去数据字典表中查询.-----重做日志缓冲区:重做日志文件用于记录各种对数据库的修改,以便向前回滚。在写入重做日志文件之前,需要记录在重做日志缓冲区(redo log buffer)的SGA中。数据库可以周期地分批向联机重做日志文件中写重做项的内容,从而优化这个操作。redo log buffer的大小由init.ora的log_buffer参数决定。
-----SQL共享池:sql共享池存储数据字典缓存区及库缓存区(library cache),即对数据库进行操作的语句信息。当数据块缓冲区和字典缓存区能够共享数据库用户间的结构及数据信息时,库缓存区允许共享常用的sql语句。sql共享池包括执行计划及运行数据库的sql语句的语法分析树。在第二次运行(由任何用户)相同的sql语句时,可以利用sql共享池中可用的语法分析信息来加快执行速度。sql共享池大小由init.ora文件参数shared_pool_size决定.sql共享池通过LRU算法来管理。当sql共享池填满时,将从库缓存区中删掉最近最少使用的执行路径和语法分析树,以便为新的条目腾出空间。如果sql共享池太小,语句将被连续不断地再装入到库缓存区,从而影响操作性能。
-----大池(large pool):可选内存区,使用线程服务器选项或频繁执行备份/恢复操作,只要创建一个大池就可以管理这些操作。大池将支持SQL大型命令。利用大池,就可以防止SQL大型命令把条目重写入sql共享池中,从而减少再装入到库缓冲区中的语句数量。大池的大小通过init.ora文件的large_pool_size参数设置.
-----java池:为java命令提供语法分析。init.ora文件的java_pool_size设置大小.
----多缓冲池:可以在SGA中创建多个缓冲池,能够用多个缓冲池把大数据集与其他的应用程序分开,以减少它们争夺数据块缓存区内相同资源的可能性。对于创建的每一个缓冲池,都要规定其LRU锁存器的大小和数量。缓冲区的数量必须至少比LRU锁存器的数量多50倍。
创建缓冲池时,需要规定保存区(keep area)的大小和再循环区(recycle area)的大小。与SQL共享池的保留区一样,保存区保持条目,而再循环区则被频繁地再循环使用。可以通过buffer_pool_keep参数规定来保存区的大小。例如:
保存和再循环缓冲池的容量减少了数据块缓冲存储区中的可用空间(通过DB_BLOCK_BUFFERS参数设置)。对于使用一个新缓冲池的表,通过表的storage子句中的buffer_pool参数来规定缓冲池的名字。例如,如果需要从内存中快速删除一个表,就把它赋予recycle池。缺省池叫作default,这样就能在以后用alter table命令把一个表转移到default池。
2、程序全局区:被oracle用户进程所使用,PGA中的内存不能共享。
3、环境区
4、后台进程:每个后台进程创建一个跟踪文件,进程的初始化参数文件BACKGROUND_DUMP_DEST参数来规定。影响后台进程的严重问题通常记录在数据库的警告日志上。警告日志通常位于BACKGROUND_DUMP_DEST目录下。一般来说,这个目录是ORACLE_BASE目录下的/ADMIN/INSTANCE_NAME/BDUMP目录。
-----SMON:当启动一个数据库时, SMON(System Monitor,系统监控程序)进程执行所需的实例恢复操作(使用联机重做日志文件),它也可以清除数据库,取消系统不再需要的事务对象。SMON的另一个用途是:将邻接的自由盘区组成一个较大的自由盘区。对于某些表空间,数据库管理员必须手工执行自由空间合并;SMON只合并表空间中的自由空间,这些表空间的缺省pctincrease存储值为非零。
-----PMON (进程监控程序):后台进程清除失败用户的进程,释放用户当时正在使用的资源。当一个持有锁的进程被取消时,其效果是显而易见的, PMON负责释放锁并使其可以被其他用户使用。同SMON一样,PMON周期性地唤醒检测它是否需要被使用。
-----DBWR:(数据库写入程序)后台进程负责管理数据块缓存区及字典缓存区的内容。它以批方式把修改块从SGA写到数据文件中。
尽管每一个数据库实例只有一个SMON和一个PMON进程在运行,但是根据平台和操作系统的不同,用户可以同时拥有多个DBWR进程。使用多个DBWR进程有助于在进行大的操作期间减少DBWR中的冲突。所需DBWR 进程的数量由数据库的i n i t . o r a 文件中的DB _ WRITER _ PROCESSES参数决定。如果系统支持异步I / O,可以用多个DBWR I/O 从( s l a v e )进程创建一个D B W R进程。DBWR I/O 从进程的数量由i n i t . o r a文件的D B W R _ I / O _ S L AV E S参数设置。
如果创建多个DBWR进程,这些进程就不叫做DBWR,它们将有一个数字分量。例如,如果创建5个DBWR进程,进程的操作系统名就可能是DBW0、DBW1、DBW2、DBW3和DBW4。
-----LGWR:LGWR(日志写入程序)后台进程负责把联机重做日志缓冲区的内容写入联机重做日志文件。LGWR分批将日志条目写入联机重做日志文件。重做日志缓冲区条目总是包含着数据库的最新状态,这是因为DBWR进程可以一直等待到把数据块缓冲区中的修改数据块写入到数据文件中。LGWR是数据库正常操作时唯一向联机重做日志文件写入内容并从重做日志缓冲区直接读取内容的进程。与DBWR对数据文件执行的完全随机访问相反,联机重做日志文件以序列形式写入。如果联机重做日志文件是镜像文件, LGWR同时向镜像日志文件中写内容。
-----CKPT:CKPT (检查点进程)用来减少执行实例恢复所需的时间。检查点使DBWR把上一个检查点以后的全部已修改数据块写入数据文件,并更新数据文件头部和控制文件以记录该检查点。当一个联机重做日志文件被填满时,检查点进程会自动出现。可以用数据库实例的init.ora文件中的LOG_CHECKPOINT_ INTERVAL参数来设置一个频繁出现的检查点。CKPT后台进程把早期数据库版本中LGWR的两个功能(向检查点发信号及复制日志内容)分成两个后台进程。当数据库实例的init.ora文件中的CHECKPOINT_ PROCESS参数被设置为TRUE时,就可以建立CKPT后台进程。
-----ARCH(归档进程):LGWR后台进程以循环方式向联机重做日志文件写入;当填满第一个日志文件后,就开始向第二个日志文件写入;第二个日志文件填满后,再向第三个日志文件写入。一旦最后一个重做日志文件填满, LGWR就开始重写第一个重做日志文件的内容。
当Oracle以archivelog(归档日志)模式运行时,数据库在开始重写重做日志文件之前先对其进行备份。这些归档的重做日志文件通常写入一个磁盘设备中。也可以直接写入磁带设备中,但是这往往要增加操作员的劳动强度。
这种归档功能由ARCH(归档进程)后台进程完成,利用该性能的数据库在处理大数据事务时将遇到重做日志磁盘冲突问题,这是因为当LGWR准备写入一个重做日志文件时, ARCH正准备读取另一个。如果归档日志目标磁盘写满,数据库还将遇到数据库锁定问题。此时,ARCH冻结,禁止LGWR写入;从而禁止在数据库中出现进一步的事务处理;这种情况一起延续到归档重做日志文件的空间清空为止。
-----RECO(恢复进程):用于解决分布式数据库中的故障问题。RECO进程试图访问存在疑问的分布式事务的数据库并解析这些事务。只有在平台支持Distributed Option(分布式选项)且init.ora文件中的distributed_transactions参数大于零时才创建这个进程。
-----SNPN(快照进程):oracle的快照刷新及内部作业队列调度依赖于它们执行的后台进程(快照进程)。这些后台进程的名字以字母SNP开头,以数字或字母结束。为一实例所创建的SNP进程的个数由数据库的init.ora文件中的job_queue_processes参数决定
-----LCKN(锁定进程):当采用ORACLE并行服务器选项时,多个LOCK后台进程用于解决内部实例的锁定问题。
-----SNNN:(服务器进程)来管理需要专用服务器的数据库连接。服务器进程可以对数据文件进行I / O操作。
-----PNNN:如果启动数据库中的并行查询选项,一个查询的资源要求可以分布在多个处理器中。当实例启动由init. ora文件的PARALLEL_MIN_SERVERS参数确定时,指定数目的并行查询服务器进程就启动。每一个这样的进程都将出现在操作系统级。需要并行操作的进程越多,启动的并行查询服务器进程就越多。 每个并行查询服务器进程在操作系统级将有一个P000、P001、P002这样的名字。并行查询服务器进程的最大数量由init. ora 文件的PARALLEL_ M AX_SERVERS参数确定.
5、oracle外部结构
1、重做日志
Oracle保存所有数据库事务的日志。这些事务被记录在联机重做日志文件(online redo logfile)中。当数据库被破坏时,这些日志文件能够以正确顺序恢复数据库事务。重做日志文件信息存储在数据库数据文件的外部。重做日志文件也可以让Oracle优化向磁盘写入数据的方式。当数据库中出现一个事务时,就把该事务输入到重做日志缓冲区;同时受该事务影响的数据块不会立即写入磁盘。
每个Oracle数据库都有两个或更多的联机重做日志文件。Oracle以循环方式向联机重做日志文件写入:第一个日志文件被填满后,就向第二个日志文件写入,然后依次类推。当所有联机重做日志文件都被填满时,就又回到第一个日志文件,用新事务的数据对其进行重写。如果数据库正以ARCHIVELOG模式运行,在重写联机重做日志文件前,数据库将先对其进行备份。任何时候都可以用这些归档重做日志文件来恢复数据库的任何部分。
重做日志文件可以被数据库镜像(复制)。镜像联机重做日志文件不依赖操作系统或操作环境的硬件性能就可以对重做日志文件进行镜像。
2、控制文件数据库的全局物理结构由其控制文件(control file)维护。控制文件记录数据库中所有文件的控制信息。控制文件维护内部的一致性并引导恢复操作。
由于控制文件对数据库至关重要,所以联机存储着多个拷贝。这些文件一般存储在各个不同的磁盘上,以便将因磁盘失效引起的潜在危险降至最低限度。创建数据库时,同时就提供与之对应的控制文件。
数据库控制文件的名字通过init. ora文件的CONTROL_FILES参数规定。尽管这是一个i n i t . o r a参数,但是CONTROL_FILES参数通常用config.ora文件规定,因为它很少变化。如果需要给数据库添加一个新的控制文件,可关闭实例,把已存在的一个控制文件复制到新的地址,把新的地址添加到CONTROL_FILES参数设置值上,并重新启动这个实例。
3、跟踪文件和警告文件
在实例中运行的每一个后台进程都有一个跟踪文件与之相连。跟踪文件记载后台进程遇到的重大事件的信息。除了跟踪文件外,oracle还有一个称作警告日志(alert log)的文件,警告日志记录数据库文件运行中主要事件的命令及结果。例如,表空间的创建、重做日志的转换、操作系统的恢复、数据库的建立等信息都记录在 警告日志中。警告日志是数据库每日管理的重要资源,当需要查找主要失败原因时,跟踪文件就非常有用。
应经常监控警告日志。警告日志的条目将通知你数据库操作期间遇到的任何问题,其中包括出现的任何ORA_0600内部错误。为使警告日志便于使用,最好是每天能自动对其重新命名。例如,如果警告日志称作ALERT_ORCL.LOG,可以对它重新命名,以便其文件名包括当前日期。下次ORACLE要写该警告日志时,将找不到具有ALERT_ORCL.LOG文件名的文件,因此数据库将创建一个新的文件名。这样,除了有以前的警告日志外,还有一个当前的警告日志(ALERT_ORCL.LOG )。用这种方式区分警告日志条目就可以使对警告日志条目的分析更有效。