oracle 基础

发表于:2007-06-22来源:作者:点击数: 标签:
1.数据结构 2.数据类型 3.设计数据库 4.实例(instance)与数据库(database) 5.数据字典 数据结构 数据结构是以表和列的形式实现的。 数据类型 数据类型(datatype)是列(column)或存储过程 中的一个属性。 Oracle支持的数据类型可以分为三个基本种类:

   

1.数据结构
2.数据类型
3.设计数据库
4.实例(instance)与数据库(database)
5.数据字典

数据结构

数据结构是以表和列的形式实现的。

数据类型

数据类型(datatype)是列(column)或存储过程中的一个属性。

Oracle支持的数据类型可以分为三个基本种类:字符数据类型、数字数据类型以及表示其它数据的数据类型。

字符数据类型

CHAR
  CHAR数据类型存储固定长度的子符值。一个CHAR数据类型可以包括1到2000个字符。如果对CHAR没有明确地说明长度,它的默认长度则设置为1。
     如果对某个CHAR类型变量赋值,其长度小于规定的长度,那么Oracle自动用空格填充。

VARCHAR2
  存储可变长度的字符串。虽然也必须指定一个VARCHAR2数据变量的长度,但是这个长度是指对该变量赋值的的最大长度而非实际赋值长度。不需要用空格填充。最多可设置为4000个字符。

  因为VARCHAR2数据类型只存储为该列所赋的字符(不加空格),所以VARCHAR2需要的存储空间比CHAR数据类型要小。
  Oracle推荐使用VARCHAR2

NCHAR和NVARCHAR2
   NCHAR和NVARCHAR2数据类型分别存储固定长度与可变长度的字符数据,但是它们使用的是和数据库其他类型不同的字符集。在创建数据库时,需要 指定所使用的字符集,
以便对数据库中数据进行编码。还可以指定一个辅助的字符集[即本地语言集(National Language Set,简称NLS)]。NCHAR和NVARCHAR2类型的列使用辅助字符集。

  在Oracle9i中,可以以字符而不是字节为单位来表示NCHAR和NVARCHAR2列的长度。

LONG
  LONG数据类型可以存放2GB的字符数据,它是从早期版本中继承来的。现在如果想存储大容量的数据,Oracle推荐使用CLOB和NCLOB数据类型。在表和SQL语句中使用LONG类型有许多限制。

CLOB和NCLOB
  CLOB和NCLOB数据类型可以存储多达4GB的字符数据。NCLOB数据类型可存储NLS数据。

数字数据类型

Oracle使用标准、可变长度的内部格式来存储数字。这个内部格式精度可以高达38位。

NUMBER数据类型可以有两个限定符,如:

  column NUMBER ( precision, scale)

precision表示数字中的有效位。如果没有指定precision的话,Oracle将使用38作为精度。
scale表示数字小数点右边的位数,scale默认设置为0。  如果把scale设成负数,Oracle将把该数字取舍到小数点左边的指定位数。

日期数据类型

Oracle标准日期格式为:DD-MON-YY HH:MI:SS

通过修改实例的参数NLS_DATE_FORMAT,可以改变实例中插入日期的格式。在一个会话期间,可以通过ALTER SESSION SQL命令来修改日期,
或者通过使用SQL语句的TO_DATE表达式中的参数来更新一个特定值。

其它的数据类型

RAW和LONG RAW
  RAW和LONG RAW数据类型主要用于对数据库进行解释。指定这两种类型时,Oracle以位的形式来存储数据。RAW数据类型一般用于存储有特定格式的对象,如位图。
     RAW数据类型可占用2KB的空间,而LONG RAW数据类型则可以占用2GB大小。

ROWID
  ROWID是一种特殊的列类型,称之为伪列(pseudocolumn)。ROWID伪列在SQL SELECT语句中可以像普通列那样被访问。Oracle数据库中每行都有一个伪列。
    ROWID表示行的地址,ROWID伪列用ROWID数据类型定义。
  ROWID与磁盘驱动的特定位置有关,因此,ROWID是获得行的最快方法。但是,行的ROWID会随着卸载和重载数据库而发生变化,因此建议不要在事务中


  

cloudscape 发表于 >2003-12-29 10:00:39 [阅读全文] [我要评论] [引用文章]

2003-12-17
Oracle(二)

设计数据库

考虑一下数据库的使用目的以及数据库中包含的数据量。还应该了解所使用的底层硬件——CPU的数目和型号、内存总量、磁盘数目、磁盘控制器等等。采用合适的容量和I/O子系统设计,
可以避免以后许多的优化问题。

一些影响数据库设计和硬件配置的因素:

有多少用户使用数据库?

该数据库是否支持OLTP应用或数据仓库?

数据库对象数目和大小是怎样的?
  即对象在初始化时的大小以及所期望的增长速率。

不同数据库对象采用哪种访问模式?
  某些对象可能比另一些对象更常用。了解数据库中的操作类型与容量,这对于设计和优化数据库是至关重要的。有人使用所谓“CRUD矩阵”,
    即对业务事务中每个关键对象的创建(Create)、读(Read)、更新(Update)以及删除(Delete)进行估计。

现在已有哪些硬件是可以使用的,随着数据库的增长还必须增加哪些硬件?

可用性要求如何?

性能要求是怎样的?

系统的安全要求是什么?

配置Oracle Net/Net8

Oracle Net (在Oracle和Oracle8i中称为Net8,在Oracle8之前称为SQL*Net)是一个软件层,允许不同的物理主机为访问Oracle数据库这个共同目标而进行通信。

在客户机和服务器上运行某个版本的Oracle Net,可以使客户与服务器通过任何通用的网络协议实现通信。Oracle Net 还能执行网络协议互换功能。

Oracle Net 还提供了“位置透明性”,即客户应用不需要知道服务器的物理位置。Oracle Net 层处理这样的通信,意味着可以把数据库移到另一台主机上,而只要简单地更新相应的Oracle Net 配置信息即可。
客户应用程序仍然可以访问该数据库,不需要做任何改变。

Oracle Net 引入了服务名(service name)或别名(alias)的概念。客户提供一个服务名或Oracle Net 别名以指定其要访问的数据库,而不需要确定该数据库存放的主机或数据库实例。
Oracle Net 通过提供的服务名查找实际的主机和Oracle实例,,并将客户请求发送到合适的数据库。

解析Oracle Net 服务名

下面的Oracle Net 配置选件可将客户指定的服务名解析为所要访问的数据库主机名和实例名。

本地解析名
   使用本地解析名,每个客户机上都必须安装文件TNSNAMES.ORA,其中包括了针对每个Oracle Net 别名所提供的主机和Oracle实例项,如果底层数据库位置有所变化,则必须维护客户机上的TNSNAMES.ORA文件。网络拓扑一定会随着时间而变 化,所以使用这个选件势必增加维护的负担。

Oracle Names 服务
  使用Oracle带的Oracle Names软件可以避免在每个客户上安装文件TNANAMES.ORA。当客户指定一个服务名时,Oracle Net自动地与Oracle Names服务器(一般都在其他主机上)联系。
     Oracle Names软件为客户提供了主机和实例信息。可以配置多个Oracle Names服务器来提供冗余并提高性能。当Oracle网络拓扑结构经常发生变化时,
     Oracle Names服务可以极大地减轻更新本地TNSNAMES.ORA文件的负担。对于广泛分布的复杂网络很适用。

Oracle Internet目录
   Oracle Names服务的优点在于它不需要安装客户配置文件,缺点则是它是专用的,即只能应用在Oracle数据库上。而将名字服务扩展到Oracle环境以外的 领域是在所难免的。
     事实上,已经有了访问这类信息的标准,即LDAP(Lightweight Directory Aclearcase/" target="_blank" >ccess Protocol,轻型目录访问协议)。
     自从Oracle8i发布以后,Oracle数据库就装配了OID(Oracle Internet目录)。OID是一种LDAP类型的目录,和Oracle Names服务作用相同。OID还有其他许多用途,
     如在Oracle9iAS Portal产品中使用单点登录等。

主机名
  客户可以简单使用实例运行的主机名。这对TCP/IP网络是有效的,因为TCP/IP网络可以将主机名解析成IP地址。例如,DNS将主机名转换成IP地址,就如同Oracle Names转换服务名一样。

第三方命名服务
  
这些名字解析选件互不排斥。

自动发现和代理

在Oracle8i中,通用安装程序和Oracle Net管理器互相配合,自动地配置Oracle Net网络。惟一所需的就是INIT.ORA(在Oracle9i中可以为SPFILE),它将实例映射到服务或应用中。

Oracle 网络中支持自动发现的关键部分就是Oracle智能代理(Intelligent Agent)。此代理是一个软件,运行于存放Oracle数据库的主机上。对于查找或访问数据库的其他功能而言.
它起着代理的作用。代理为自动发现提供了 一个中心点:Oracle Net需要通过询问代理来发现实例和数据库。

Oracle Net配置文件

Oracle Net需要几个配置文件。对于用来配置一个Oracle Net网络的文件,其默认位置如下:

Oracle8的路径为ORACLE_HOME\net80\admin;Oracle8i及其以后版本的路径为ORACLE_HOME\network\admin

可以将这些文件放在其他目录下,但是必须用环境或系统变量TNS_ADMIN设置非默认路径,以后Oracle就用TNS_ADMIN来定位这些文件。

构成一个简单Oracle Net配置的文件如下:

LISTENER.ORA
  包括配置Oracle Net监听器的细节信息,例如监听器正在作用于哪个实例或服务。对于想要通过网络来访问数据库的客户,监听器将对其发送来的连接请求进行“监听”。

TNSNAMES.ORA
   根据连接请求,此文件把服务名解码成特定主机的地址和Oracle实例(如果正在使用Oracle Name,就没必要把TNSNAMES.ORA文件作为配置的一部分)。
这个文件对Oracle Net的位置透明性是很关键的。如果把数据库从一台主机移到另一台上,只需修改不同主机上的TNSNAMES.ORA文件,即改为现有的服务名来映射新的 主机地址。

SQLNET.ORA
  该文件提供重要的默认配置和混合配置细节信息

LDAP.ORA
  对于Oracle8i及其以后版本,LDAP.ORA文件包含了需要使用LDAP目录的配置信息。这个信息包括LDAP目录服务器的位置和服务器的默认管理环境。

通用服务名

在Oracle8i 之前,配置数据库服务器上的监听器用来监听特定的实例名。客户使用Net8服务名,可以解析成特定的主机以及实例名。
从Oracle8i以后,则通过服务 名或应用名。当数据库服务器上的实例启动时,它通过监听器来注册所支持的应用/服务。
Oracle Net/Net8名字解析文件要使用服务名,它将解析成主机或应用,而非主机与实例。然后主机上的监听器根据每个实例注册时所支持的应用,从而引导客户得 到合适的实例。

启动数据库

启动一个数据库,以下操作将自动完成:

1.启动实例  Oracle从服务器上的SPFILE或INIT.ORA文件中读取实例初始化参数,然后Oracle为系统全局区分配内存,启动实例的后台进程。在这个阶段,数据库的任何物理文件都没打开,实例处于NOMOUNT状态。

有些问题会阻止实例的启动。例如,初始化文件中的错误、操作系统不能分配所有的SGA共享内存,等等。而且还应具有SYSOPER或SYSDBA的特殊权限,这是通过操作系统授予的,
其作用就是用于启动实例。

2.安装数据库  首先实例打开了数据库的控制文件,初始化参数CONTROL_FILES会告诉实例在哪里能够找到这些控制文件。在这个时候只有控制文件是打开的,这称为MOUNT状态,此时,只有数据库管理员可以处理数据库。

3.安装数据库  实例会根据控制文件的信息打开日志文件和数据文件。在这个时候,数据库完全打开,用户可以访问。

关闭数据库

1. 关闭数据库  Oracle对所有修改过的的数据块进行刷新,这些数据块还没有从SGA缓冲区写入磁盘的数据文件中。Oracle还将把日志缓冲区内的相 关日志信息写出。
                      然后Oracle检查点数据文件,标识数据文件头的当前数据库关闭时间,接着关闭数据文件和日志文件。此时,用户不能再访问数据库。

2.卸载数据库  Oracle实例卸载数据库。Oracle刷新了控制文件相关的项,从而记录完全关闭操作,然后关闭控制文件。这是数据库完全关闭,只有实例存在。

3.关闭实例  Oracle停止了所有的后台进程,并且释放SGA的内存共享。

在 某种情况下,数据库可能没有完全关闭。如果发生这种情况,Oracle没有时间把修改过的数据库数据块从SGA写入数据文件中。当Oracle再次启动 时,实例会察觉到故障的发生,并且自动提交没有或正在进行的事务会被清除。在应用了日志文件后将确定没有提交的事务,并且自动回滚。

访问数据库

服务器进程和客户

为了访问数据库,用户需要和实例连接,因为用户必须通过实例访问所需的数据库。访问问数据库的程序实际上有两个部分:客户程序和服务器进程,它们要与Oracle实例连接。例如:运行Oracle的字符模式工具SQL*Plus包括以下两个进程:
·SQL*Plus进程本身,它将被作为客户。
·Oracle服务器进程,有时称为影子进程(shadow process),它提供与Oracle实例的连接。

服务器进程

Oracle服务器进程始终运行在实例运行的主机上,服务器进程可以访问SGA共享内存,并且可以从中读写数据。

顾名思义,服务器进程是为客户进行工作的,他的工作包括读取和返回请求的数据,并代表客户接受和做出修改等等。但是服务器进程不能把日志缓冲区的日志信息写入日志文件中,
它也不能把改变的数据库数据块从高速缓存写入数据文件。这些操作分别由LGWR和DBWR进程完成。

客户进程

客 户进程可以和实例运行在同一台主机上。两个进程在同一台主机上时,Oracle通过IPC(Inter Process Communication,进程间通信)进行本地通信;对于客户在一台主机上而数据库在另一台主机上的情况,Oracle使用Oracle Net在两个主机间通信。

作为客户的应用服务器和Web服务器

当考虑包括Web服务器和应用服务器的多层计算时,客户的含义 就有所改变。“客户”进程成为中间层或应用服务器。 
 对于所有与Oracle实例连接的进程,由于它可以获得数据库的服务,从这个意义上说,可以认为它 们都属于客户。  
不要把正在使用的术语“客户”和多层结构中的实际客户相混淆。在多层结构中的终端客户是某种类型的程序,
它们可以提供用户接口,例如运 行Java的浏览器等。

Oracle Net以及建立网络连接

服务器进程通过某些类型的网络与客户进程连接,那么客户进程是如何与Oracle服务器进程联系并开始工作的呢?

联 系Oracle客户和服务器的中介是Oracle Net监听器。监听器可为一个或多个实例“监听”连接请求。监听器不是Oracle实例的一部分,它的作用是将连接请求导向相应的实例。
监听器的启动和停 止都独立与实例。如果监听器关闭而实例仍在运行,则没有监听器的导向,客户通过网络访问数据库时就找不到实例。

监听器功能比较简单:

1.客户通过网络与监听器联系。
2.监听器检测到请求,把请求的客户介绍给一个Oracle服务器进程。
3.监听器将服务介绍给客户,以便两者都知道彼此的地址。
4.监听器退出,让客户和服务器直接通信。

共享服务器/多线程服务器

为了支持对于可伸缩性的不断增长的需求,Oracle在Oracle7中引入了多线程服务器(Multi-Threaded Server,MTS)。  在Oracle中,多线程服务器称为共享服务器。

针对大量用户,多线程服务器允许Oracle实例共享服务器进程集合。在多线程服务器中,不是每个客户都与一个专用的服务器相连并且可以使用,而是由客户使用共享服务器,
这样在为大量的用户服务时,就可以大大降低资源需求。

在共享服务器模型中,共享服务器可以在一个客户不需要时为另一个客户提供服务。

对 于实例,无需在共享服务器进程和专用服务器进程之间进行排他式的选择。Oracle可以完成专用服务器和共享服务器的混合和匹配,
即客户可以与其中一个连 接,也可以与另一个连接。这个基于Oracle Net配置文件。在配置文件中,存在一个服务名把客户导向一个专用的服务器
,同时可以有另一个服务名,以此建立通过共享的服务器的连接。

客户使用的服务器进程的类型对客户是一样的。从客户角度,处理专用或多线程连接的监听器都是一样的。

对于建立与共享服务器进程的连接,监听器采用了不太一样的步骤,这包括一些用于实例调度程序以及共享服务器本身的的后台进程:

调度程序
   因为共享服务器进程可能为其他客户服务,客户应该与调度程序连接,调度程序随时都可以接受任何客户请求。对于每个所使用的网络协议,都有着自己的调度程 序 。
   对客户来说,调度程序好象一个专用的服务器,并且每个调度可为多个客户服务。客户直接与调度程序连接,而不是与一个服务器连接。调度程序接受客户请 求
,把它放在请求队列中,这是在SGA中的一个内存结构。每个实例有一个请求队列。

共享服务器
  共享服务器进程从请求队列中读取请求,并处理请求,最后将处理结果放在响应调度程序的响应队列中。每个调度程序都有一个响应队列。
    此后,调度程序将读取响应队列中的结果,将它们发送回客户进程。

Oracle根据初始化参数MTS_DISPATCHERS和MTS_SERVERS启动一定数目的调度程序和共享服务器。  
可以启动的最大调度程序数目由MTS_MAX_DISPATCHERS参数规定。启动共享服务器的数目由MTS_MAX_SERVERS规定。

共享服务器进程与专用服务器进程的会话内存的对照

在Oracle 中有一个成为会话内存(session memory)或状态(state)的概念。状态的信息是描述一个Oracle中会话当前状态的基本数据。使用专用服务器时,
这个状态存储在每个专用服务 器的私有内存中。因为每个专用服务器只为一个客户工作,所以所需要的大小很容易计算。对应这个私有内存的术语为PGA(Program Global Area,程序全局区)。

但是,如果正在使用多线程服务器,那么任何服务器都可能作为特定的客户。会话状态不能存储在每个共享服务器进程的PGA中。因为会话可以在不同的共享服务器之间移动,
所以所有的服务器都必须能够访问会话状态。由于这个原因,Oracle把状态信息放在SGA中。

请求和响应队列,以及回话状态,都在SGA中要求额外的内存,因此使用多线程服务器时需要分配更多的内存。在默认情况下,多线程服务器的会话状态内存从共享池中分配。

关于多线程服务器的数据字典信息

V$MTS
  这个视图包括有关多线程服务器的动态信息,如连接的高峰标志,以及由于负载发生变化而已经启动和停止的共享服务器的数量。

V$DISPATCHER
  这个视图包含多线程服务器调度程序进程的详细信息。它可以确定调度程序的繁忙程度,以便帮助设置合适的最大值和最小值。

V$SHARED_SERVER
  这个视图包含了多线程服务器的使用共享服务器进程的详细信息。它可以确定服务器的繁忙程度,以便帮助设置有关共享服务器进程的合适的最大值和最小值。

V$CIRCUIT
  可以将客户到调度程序以及调度程序到共享服务器(使用队列)的路线看做是虚拟线路。这个视图就是包括了这些用于用户连接的虚拟线路的信息。

Oracle的工作

Oracle和事务

事务具有逻辑性和完整性
   数据库术语中的事务是指工作的逻辑单元,它包含一个或多个数据更改的操作。一个事务可能由多个INSERT、UPDATE和/或DELETE语句组成,
     这些语句会对多个表中的数据产生影响。整个更改集必须以一个完整的工作单元形式得到成功执行或完全不执行。事务从第一个DML语句开始,以提交或回滚结 束。

提交或回滚
  一旦用户为其事务输入数据,他既可以提交事务使得改变永久保存,也可以取消事务,相应地取消改变。

SCN(系统改变号)
  确保数据库望整性的一个关键要素就是要知道哪个事务先发生。Oracle采用的机制是SCN(System Change Number,系统改变号),它是用于跟踪事务发生顺序的逻辑时间戳。
     Oracle还利用SCN来实现多版本的读一致性。

回滚段
   回滚段是Oracle数据库在回滚的情况下用于保存事务“取消”信息的结构。取消信息将把数据库数据块恢复到事务开始之前的状态。
    当事务开始改变数据块 中的数据时,它首先将原有的数据写到回滚段。存放在回滚段中的信息有两个主要用途:为取消事务提供必要的信息,以及支持多版本的读一致性。

  回滚段和日志是不同的。日志用来记录数据库的所有事务,当系统失败是用于恢复数据库;而回滚段则为事物提供回滚操作,并且提供读一致性。

  和表、索引和存储一样,回滚段的内存是在SGA中分配的。如果回滚段在一个时间段未使用,它们可能从缓冲区内被清楚,并写到磁盘上。

  Oracle9i引入了回滚段的自动管理机制。在Oracle9i中,通过使用UNDO表空间,可以选择对所有回滚进行自动管理。

快速提交
  无论用户什么时候提交事务,Oracle都必须写日志文件,因此它们可用来加速数据库的操作。当用户提交一个事务,Oracle可以通过下面两种方法之一将数据库改变写到磁盘上。
  ·将事务改变的所有数据库块写到各自的数据文件中。
  ·只写日志信息,比起写数据库数据块来说,这里涉及的I/O操作要少得多。
   为了提供最佳性能,Oracle只写日志信息。当用户提交事务时,Oracle将确保把改变的日志信息立即写到磁盘日志文件中。
     而有关数据库数据块的改 变信息则在以后才写入数据文件中。错误发生时,如果改变的数据块还没有从缓冲区写到数据文件中,
     那么日志文件就回重新生成所有的改变, 因为计算机系统中磁 盘是速度最慢的设备,Oracle快速提交机制减少了提交事务的开销,并且提供了避免风险的最佳性能。


cloudscape 发表于 >2003-12-17 22:51:58 [阅读全文] [我要评论] [引用文章]

2003-12-16
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


原文转自:http://www.ltesting.net