本章学习创建一个数据库的理论和实践,通过相关工具,图形界面或者命令行和一些管理选项来创建数据库方面的技巧,从而对Oracle服务器体系结构又更进一步了解。但是往往这个过程让人感觉到神秘化。创建一个数据库并不是像人们想象的那么费力,只要你理解上面是必须的并且准备好适当的脚本你可以在喝一杯茶的时间内创建20个数据库。另外你不用担心如何正确的创建,几乎所有的事情都在创建的这个时候已经自己准备好了。它可能会让你想到这个数据库结构是如何一步一步的建立的,数据库的作用和运行环境,但是所有的这些问题都可以在创建后再进行改变(除了一个不能改变)。通常在这个阶段尽量使问题简单化。先创建并让它工作着,过后再考虑如何根据用户再进行配置。

Oracle服务器的体系结构

一个Oracle服务器包括两个实体:实例(instance)和数据库(database)(如图3-1)

             

创建数据库User dop amc does not have privileges for CREATETABLE 创建数据库的五个步骤_脚本


它们是相互独立的并又连接起来。通过数据库创建进程首先创建实例然后才创建数据库。在一个典型的单一实例环境下实例和数据库是一对一的,一个单一的实例连接一个单一的数据库。但是通常情况下是实例和数据库是多对一的:在不同计算机上的多个实例在一个共享的磁盘系统下操纵一个公共数据库。比如大家所熟知的真正应用集群(Real Application Cluster),即RAC。RAC可以在执行,容错和可伸缩性方面具有令人惊讶的能力并是Oracle网格计算所必须的技术。在以前发布的RAC版本(或者更早的Oracle Parallel Server)都是额外收费附加产品。但是在Oracle Database 10g 标准版中,RAC是免费捆绑在其中的,这也表明Oracle公司很想向用户推广其RAC应用环境。标准版的RAC限制计算机的CPU数量最多不能超过2个,并且在一个集群环境中最多只能有4台计算机,但是尽管这样已经为用户提供了很强大的连接环境了。RAC在企业版中是需要额外购买才能使用的,其可伸缩性将更加有效,无任何限制除非你自己的硬件和操作系统本身有限制。它当然也可以一个实例通过数据库连接连接到多个数据库。在过去你可能处理过许多这样的情形:一个电脑上一个实例打开存储在本地磁盘上的一个数据库。

   实例(instance)有存储结构和进程组成。它在你的内存和CPU中的存在是短暂的。数据库(database)由磁盘上的物理文件组成。这样实例的生命周期仅仅是当它在内存中的那段时间---它可以被开始和停止。与之相比,数据库一旦被创建就一直存在除非你故意删除组成数据库的那些文件。在数据库的物理结构中,管理员和用户看到的是数据库的逻辑结构。Oracle数据库负责逻辑结构和物理结构的和对应:程序员不用知道数据库如何存取数据以及数据存放的具体位置,他们只需关注数据库的逻辑结构,比如表。同样管理员不可能知道哪个字节的数据在哪个物理结构中,唯一能看到的是系统中存放数据的文件而已。只有数据库管理员被允许(也是必须)即看到物理结构又能看到逻辑结构。数据字典包括描述整个服务器的元数据以及管理数据库物理结构和逻辑结构的一致性。创建数据字典是创建数据库所必须的一步。创建进程最后才通过产生一些必要的视图,PL/SQL包,和易于管理的Enterprise Manager Database Control使数据库可用。

实例:存储结构和进程

一个Oracle实例由一块被叫做系统全局区(System Global Area即SGA)和一些进程组成。系统全局区(SGA)至少包括3个数据区:共享池(shared pool),数据库缓冲区(database buffer cache)和日志缓冲区(log buffer)。通常情况下还有大池(large pool),java池(java pool)和流池(streams pool)。当开始一个实例,这些系统全局区的部分区块大小便被固定下来;而一些是可以动态改变的,但是没有一个是在数据库创建的时候固定下来的:你可以随时停止和重新开始一个实例,并为实例可以配置不同的SGA大小。

考试小贴士:

记住系统全局区(SGA)的组成:共享池,数据库缓冲区和日志缓冲区。

    共享池(shared pool)又可再细分为一些其它的组成结构。本书仅简单的介绍两种共享池组成结构:库缓冲区(library cache)和数据字典缓冲区(data dictionary cache)。库缓冲区主要用来以存储最近执行的代码的解析形态。解析是把程序员的代码转换成可执行的一个过程,这个比较慢的过程也是Oracle所必须的。通过缓存被解析的代码可以让这些解析过的代码重用,避免了再次缓慢的解析过程,从而大大提高了数据库性能。数据字典缓冲区用来存储最近用过的对象定义:有关表,索引,用户和其它元数据定义的描述。把这些信息放进内存然后再不断读取要比经常从磁盘中读取这些数据性能强多了。

    数据库缓冲区是Oracle执行SQL的工作区域。用户不必一直更新磁盘上的数据。Oracle将数据复制到内存中的数据库缓冲区并在那里更新。理想情况下,所有要经常存取的数据都将在数据库缓冲区里以达到减少磁盘I/O提高性能的作用。

   日志缓冲区是一个非常小的内存块,用来快速存储数据库缓冲区中数据变化信息。在第九章将详细讲解SQL撤销和操纵数据中日志缓冲区和数据库缓冲区的用处。

    大池是一个可有可无的内存区,如有大池可被一些进程自动使用,否则那些进程会自动使用共享池中的内存来代替大池的作用。在第十三章讨论共享服务器(或多线程服务器)将介绍大池的主要用途。在接下来的章节里介绍恢复管理器(Recovery Manager)和RMAN也将介绍大池的用处。

    java池仅当在数据库中有java存储过程需要处理时才要求用到,然而现在Oracle的很多部分也是有java写成的,所以java池在现在以成为被考虑的标准了。

    流池被Oracle流所用。

小贴士:SGA的大小对性能很重要。通常应该足够大但是又不能太大。太大反而会降低性能!

    和SGA一样,实例至少要有5个进程:系统监视进程(SMON),进程监视进程(PMON),数据库写入进程(DBWn)(该进程最多可有10个),日志写入进程(LGWR)和检查点进程(CKPT)。这些就是大家所熟知的“后台进程”,因为无论是否有会话在实例或者甚至没有连接该实例的数据库被创建或者打开,只要实例在运行这些进程总是存在。

    SMON的主要作用是打开数据库:使实例和数据库能够连接。第五章将详细介绍这些。在日常运行中它肩负着大量的监控工作和整理工作。

    PMON监视用户会话,当会话出现问题时进行适当的操作。例如在用户已登录数据库但是电脑突然重新启动,PMON会检测到这个行为并整理用户刚才的工作。

    DBWn(或多个该进程 默认一个实例每8个CPU有一个数据库写入器)负责将所有数据写入数据文件。记住没有一个会话直接在磁盘上更新数据;它们仅仅在数据库缓冲区更新数据:所有更新的数据然后数据库写入进程负责再从数据库缓冲区写入磁盘。通常数据库写入进程会尽可能一点一点的缓慢写入。Oracle认为大量的磁盘I/O会降低性能,因此保持数据库写入进程以占用最小的资源向磁盘写入数据。

    LGWR将数据库缓冲区内的所有数据变化记录到磁盘的在线重做日志文件,与DBWn相比,LGWR的写入几乎是在瞬时完成的--当提交一个事务时,它几乎是实时完成的:迅速把高手日志缓冲区中的变化写入到磁盘的在线日志文件中。LGWR确保将所有用户的工作日志实时保存到磁盘从而确保一旦数据文件遭到破坏时,这些改变能被重新用到恢复备份上。通过这种机制,Oracle能确保从来不会丢失任何数据。

    CKPT负责确保实例与数据库的实时同步。原则上数据库总是是过期的:数据库的改变先是应用到内存中的缓冲区而并没有实时地被DBWn写入到磁盘中的数据文件中去(尽管这些改变被LGWR几乎实时的写入到在线日志文件)。某些场合可能要求强制把内存中数据库缓冲区的改变存储到数据文件中而达到即时更新改变。CKPT者控制着这种行为的发生频率。

考试小贴士:记住5个必须的后台进程:系统监视进程(SMON),进程监视进程(PMON),数据库写入进程(DBWn)和日志写入进程(LGWR)。

    当然除了必须的后台进程外还有一些其它的可选进程(10g中比以前的版本中更多),这些在后面的章节中将会介绍。有些进程是可被调控的。比如你可以决定有多少个数据库写入进程运行,并可以控制将数据块从数据块缓冲区写入到数据文件的频率。

数据库:物理结构

    Oracle数据库由3种类型的文件组成,当然严格的说还存在一些其它可选的文件类型存在。必须的文件是控制文件,在线重做日志文件,和数据文件。其它一些外部文件主要是初始化参数文件,密码文件和归档重做日志文件。

    每个数据库都有一个控制文件,但是一个有良好习惯的DBA总是会创建许多控制文件的副本以便一个控制文件损坏,数据库能幸免一难。如果所有的控制文件副本都丢失(尽管这种情况几乎不会存在)的化,就要进行数据库还原(recover)了,但是还是最好不让自己陷入这种困境。我们不用担心多个控制文件的同步问题,Oracle将会自己帮我们管理这些。控制文件虽小但是却有着重要的作用。它包括数据库中的一些指示器:在线重做日志文件和数据文件的存储位置。它也存储一些保证数据库完整性所必须的数据:各种临界段标志和时间周期标志。比如当用到Recovery Manager,RMAN工具时,一些备份信息也会被存储到控制文件中。控制文件大小通常也不过几MB大小而已,但是它却是必不可少的。控制文件是自动起作用的,你唯一能控制的是控制文件的副本个数以及副本所放置的地方。

    每个数据库至少有2个在线重做日志文件,但是同控制文件一样一个良好的DBA会创建每个在线重做日志文件的多个副本。在线重做日志文件储存着一系列按时间排序的有关应用到数据库的变化信息。这里是要求重建或者重做和改变所需的最基本的信息。重做日志包括数组重做日志文件,每个文件是一个成员。Oracle要求至少有2组且每组至少一个成员。考虑到性能原因可以创建多于2组并且为安全起见每组都至少2个以上成员。之所以要求至少要有两组在线重做日志是因为一个组可以接受当前的改变而另一组则一边备份日志(或者叫“归档”)。一个组是“当前”组:数据库的改变通过LGWR写入当前日志文件组。众所周之所有的用户都在数据库缓冲区更新数据并同时将改变信息传送到重做日志缓冲区。而LGWR不断地将重做日志缓冲区内的信息写入到当前在线日志组。重做日志文件的大小是看固定的,因此最终由这些文件成员组成的当前组会满的。而LGWR会执行一个叫做“日志交换”的操作。这个操作使第二组成为当前组并开始向其写入日志信息。如果你的数据库经过适当的配置,就会归档(也就是备份)这些日志文件成员组成第一组。当第二组满了的时候LGWR就会交换回到第一组使其再次成为当前组,然后覆盖写入日志数据。这样在线重做日志组就能循环使用而不用担心会满。

    同控制文件一样,如果每个日志组有很多成员(应该这样)并不需担心如何保证它们的同步性,LGWR确保把所有都写入进去,保证它们同步。假如丢失了一个组的一个成员,只要还存在其它成员,数据库就仍能继续运作。

    重做日志文件组的大小和成员数量的设置很重要。通常要选择一个适当的大小以分出来供重做日志组使用。一个非常繁忙的数据库比一个很大的静态数据库需要更多的重做日志组成员。每个日志组需要的成员数根据数据库的容错需要而定,然而在数据库创建的时候并不需要考虑这些。我们可以随时移走,增加或者删除重做日志文件,并且可以随时创建一个不同大小的重做日志文件。这些操作可以在线操作也就是并不需要关闭数据库才能操作。因此它们对终端用户是透明的。

    组成数据库的第三种文件是数据文件。在创建数据库的时候必须至少创建两个数据文件,在10g以前的版本可以只创建一个数据文件,但是从10g就必须创建至少2个数据文件。当然可以需要自己的需要可以创建更多的数据文件。

    数据文件主要用来存储数据库的数据的。它们的大小和数量在理论上是没有限制的。一个小型数据库可能仅仅有几GB大小,6个左右数据文件而每个数据文件也不过几百MB大小。一个大的数据库可能有数千个数据文件,大小受主机软硬件的限制依实际情况而不同。

    数据文件是系统管理员可以看到的物理结构,逻辑上它们以段存储程序员能看到的用户数据,这些段组成数据字典。数据文件可以在任何时候被重命名,改变大小,移动,增加,或者删除,但是要记住在一些数据文件的某些操作可能要求关闭数据库才能进行。

逻辑结构:表空间和段

    组成数据库的物理结构是可以被系统管理员看见的操作系统文件。而用户看到的是逻辑结构比如表。Oracle用术语“段”描述任何包含数据的结构。一个典型的段是表包含数行数据,但是在Oracle中有很多类型的段,一些比较重要的段有表段,索引段,重做段,这些段在以后会详细介绍。现在我们需要知道的是一个表包含很多行数据信息;索引机制可以快速的让我们访问到任何一个我们所关注的行;重做段是用来存储那些可能需要被回滚的数据的数据结构。

    系统管理员看到的是物理结构而程序员看到的是逻辑结构。Oracle把物理存储以表空间抽象出来成为逻辑存储结构。一个表空间是逻辑上一个或者多个段的集合,物理上是一个或者多个数据文件的集合。段和数据文件是多对多的关系:一个表可以被分成多个数据文件,而一个数据文件也可能包含多个表。通过在段和数据文件件引入表空间的概念,解决Oracle中这种物理和逻辑上多对多的关系。

    一些段必须在数据库创建的时候就被创建:这些段组成数据字典。这些段存储在两个表空间中:SYSTEM和SYSAUX表空间。其中SYSAUX表空间是在10g版本中新增的:在以前的版本中所有的数据字典数据都在SYSTEM表空间。数据库创建进程必须至少创建这两个表空间并为每个表空间至少创建一个数据文件从而存储数据字典。

考试小贴士:在10g版本中创建数据库时必须创建SYSAUX表空间,如果创建时没有指定的话,数据库创建进程会自动默认创建。

数据字典

    数据字典就是元数据:关于数据的数据。它从物理和逻辑上描述数据库和数据库中的内容。用户定义,安全信息,完整性约束和性能监视信息(10g版本才有)都是数据字典的一部分。它以多个段的集合的形式存储在SYSTEM和SYSAUX表空间中。

    在很多方面,组成数据字典的段大多是表段和索引段。不同的是数据字典的表是在数据库创建的时候产生的,用户并不能直接访问它们。但是一个好奇的数据库管理员还是可以直接访问它们的,如果随便改变了这些表段的内容可能会破坏数据库造成不可挽回的错误。创建一个数据字典是由数据库创建进程来完成的。当用户使用CREATE TABLE命令或者GRANT等SQL命令时实际是在向数据字典的表中插入数据行。

    为了查询数据字典,Oracle提供了一些视图。这些视图主要有三中形式,视图名分别以DBA_,ALL_和USER_开头,以USER_开头的视图主要描述当前用户所拥有的对象,因此两个不同的用户查询以USER_开头的视图一定是不同的结果。以ALL_开头的视图主要描述当前用户连接的对象,这个对象可以属于当前用户也可以属于其它用户。以DBA_开头的视图包含描述数据库中任何对象的信息。这些视图由数据库创建进程在数据库创建阶段连同一些PL/SQL包一起被创建的。这些PL/SQL包是供数据库管理员管理数据库和程序员开发应用程序用的,PL/SQL代码也是存储在数据字典中的。

考试小贴士:记住能让你查看数据库中所有表的信息的表是DBA_TABLES,而不是ALL_TABLES

管理工具

    Oracle Database 10g提供两个管理环境:Enterprise Manager Database Control和Enterprise Manager Grid Control。这两个管理工具虽然是可选择的但是Oracle推荐使用它们,并不希望用户使用第三方工具管理,其中Grid Control功能更复杂更强大,但是需要额外付费购买。

外部文件

    下面主要讨论在创建数据库之前的三个外部文件:参数文件,密码文件和归档日志文件。

    参数文件详细定义了一个实例。大家知道实例是由内存组织和进程组成。实例的一些特殊参数在参数文件中指定,比如各种内存组织应该多大,后台进程应该如何运行。参数文件也指定某些限制比如限制可以有多少个用户会话并发连接到实例。参数文件中的内容除了DB_NAME外其它都有默认值:DB_NAME指定实例要连接的数据库的名字。除了这个其它都可以保持默认,但是这样的实例并不会有什么实际用途。许多参数是动态的意味着这些参数的值可以在实例运行和数据库打开的情况下被改变,但是一些是在实例开始运行的时候被固定的。一个例外是所有的参数都可以在关闭数据库和停止实例后进行修改,具体过程是关闭数据库,停止实例,编辑参数文件,然后重新开始运行实例打开数据库。唯一一个不能过后被修改的是DB_BLOCK_SIZE(数据块大小)。在创建一个数据库之前必须先创建一个参数文件并用这个参数文件在内存中构建一个实例。

小贴士:参数分为“基本”和“高级”,我们只需设置一些基本参数(数量少点)即可,那些高级参数(太多了)留着默认值即可。

    有两种参数文件:旧式的静态参数文件(通常命名为init/SID/.ora,/SID/是实例名)和自9i版本以来才有的动态参数文件(命名为spfileSID.ora)。静态参数文件类似文本文件,可以用任何文本编辑器对其编辑(在Windows可用记事本在Unix可用vi)。静态参数文件只在实例启动的时候被读取一次。动态参数文件是一个二进制文件,由Oracle本身维护和编辑,以命令的方式与用户交互。

    密码文件在Oracle中比较容易让人引起混乱,在一些不理解的人看来当数据库还没有打开的时候或者是数据库就根本没有创建异或实例还没有开始的时候是如何进行身份验证的呢,在他们看来,身份验证信息无非是存储在数据字典中的数据行,可以通过查询视图DBA_USERS查询到加密过的密码。当创建一个用户的时候无非就是向数据字典中的表插入一行数据。按照这样的逻辑,如果在还没有权限创建或者打开数据库时Oracle无法从数据字典查询身份信息也就无法验证你的身份让你连接数据库。为了解决这种问题,Oracle提供了两种不是基于数据字典的身份验证因此可以在数据库没有被打开甚至还没有创建数据库的情况下完成身份验证。这两种身份验证方法分别是操作系统验证和密码文件验证。

    操作系统验证是指Oracle把对用户的身份验证任务交给主机操作系统来完成。在安装的时候(不是创建数据库的时候)就已经指定了一个能拥有Oracle的操作系统组的名字,在Unix中默认是dba,在Windows是ORA_DBA。如果你没有以指定的组用户登录安装Oracle的主机操作系统,将不能连接到实例,或者打开和创建数据库。但是这种身份验证方法不适用于远程连接数据库,因为用于身份验证的信息是在安装Oracle的那台主机上的系统文件。而密码文件则可以用于远程连接数据库,在工作计算机上输入用户名和密码连接远程数据库而远程的计算机通过工作计算机上的密码文件来确认你的身份信息。如果不需要远程管理只要用操作系统验证就行了,但是出于某些特殊用途,最好要有密码文件。

    在后面的章节将介绍归档日志文件。它们是在线重做日志满了以后的拷贝:当在线重做日志被填满时它们以归档日志的形式被拷贝到其它地方存储,这样就可以提供一个完整的关于应用到数据库的变化信息。然而归档日志并不是Oracle强制要求的,而是出于商业需要避免丢失数据的一个措施。

创建数据库

    创建数据库的步骤:

1、创建一个参数文件和一个密码文件。

2、用参数文件在内存中构建一个实例。

3、使用CREATE DATABASE命令创建一个数据库,该命令将按默认创建一个数据库:一个控制文件,两个在线重做日志文件,两个分别用于SYSTEM和SYSAUX表空间的数据文件和一个数据字典。

4、运行SQL脚本产生数据字典视图和一些应用PL/SQL包。

5、运行SQL脚本产生Enterprise Manager Database Control和一些其它数据要求的选项(如java)。

    在Windows系统有个额外的步骤因为Oracle在Windows系统以服务的方式运行,要确保创建了这些服务。

考试小贴士:你可以仅用两个单词就创建一个数据库,但是所有参数都是按默认的来创建。

    这些创建步骤可以通过一些交互式工具如SQL*Plus提示符或者图形界面工具数据库配置助手(DBCA)来完成。作为选择,你可以通过用脚本或者DBCA响应文件来自动化这个过程。无论在哪个平台,创建数据库最简单的方法是是通过DBCA。你可以把运行DBCA作为安装的一部分,在创建的整个过程中都会有一些提示信息。它将首先创建一个参数文件和一个密码文件并产生一个启动实例的脚本,然后创建数据库,产生数据字典,数据字典视图和企业管理控制器。当然你也可以手工建立参数文件和密码文件然后通过SQL*Plus会话完成剩下的工作。许多DBA都结合使用这两种方法,他们用DBCA产生文件和脚本然后通过手工修改后再由SQL*Plus运行。

    DBCA是用java语言写成的,因此可以跨平台。唯一不同的是Windows系统你必须在你要运行DBCA的计算机前工作才行,而在Unix系统你可在任何你想创建数据库的计算机上运行DBCA只要你有一个X-Window终端即可而无需坐在要运行DBCA的计算机前。在Unix系统可以设置环境变量DISPLAY告诉应用程序终端窗口的位置,例如:

export DISPLAY=10.10.1065:0.0

将指定X Window的IP地址是10.10.10.65而不管你实际运行DBCA是在哪个计算机。

练习3-1用DBCA创建一个数据库

  在这个练习中首先用DBCA创建一个数据库并查看和解释它所产生的脚本。

  1、以Oracle拥有者的组成员用户登录操作系统。在Unix中默认组是dba,在Windows中默认组是ORA_DBA。

    2、配置软件安装的家目录ORACLE_HOME,在Unix中运行命令:echo $ORACLE_HOME

       在Windows中在安装时会自动写入注册表。

    3、配置包含Oracle目录bin的搜索路径。在Unix中用下面命令显示搜索路径:echo $PATH

       在Windows用命令:echo %PATH%

       在Unix系统需要一个额外的变量是DISPLAY。必须指定你工作的终端位置,可以用下面的命令查看:echo $DISPLAY

       如果你就在要安装软件的计算机上工作,那么DISPLAY设置可能就是

       export DISPLAY=127.0.0.1:0.0

    4、运行DBCA。在Unix系统是文件dbca;在Windows系统是文件dbca.bat。它位于ORACLE_HOME/bin目录也就是配置的搜索路径。

    5、接下来的安装就是按提示选择并点下一步即可,安装过程和其它软件一样,这里省略部分内容。

数据库创建脚本

    在数据库创建的同时,看看DBCA产生的数据库创建脚本。DBCA会告诉你这些脚本的位置--通常在安装Oracle目录下的admin/<dbname>/scripts目录(dbname指的是你要创建的数据库的名字)。init.ora文件的内容类似如下:

############################################################################
# Copyright (c) 1991, 2001, 2002 by Oracle Corporation
############################################################################
###########################################
# Cache and I/O
###########################################
db_block_size=8192
db_cache_size=25165824
db_file_multiblock_read_count=16
###########################################
# Cursors and Library Cache
###########################################
open_cursors=300
###########################################
# Database Identification
###########################################
db_domain=""
db_name=ocp10g
###########################################
# Diagnostics and Statistics
###########################################
background_dump_dest=C:/oracle/admin/ocp10g/bdump
core_dump_dest=C:/oracle/admin/ocp10g/cdump
user_dump_dest=C:/oracle/admin/ocp10g/udump
###########################################
# File Configuration
###########################################
control_files=("C:/oracle/oradata/ocp10g/control01.ctl",
"C:/oracle/oradata/ocp10g/control02.ctl",
"C:/oracle/oradata/ocp10g/control03.ctl")
db_recovery_file_dest=C:/oracle/flash_recovery_area
db_recovery_file_dest_size=2147483648
###########################################
# Job Queues
###########################################
job_queue_processes=10
###########################################
# Miscellaneous
###########################################
compatible=10.1.0.2.0
###########################################
# Pools
###########################################
java_pool_size=0
large_pool_size=8388608
shared_pool_size=83886080
###########################################
# Processes and Sessions
###########################################
processes=150
###########################################
# Security and Auditing
###########################################
remote_login_passwordfile=EXCLUSIVE
###########################################
# Sort, Hash Joins, Bitmap Indexes
###########################################
pga_aggregate_target=25165824
sort_area_size=65536
###########################################
# System Managed Undo and Rollback Segments
###########################################
undo_management=AUTO
undo_tablespace=UNDOTBS1

    注意到这是个静态参数文件,进程随后会把它转化成动态参数文件。这些参数被用来在实例中构建一个实例,两个需要强调的变量是DB_BLOCK_SIZE和CONTROL_FILES。DB_BLOCK_SIZE决定数据库缓冲区中缓冲块的大小。当实例创建一个数据库时这个大小也被用来格式化组成SYSTEM和SYSAUX表空间的数据文件。DB_BLOCK_SIZE的大小在创建数据库后便不能再被改变。CONTROL_FILES指向允许实例发现的数据库控制文件,也包括控制文件的所有副本。在我们的练习中控制文件不存在:这个参数便会告诉实例在哪创建控制文件。

Some of the other parameters are self-explanatory, but
eventually you must refer to the Oracle Documentation Library (the volume you need
is titled “Reference”) and read up on all of them. All!

考试小帖士:数据块大小参数值在数据库创建后就再也不能改变了,而其它所有参数值都可以在数据库创建后再修改!

    下面是ocp10g.bat文件中的内容(在Unix中可能是个shell脚本):

mkdir C:/oracle/admin/ocp10g/bdump

mkdir C:/oracle/admin/ocp10g/cdump

mkdir C:/oracle/admin/ocp10g/create

mkdir C:/oracle/admin/ocp10g/pfile

mkdir C:/oracle/admin/ocp10g/udump

mkdir C:/oracle/flash_recovery_area

mkdir C:/oracle/oradata/ocp10g

mkdir C:/oracle/product/10.1.0/Db_1/database

set ORACLE_SID=ocp10g

C:/oracle/product/10.1.0/Db_1/bin/oradim.exe -new -sid OCP10G

-startmode manual -spfile

C:/oracle/product/10.1.0/Db_1/bin/oradim.exe -edit -sid OCP10G

-startmode auto -srvcstart system

C:/oracle/product/10.1.0/Db_1/bin/sqlplus /nolog

@C:/oracle/admin/ocp10g/scripts/ocp10g.sql

    这个脚本创建一些目录,设置ORACLE_SID环境变量然后用ORADIM.EXE(本例在Windows系统下)为实例创建Windows服务并让它自动运行。然后运行SQL*Plus执行名为ocp10g.sql的脚本文件:

set verify off

PROMPT specify a password for sys as parameter 1;

DEFINE sysPassword = &1

PROMPT specify a password for system as parameter 2;

DEFINE systemPassword = &2

PROMPT specify a password for sysman as parameter 3;

DEFINE sysmanPassword = &3

PROMPT specify a password for dbsnmp as parameter 4;

DEFINE dbsnmpPassword = &4

host C:/oracle/product/10.1.0/Db_1/bin/orapwd.exe

file=C:/oracle/product/10.1.0/Db_1/database/PWDocp10g.ora

password=&&sysPassword force=y

@C:/oracle/admin/ocp10g/scripts/CreateDB.sql

@C:/oracle/admin/ocp10g/scripts/CreateDBFiles.sql

@C:/oracle/admin/ocp10g/scripts/CreateDBCatalog.sql

@C:/oracle/admin/ocp10g/scripts/emRepository.sql

@C:/oracle/admin/ocp10g/scripts/postDBCreation.sql

    这个脚本提示一些在运行DBCA就已经提供的密码,然后调用ORAPWD.EXE(在Unix中为orapwd)创建一个外部密码文件。然后调用执行另外5个SQL脚本。第一个脚本是CreateDB.sql:

connect SYS/&&sysPassword as SYSDBA

set echo on

spool C:/oracle/product/10.1.0/Db_1/assistants/dbca/logs/CreateDB.log

startup nomount pfile="C:/oracle/admin/ocp10g/scripts/init.ora";

CREATE DATABASE "ocp10g"

MAXINSTANCES 8

MAXLOGHISTORY 1

MAXLOGFILES 16

MAXLOGMEMBERS 3

MAXDATAFILES 100

DATAFILE 'C:/oracle/oradata/ocp10g/system01.dbf' SIZE 300M

REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED

EXTENT MANAGEMENT LOCAL

SYSAUX DATAFILE 'C:/oracle/oradata/ocp10g/sysaux01.dbf' SIZE 120M REUSE

AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED

DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE

'C:/oracle/oradata/ocp10g/temp01.dbf' SIZE 20M REUSE AUTOEXTEND ON

NEXT 640K MAXSIZE UNLIMITED

UNDO TABLESPACE "UNDOTBS1" DATAFILE 'C:/oracle/oradata/ocp10g/undotbs01.dbf'

SIZE 200M REUSE AUTOEXTEND ON NEXT 5120K MAXSIZE UNLIMITED

CHARACTER SET WE8MSWIN1252

NATIONAL CHARACTER SET AL16UTF16

LOGFILE GROUP 1 ('C:/oracle/oradata/ocp10g/redo01.log') SIZE 10240K,

GROUP 2 ('C:/oracle/oradata/ocp10g/redo02.log') SIZE 10240K,

GROUP 3 ('C:/oracle/oradata/ocp10g/redo03.log') SIZE 10240K

USER SYS IDENTIFIED BY "&&sysPassword" USER SYSTEM IDENTIFIED BY

"&&systemPassword";

spool off

    这个脚本连接到实例,用语法通过密码文件进行身份验证。然后通过STARTUP NOMOUNT命令在内存中用之前提到的静态参数文件构建一个实例。有关NOMOUNT的重要性将在第5章中详细说明,现在只要知道必须这样就行了因为现在并没有数据库可以装载并打开。然后从CREATE DATABASE命令一直到文件结束是创建数据库。第一部分设置一些有管数据库的全局限制,不过这些设置过后都可以被修改的。接着是有关两个数据文件的详细设置:这些文件将被用于SYSTEM和SYSAUX表空间。接下来是指定TEMPORARY表空间和UNDO表空间(更多细节在16章中讲述)。然后指定字符集。直到9i版本,以前一旦字符集在创建的时候指定后就不能在修改了,而从9i版本以后这个设置就可以在以后需要修改的时候修改了。但是修改的过程还是比较麻烦的,因此建议创建的时候最好正确指定字符集。最后是定义三个在线日志文件组,每个组有一个成员,然后初始化数据库用户SYS和SYSTEM的密码。

    这一个文件就会创建一个数据库。当它成功执行完毕后将在内存中运行一个实例和一个由控制文件及其副本(通过参数CONTROL_FILES指定),数据文件和重做日志文件(CREATE DATABASE命令指定)组成的数据库。同时产生一个数据字典。尽管数据库已经被创建但是目前仍是不可用的,下面ocp10g.sql脚本调用的几个脚本将使数据库可用:

CreateDBfiles.sql创建另外一个表空间作为用户数据的默认储存位置。

CreateDBcatalog.sql产生数据字典视图和一些PL/SQL包。

emRepository.sql产生企业管理控制器工具

postDBcreation.sql作一些扫尾工作。

    以上所有过程都是由DBCA完成,作为测试,可以在Windows系统下的命令提示符中设置ORACLE_SID环境变量并登录新数据库:

C:/>

C:/>set ORACLE_SID=ocp10g

C:/>sqlplus sys/oracle as sysdba

SQL*Plus: Release 10.1.0.2.0 - Production on Sun Jul 25 12:34:14 2004

Copyright (c) 1982, 2004, Oracle. All rights reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production

With the Partitioning, OLAP and Data Mining options

SQL> select name,open_mode from v$database;

NAME OPEN_MODE

--------- ----------

OCP10G READ WRITE

SQL>

DBCA附加功能

    在运行DBCA的界面中有下面4个选项:

    创建一个数据库。

    配置数据库选项。

    删除一个数据库。

    管理模板。

    配置数据库选项可以帮助修改一个已存在数据库的各种参数。

    如果以后要安装一些附加功能,比如Java或者OLAP,只需重新运行DBCA就可轻松实现,当然也可通过手工运行脚本来实现,但是这样难免会因粗心出现一些小错误,所以使用DBCA更方便。

    通过删除一个数据库的选项将会提示你选择向要删除的数据库然后会通过一些步骤删除所有组成数据库的文件并且在Windows系统还会调用ORADIM.EXE删除系统服务。

    最后管理模板为以后重新创建类似的数据库提供了方便。通过模板储存了创建一个数据所需的各种参数设置,为方便以后创建数据库,用户可以创建多个数据库模板,这样的需要创建这些类似参数数据库时就可以直接利用模板进行创建了,到时便可以为用户省下不少功夫。

章节回顾

章节开始详细介绍Oracle服务体系结构。对此有个深刻的理解对以后继续学习用处很大,必须熟悉这些有关实例和数据库的基本原理:内存结构,进程和文件类型。然后对数据字典的用处和内容有个大致的了解并对表空间内的段的逻辑结构作了简单的讨论。最后用DBCA创建数据库并熟悉各种脚本和命令的作用。

习题

    1、下面哪个内存结构是SGA中所必须有的(3个答案)?

    A、数据库缓冲区

    B、Java池

    C、大池

    D、重做日志缓冲区

    E、共享池

    F、流池

    2、创建一个数据库,把下面步骤按正确顺序排列:

    A、建立数据字典

    B、创建一个参数文件

    C、创建数据字典视图

    D、使用CREATE DATABASE命令

    E、使用STARTUP NOMOUNT命令

    3、如果在用CREATE DATABASE命令创建数据库时没有指定SYSAUX数据文件,将会如何(选择最佳)?

    A、因为SYSAUX是必须的表空间所以这个命令会失败

    B、这个命令会成功执行但是必须在创建完数据库后增加一个SYSAUX表空间

    C、这个命令会成功执行并创建一个默认SYSAUX表空间

    D、这个命令会成功执行但是数据字典将会在SYSTEM表空间

    4、下面哪个在数据库创建后就再也不能被改变了(选择最佳)?

    A、数据块大小

    B、数据库字符集

    C、数据库名字

    D、以上都不对,所有值都可以在创建后修改

    5、创建数据库时下面哪个是必须的(选择最佳)?

    A、操作系统的root密码(Unix或Linux系统)或Administrator密码(Windows系统)

    B、运行DBCA的权限

    C、至少要有满足SGA需要的足够的物理内存大小

    D、以上都不对

    6、你在Unix或者Linux系统中运行DBCA,没有任何反应,可能是什么原因(选择最佳)?

  A、你不是dba组的成员

    B、你的DISPLAY变量设置的不是你当前的终端。

    C、你没有设置DISPLAY变量

    D、你没有设置ORACLE_SID变量

    7、下面哪些文件是可选的(3个答案)?

    A、在线重做日志文件

    B、参数文件

    C、密码文件

    D、SYSTEM表空间数据文件

    E、SYSAUX表空间数据文件

    F、UNDO表空间数据文件

    8、如果在用CREATE DATABASE命令创建数据库的时候没有指定一个UNDO表空间,将会怎样(选择最佳)?

    A、因为UNDO表空间是必须的所以这个命令将会失败

    B、这个命令会成功执行并创建一个默认UNDO表空间

    C、这个命令会成功执行但是你必须在过后创建一个UNDO表空间

    D、这个命令会成功执行,你可以在过后建立一个UNDO表空间

    9、你已经建立一个数据库但是却无法用Database Control连接到这个数据库,可能是什么原因(选择最佳)?

    A、你没有通过操作系统或者密码文件的身份验证

    B、你没有运行创建Database Control的脚本

    C、Grid Control是运行Database Control的前提条件

    D、你没有被授权使用Database Control

    10、数据字典是在什么时候建立的(选择最佳)?

    A、当你创建数据库的时候

    B、当你通过CreateDBcatalog.sql脚本调用运行脚本catalog.sql和catproc.sql的时候

    C、当SYSTEM和SYSAUX表空间创建的时候

    D、不需要创建,它总是实例的一部分

       11、下列哪些进程是可选的(3个答案)?

    A、归档进程

    B、检查点进程

    C、数据库监听进程

    D、Grid Control Management 代理进程

    E、日志写入进程

    F、进程监视进程

    12、你创建一个数据库有两组在线重做日志组且每组都有一个成员,你必须如何作才能提供容错性(选择最佳)?

    A、增加存在的这两组的两组镜像

    B、每组增加一个成员

    C、无需作任何事,这些已经在创建的时候固定下来了

    D、无需作任何事情,第二组已经是第一组的镜像了

    13、哪个数据字典视图可以让你查看到数据库中所有的表(选择最佳)?

    A、ALL_TABLES

    B、DAB_TABLES

    C、USER_TABLES

    D、以上都不对,要查看所有的表必须直接查询数据字典

    14、下面哪个不是存储在数据字典中的(选择最佳)?

    A、用户定义信息

    B、提供的PL/SQL包

    C、数据字典视图

    D、以上都是存储在数据字典中

    15、你在运行DBCA的时候没有选择Oracle Java虚拟机,但是过后又想安装它的时候该怎么办(选择最佳)?

    A、在数据库中创建Java池

    B、运行脚本创建JVM

    C、删除数据库,重新创建数据库的时候选择JVM

    D、运行JVM后台进程

答案

1、ADF

2、BEDAC

3、C

4、A

5、D

6、B

7、BCF

8、D

9、B

10、A

11、ACD

12、B

13、B

14、D

15、B