ORACLE 优化基础

实例(instance)与数据库(database)
  
  数据库是物理概念:它包括存储在磁盘中的文件。实例是逻辑概念:它包括服务器中的内存结构与进程
  
  一个实例能够而且只能与一个数据库连接
  
  实例是暂时存在的实体,而数据库只要正确维护则永久存在
  
  用户一般不会直接访问Oracle数据库的信息,而是通过Oracle实例来访问信息
  
  如果实例挂起,虽然数据库仍然存在,用户却无法对它进行访问。此时数据库是静态的:其数据不会改变。当实例重新服务时,数据库中的数据则随时做好准备,即可以对它进行访问
  
  表空间(tablespace)
  
  表空间是一个逻辑结构,它和操作系统一样,是不可见的
  
  表空间由数据文件这样的物理结构组成;每个表空间包括一个或多个数据文件,但每个数据文件只能属于一个表空间。
  
  创建一个表时,必须说明是在哪个表空间内创建的。这样,Oracle才能在组成该表空间的数据文件中为它找到空间。
  
  表空间是Oracle数据库信息物理存储的一个逻辑视图。
  
  Oracle数据库中的物理文件
  
  一个Oracle数据库实际上是由以下三种基本类型的物理文件组成:
  
  控制文件  数据文件  日志文件
  
  控制文件
  
  控制文件包含组成该数据库的其他文件(例如,数据文件和日志文件)的列表,它还包括数据库内容和状态的关键信息
  
  控制文件参数
  
  控制文件的大小主要受下述的初始化参数所影响,这些初始化参数是初始文件的组成部分,并在创建数据库时得到设置
  
  MAXLOGFILES
  
  表示数据库日志组的最大数目
  
  MAXLOGMEMBERS
  
  每个日志文件组的最大成员数目
  
  MAXLOGHISTORY
  
  表示控制文件所包含的历史日志文件的数目。这个历史文件可以用于简化自动恢复,它通过识别一个归档日志文件中事务的范围来使用有关的日志文件。
  
  MAXDATAFILES
  
  表示控制文件能够跟踪的数据文件数目。在创建数据库时,该参数决定了对应于数据文件的控制文件中设置的空间总量。如果增加的数据文件数目比MAXDATAFILES参数所指定的要大,控制文件则会自动扩展。
  
  MAXINSTANCES
  
  表示控制文件能够跟踪的实例总量和数目
  
  [color=Blue]多重控制文件[/b]
  
  一个数据库至少应该有两个控制文件。建立一个控制文件的多个复本是一个好办法,通过对初始化文件中实例的CONTROL_FILES参数指定多个控制文件的位置,可以实现控制文件的多个复本:
  
  CONTROL_FILES=(/u00/oradata/prod/prodctl1.ctl,
  /u01/oradata/prod/prodctl2.ctl,
  /u02/oradata/prod/prodctl3.ctl)
  
  这个参数会告诉实例在哪里能够找到控制文件。Oracle对控制文件的改变同时进行。
  
  数据文件
  
  数据文件包括存储在数据库中的实际数据,其中包括:存储数据的表和索引;维护这些数据结构信息的的数据字典,以及用于实现数据一致机制的回滚段
  
   一个数据文件由Oralce数据库数据块(block)组成,而Oracle数据库数据块又是由磁盘中操作系统数据块组成。一个Oracle数据块的大 小可从2KB到32KB。如果在Oracle中支持巨大内存(Very Large Memory,VLM),一个Oracle数据块能达到64KB。
  
  每个表空间的数据块大小要一致,但在整个数据库中数据块的大小可以不同。
  
  根据需要,数据从数据文件中以数据库的数据块为单位读到内存中,数据块也可以从内存中被写入磁盘的数据文件中,从而确保数据库真实地记录了用户所做的改变。
  
  Oracle数据库与操作系统联系最紧密的是数据文件。在I/O子系统中布置数据库,能放置在任何位置的最小部分就是数据文件。
  
  数据文件结构
  
   数据文件的第一个数据块称为数据文件首部(datafile header),它包含了维护整个数据库完整性的关键信息。其中最重要的信息之一就是检查点结构(checkpoint structure)。这是一个逻辑时间戳,表示改变写入数据文件的最后时刻。这个时间戳对恢复数据库来说是非常关键的,Oracle恢复过程就是用数据 文件首部中的这个时间戳来确定:到底应该用哪个日志文件将数据文件及时地恢复到当前点
  
  数据范围与段
  
   从物理角度看,一个数据文件作为操作系统数据块加以存储。从逻辑角度看,数据文件有三个中间结构层:数据块(block)、数据范围(extent)和 段(segment)。数据范围是指一个Oracle数据文件中相邻的数据块集合。段表示在Oralce数据库中占据空间的对象,例如由一个或多个数据范 围组成的表或索引。
  
  当Oracle修改数据时,它要修改的是同一数据块中的数据。如果该数据块没有足够的空间存放新信息,那么Oracle把它写到另一个新的数据块中,两个数据块可能在不同的数据范围内。
  
  Oracle默认数据块大小为2KB
  
  日志文件
  
  日志文件用于存储由事务处理或Oracle内部行为而引起的数据库变化。在一般的操作中,Oracle会将改变的数据块存储到内存中;这样当实例发生故障时,有些改变的数据块可能还没来的及写到数据文件中。此时,利用日志文件中记录的信息可以恢复丢失的改变。
  
  可以对表或整个表空间设定NOLOGGING属性。这样,基于表或表空间中所有表的操作都将抑制生成日志信息
  
  多重日志文件
  
  每个Oracle实例用一个日志线程(thread)来记录数据库的变化。日志线程由若干日志组构成,日志组又由一个或多个日志成员构成。
  
  从逻辑上讲可以将一个日志组理解成一个独立的日志文件。但是,Oracle允许指定日志的多个复本来保护日志文件的完整性。
  
  在控制文件丢失的情况下,还有重建控制文件静态部分的方法,但是对丢失的日志文件就没有重新生成的方法,因此必须保证日志文件有多个复本。
  
  Oracle同步执行对所有日志成员的写操作。在确认了磁盘上所有的日志文件复本都正确地修改后,写日志操作才算已经执行。
  
  Oracle如何使用日志
  
  当服务器将所有能用的日志文件都使用过一次,它将再次转向第一个并重新使用。Oracle用日志文件序列号来跟踪不同的日志文件。这个序列号记录正在使用的日志文件中
  
  操作系统用日志文件名来识别物理文件,而Oracle用日志文件序列号来确定日志文件填写和循环使用的顺序。因为Oracle会自动重复使用日志文件,因此并不需要用日志文件名来确定它在日志文件序列的位置。
  
  归档日志
  
  Oralce两种日志文件类型:
  
  联机日志文件
  
  这是Oracle用来循环记录数据库改变的操作系统文件
  
  归档日志文件
  
  这是指为避免联机日志文件重写时丢失重复数据而对联机日志文件所做的备份
  
  Oracle有两种归档日志模式,Oracle数据库可以采用其中任何一种模式:
  
  NOARCHIVELOG
  
  不对日志文件进行归档。这种模式可以大大减少数据库备份的开销,但可能回导致数据的不可恢复
  
  ARCHIVELOG
  
  在这种模式下,当Oracle转向一个新的日志文件时,将以前的日志文件进行归档。为了防止出现历史“缺口”的情况,一个给定的日志文件在它成功归档之前是不能重新使用的。归档的日志文件,加上联机日志文件,为数据库的所有改变提供了完整的历史信息。
  
  在Oracle利用日志文件和归档日志文件来恢复数据库时,内部序列号可以起一个向导的作用。
  
  ARCHIVELOG模式和自动归档
  
  Oracle自动归档分成两步。首先,用SQL命令来转向归档日志模式
  
  ALTER DATABASE ARCHIVELOG
  
  如果数据库在ARCHIVELOG模式下,在Oracle写日志时,它会标识出用于归档的日志。
  
  但是标记为用于归档的日志并不意味着它们会自动归档。必须在初始化文件中设置如下参数:
  
  LOG_ARCHIVE_START=TURE
  
  这样就启动了归档进程,由Oracle调用该进程,将完整的日志文件拷贝到归档日志的目标位置。
  
  归档日志的目标位置以及归档日志文件名的形式需使用另两个参数来指定,即LOG_ARCHIVE_DEST和LOG_ARCHIVE_FORMAT。以下是一个设置的例子:
  
  LOG_ARCHIVE_DEST = C: \ORANT\DATABASE\ARCHIVE
  
  该语句指定了Oracle存放归档日志的目录。
  
  LOG_ARCHIVE_FORMAT = "ORCL%S.ARC"
  
  这个语句指定了Oracle对归档日志文件的命名形式。此例中,文件名必须以ORCL开始,以.ARC结束。Oracle自动用左边补零的日志文件序列号来替代通配符%S。命名形式中可选的通配符还有:
  
  %S  以序列号替代,但左边不补零
  
  %T  用补零的日志线程号来替代
  
  %t  用不补零的日志线程号来替代
  
  每个Oracle实例开始运行时,都要首先读初始化文件,在此之后对参数的改变不会影响此实例的运行。只有在再次启动实例时,改变的参数才会起作用。
  
  尽管打开了自动归档模式也不会使数据库处于ARCHIVELOG模式。同样,仅仅将数据库设置为ARCHIVELOG模式是不会自动启动归档进程的。
  
   LOG_ARCHIVE_START参数默认设置为FALSE。有时由于ARCHIVELOG模式和LOG_ARCHIVE_START设置不一致,会 导致一个Oracle实例无止境地等待。假如设置了归档模式,但是没有启动自动归档进程,这样因为不能写一个没有归档的日志文件,Oracle实例就会停 止。换句话说,不能自动执行该文件的归档进程。为了避免这样的问题,首先修改初始化参数,然后设置ALTER DATABASE ARCHIVELOG命令。
  
  在自动归档进程中应该确保归档目录中有足够的空间。如果归档日志文件目标空间已满,Oracle不能对其他的日志文件进行归档,它将会挂起。
  
  归档日志对Oracle数据库的恢复很重要,Oracle8及其以后的版本允许为归档日志指定多个目标位置。Oracle将日志文件写入每个指定的路径中,还可以指定每个复本是否必须成功。用于该功能的初始化参数如下:
  
  LOG_ARCHIVE_DUPLEX_DEST
  为冗余的日志文件指定其他的存放位置
  LOG_ARCHIVE_MIN_SUCCEED_DEST
  表示日志文件是否必须成功写入某个或全部的存储位置
  
  从Oracle8i开始,用户可以指定五个必需的或可选的归档日志存放位置,包括用于灾难性恢复的远程系统。Oracle自动支持多个归档进程,并对多个归档位置同时进行相同的归档。
  
  实例的组件
  
  Oracle实例可以定义为一个共享内存区和后台进程的集合。为实例分配的内存被称为SGA(System Global Area,系统全局区)。SGA并不是一个不加区分的大内存段,它由许多组件构成。
  
  实例的所有进程共享SGA,包括系统进程以及用户进程。
  
   在Oracle9i之前,实例开始时就要设置SGA的大小。改变SGA大小或者改变SGA中任何组件唯一办法就是修改初始化参数,然后停止实例再重新运 行。Oracle9i中,在实例运行中可以改变SGA的大小,也可以调整其组件。Oracle9i引入了粒度(granule)的概念,这是在SGA中可 以改变(增加或删除)的最小内存量。
  
  后台进程要与操作系统进行交互,而且后台进程互相之间也需要交互,从而管理实例的内存结构。这些进程还要管理磁盘上的实际数据库,并对实例做一般性的内部管理。
  
  还有一些物理文件,也可以将它们认为是实例的组成部分:
  
  实例的初始化文件
  
   初始化文件中包括许多配置实例运行的参数:可使用多大的内存,可连接的用户数目,实例访问的数据库等等。在Oracle之前,只有一个初始化文件—— INIT.ORA。在Oracle9i中引入了SPFILE,它不仅具有和INIT.ORA相同的功能,而且能够连续地存储Oracle9i运行过程中初 始化参数的变化。
  
  SPFILE是一个二进制文件,它保存在服务器中,这样就无需在客户主机上保留INIT.ORA文件了。当一个Oracle9i实例开始启动时,它首先寻找SPFILE文件,然后再查找INIT.ORA文件。
  
  实例的配置文件
  
  CONFIG.ORA是可选的参数文件。如果希望分离一个初始化文件参数集(例如,用于Oracle并行服务器/实时应用集群的参数集),那么可以选择这个文件。
  
  口令文件
  
  口令文件是Oracle的一个可选文件,这是一个操作系统文件,可以为管理Oracle数据库提供附加的灵活性。口令文件是加密的,包括用于执行管理任务(例如,启动或停止实例)的用户ID和口令。
  
  实例的内存结构
  
  SGA由三个主要区组成:数据库高速缓存、共享池和日志文件缓冲区。
  
  大池(Larger Pool),内存池的另一种类型,是在Oracle8中引入的。这个SGA的可选区可用于为不同服务器进程缓存I/O操作,其中包括那些用于恢复和备份的进程。还可以为多线程服务器保存会话内存。
  
  由于这个备用池的存在,需要分配大内存时可以降低对共享池的要求。配置大池的初始化参数:LARGE_POOL_SIZE
  
  数据库高速缓存
  
   数据库高速缓存用来存储从数据库获取的数据块。这个介于用户请求和实际数据文件之间的缓冲区改进了数据库的性能。如果数据存放在缓冲区中,可以从内存中 直接获取,而不用去磁盘中读取。Oracle用LRU(least recently used,最近最少使用)算法来管理缓冲区。如果一个用户请求的数据是最近才使用过的,那么这个数据最有可能存放在数据库高速缓存中;存放在缓冲区的数据 能够直接传送,不用执行磁盘读操作。
  
  当用户要读的数据不在缓冲区时,该数据块必须从磁盘中读出,并加载到缓冲区中。当用户修改数据时,首先是改变缓冲区中的数据,稍后这些改变才写入数据所驻留的数据文件中。这样做的目的在于,当Oracle往磁盘中写入所该变的数据块时用户不必等待。
  
  磁盘是计算机系统中执行速度最慢的部分,因此I/O执行得越少,系统的运行速度就越快。通过延期而不是立即执行非关键性的I/O操作可以使一个Oracle数据库获得更好的性能。
  
  在Oracle8及其以后的版本中有三个可用的缓冲池:
  
  DEFAULT
  
  这是标准的Oracle数据库高速缓存。如果没有特别指出的话,所有的对象都使用该缓冲区。
  
  KEEP
  
  用来存放经常使用的对象
  
  RECYCLE
  
  用于存放很少再访问的对象
  
  可以标记表或索引从而在一个特定的缓冲池内缓存。这将有助于在缓冲区内保存更多所需的对象,而避免了在一个中心缓冲区内所有对象“竟用”缓冲区。
  
  共享池
  
  共享池中存放的是用户共享结构。
  
  日志文件缓冲区
  
  日志信息首先存放在日志文件缓冲区内,然后才写入磁盘上的物理日志文件中。
  
  实例的后台进程
  
  DBWR(Database Writer,数据库写进程)
  
   DBWR将数据库块从SGA中的数据库高速缓存写入磁盘的数据文件中。每个Oracle实例最多可以拥有10个DBWR进程,即从DBWR0到 DBWR9,用于处理多个数据文件的I/O操作。大多数实例只运行一个DBWR进程。若需要DBWR进程从缓存把数据块写到磁盘中,往往有两个主要原因:
  
  ·如果Oracle需要执行一个检查点(例如,修改数据文件的数据块以便与日志的记录一致)。当一个事务提交时,Oracle先写日志,稍后才写实际的数据块。Oracle定期地执行检查点,以保证数据文件的内容符合日志为提交事务所做的记录。
  
  ·在响应用户的请求时,Oracle需要将数据块读到高速缓存内,但是缓存内没有富余的空间,这个时候根据最近最少使用原则将某些数据块写入磁盘。这种顺序执行写数据块可以极大地减少在高速缓存中丢失数据的可能。
  
  LGWR(Log Writer,日志写进程)
  
  LGWR把日志信息从SGA中的日志缓冲区写到当前日志所有的复本中。当事务在进行是,相关的日志信息存放在SGA的日志文件缓冲区内。事务提交时,Oracle通过调用LGWR将日志信息写到磁盘作为永久保存。
  
  SMON(System Monitor,系统监控进程)
  
   系统监控进程为一个Oracle实例维护其整体安全性。在一个实例失败后重新启动时,SMON执行紧急灾难恢复;在Oracle并行服务器/实时应用集 群中,当有多个实例同时访问同一数据库时,SMON为其中一个失败的实例进行协调并执行恢复操作。SMON还可以把数据文件中相邻的空闲内存合并为一块, 并且对用于记录排序的空间,如果不需要还可以将此空间释放。
  
  PMON(Process Monitor,进程监控进程)
  
  PMON进程监控数据库所有用户进程。如果一个用户进程非正常中断,PMON负责释放其余所有资  源(如:内存),并且释放失败进程所加的锁。
  
  ARCH(Archiver,归档进程)
  
  一旦Oracle写好日志文件,归档进程将读出日志文件,并且为所有使用的日志文件建立复本,写入  到指定归档日志的目录中。
  
  采用ARCn的记法,Oracle8i可支持的多达10个归档进程。LGWR可能会根据负载的需要启动其他的归档进程,启动的进程数目受初始化参数LOG_ARCHIVE_MAX_PROCESSES所限。
  
  CKPT(Checkpoint,检查点进程)
  
  检查点进程和DBWR协同工作来执行检查点。当检查点完成时,CKPT会更新控制文件和数据文件首部中的检查点数据。
  
  RECO(Recover,恢复进程)
  
  RECO会自动清除错误的或者挂起的分布式事务
  
  数据字典
  
  每个Oracle数据库包括一个被称为“元数据”的集合,或者说包含用来描述数据库有关数据结构的数据。包含这些元数据的表和视图称为Oracle数据字典。
  
  数据字典中有前缀V$或GV$的表是动态表,它们会不断更新以反映出Oracle数据库当前的状态。静态数据字典表都有一个形如DBA_、ALL_或USER_的前缀,表示该视图中列出的对象范围。
  
  数据库组件      数据库字典中的表和视图
  数据库        V$DATABASE
  表空间        DBA_TABLESPACE,DBA_DATA_FILES,
  DBA_FREE_SPACE
  控制文件       V$CONTROLFILE,V$PARAMETER,
  V$CONTROLFILE_RECORD_SECTION
  数据文件       V$DATAFILE,V$DATAFILE_HEADER,V$FILESTAT,
  DBA_DATA_FILES
  段          DBA_SEGMENTS
  数据范围       DBA_EXTENTS
  日志线程、日志组和  V$THREAD,V$LOG,V$LOGFILE
  日志序列号
  归档状态       V$DATABASE,V$LOG,V$ARCHIVED_LOG,
  V$ARCHIVE_DEST
  数据库实例      V$INSTANCE,V$PARAMETER,
  V$SYSTEM_PARAMETER
  内存结构       V$SGA,V$SGASTAT,V$DB_OBJECT_CACHE,V$SQL,
  V$SQLTEXT,V$SQLAREA
  后台进程       V$BGPROCESS,V$SESSION
posted @ 2009-12-02 14:32  自我时光  阅读(339)  评论(0编辑  收藏  举报