2.2 使用DBCA生成数据库创建脚本

没有理由不使用DBCA交互式创建数据库,但在许多情况下,最好通过命令行创建数据库。为什么?原因可能如下:

● 服务器可能没有图形功能。

● 更改控制功能可能需要测试过的脚本。

● 可能需要创建许多相同的数据库。

● 不希望坐在屏幕前响应提示。

无论什么原因,如果有脚本,手工创建数据库都很简单。编写脚本的最简单方式是让DBCA完成。

2.2.1 生成脚本

要生成脚本,可以启动DBCA,进入对话框,选择合适的选项。在步骤10,选择对应的复选框,再选择一个目录。默认位置是ORACLE_BASE下面。在Windows上,数据库orcl121的一般位置如下:

        c:\app\oracle\admin\orcl121\scripts

在Linux上,一般位置如下:

        /u01/app/oracle/admin/orcl121/scripts

无论什么平台,脚本的结构都相同:以数据库命名的外壳脚本(例如,对于Linux,是orcl121.sh;对于Windows,是orcl121.bat)。该脚本执行一些操作系统(OS)任务,再启动SQL*Plus,以运行SQL脚本(称为oracle121.sql)。SQL脚本完成数据库创建的剩余工作。研究这些脚本和它们调用的脚本是有益的。

2.2.2 创建脚本

起点是外壳脚本。看看Linux版本示例:

        #! /bin/sh
        OLD_UMASK='umask'
        umask 0027
        mkdir -p /u01/app/oracle/admin/orcl121/adump
        mkdir -p /u01/app/oracle/admin/orcl121/dpdump
        mkdir -p /u01/app/oracle/admin/orcl121/pfile
        mkdir -p /u01/app/oracle/audit
        mkdir -p /u01/app/oracle/cfgtoollogs/dbca/orcl121
        mkdir -p /u01/app/oracle/fast_recovery_area
        mkdir -p /u01/app/oracle/fast_recovery_area/orcl121
        mkdir -p /u01/app/oracle/oradata/orcl121
        mkdir -p /u01/app/oracle/product/12.1.0/dbhome_1/dbs
        umask ${OLD_UMASK}
        ORACLE_SID=orcl121; export ORACLE_SID
        PATH=$ORACLE_HOME/bin:$PATH; export PATH
        echo You should Add this entry in the /etc/oratab:
        orcl121:/u01/app/oracle/product/12.1.0/dbhome_1:Y
        /u01/app/oracle/product/12.1.0/dbhome_1/bin/sqlplus /nolog
        @/u01/app/oracle/admin/orcl121/scripts/orcl121.sql

这会通过DBCA对话框提供的、ORACLE_BASE和ORACLE_HOME环境变量的值,或者默认值,利用合适的访问权限来创建几个目录。接着调用SQL *Plus 启动SQL脚本oracle121.sql。Windows 上的变化是调用ORADIM实用程序,在运行实例的账户下创建Windows服务。

根据在DBCA对话框中选择的选项,生成的SQL脚本有很大区别。下面是一个例子:

        set verify off
        ACCEPT sysPassword CHAR PROMPT 'Enter new password for SYS: ' HIDE
        ACCEPT systemPassword CHAR PROMPT 'Enter new password for SYSTEM: ' HIDE
        host /u01/app/oracle/product/12.1.0/dbhome_1/bin/orapwd file=/u01/app/oracle/
        product/12.1.0/dbhome_1/dbs/orapworcl121

       force=y extended=y
        @/u01/app/oracle/admin/orcl121/scripts/CreateDB.sql
        @/u01/app/oracle/admin/orcl121/scripts/CreateDBFiles.sql
        @/u01/app/oracle/admin/orcl121/scripts/CreateDBCatalog.sql
        @/u01/app/oracle/admin/orcl121/scripts/sampleSchema.sql
        @/u01/app/oracle/admin/orcl121/scripts/apex.sql
        @/u01/app/oracle/admin/orcl121/scripts/postDBCreation.sql
        @/u01/app/oracle/admin/orcl121/scripts/lockAccount.sql

ACCEPT命令提示输入SYS和SYSTEM模式的密码。接着,脚本调用一个主外壳程序,运行orapwd实用程序。这个实用程序用平台特定的名称创建外部密码文件。在Linux上,它是$ORACLE_ HOME/dbs/orapw<DBNAME>(其中<DBNAME>是数据库的名称);在Windows上,它是% ORACLE_ HOME%\database\PWD<DBNAME>.ora。

下面是一组对其他SQL脚本的调用,从CreateDB.sql开始:

        SET VERIFY OFF
        connect "SYS"/"&&sysPassword" as SYSDBA
        set echo on
        spool /u01/app/oracle/admin/orcl121/scripts/CreateDB.log append
        startup nomount pfile="/u01/app/oracle/admin/orcl121/scripts/init.ora";
        CREATE DATABASE "orcl121"
        MAXINSTANCES 8
        MAXLOGHISTORY 1
        MAXLOGFILES 16
        MAXLOGMEMBERS 3
        MAXDATAFILES 100
        DATAFILE '/u01/app/oracle/oradata/orcl121/system01.dbf' SIZE 700M
        REUSE AUTOEXTEND ON NEXT  10240K MAXSIZE UNLIMITED
        EXTENT MANAGEMENT LOCAL
        SYSAUX DATAFILE '/u01/app/oracle/oradata/orcl121/sysaux01.dbf' SIZE 550M
        REUSE AUTOEXTEND ON NEXT  10240K MAXSIZE UNLIMITED
        SMALLFILE DEFAULT TEMPORARY TABLESPACE TEMP

       TEMPFILE '/u01/app/oracle/oradata/orcl121/temp01.dbf' SIZE 20M
        REUSE AUTOEXTEND ON NEXT  640K MAXSIZE UNLIMITED
        SMALLFILE UNDO TABLESPACE "UNDOTBS1"

       DATAFILE  '/u01/app/oracle/oradata/orcl121/undotbs01.dbf' SIZE 200M
        REUSE AUTOEXTEND ON NEXT  5120K MAXSIZE UNLIMITED
        CHARACTER SET AL32UTF8
        NATIONAL CHARACTER SET AL16UTF16
        LOGFILE GROUP 1 ('/u01/app/oracle/oradata/orcl121/redo01.log') SIZE 51200K,
        GROUP 2 ('/u01/app/oracle/oradata/orcl121/redo02.log') SIZE 51200K,
        GROUP 3 ('/u01/app/oracle/oradata/orcl121/redo03.log') SIZE 51200K
        USER SYS IDENTIFIED BY "&&sysPassword"

       USER SYSTEM IDENTIFIED BY "&&systemPassword";
        spool off

第二行使用提供的密码用SYS用户的身份进行连接。第5行使用参数文件init.ora以非装载模式启动数据库。这个文件包含的参数是默认设置的,或者是在DBCA对话框中指定的。下一个命令(一直到文件尾)创建了数据库。

提示:

记住模式:nomount命令表示“建立内存结构,启动进程。”

CREATE DATABASE “oracle121”命令行的后面是一些限制的设置 ( 例如MAXDATAFILES=100表示这个数据库限制为100个数据文件),之后是4个表空间的子句:

● SYSTEM表空间(存储数据字典)在数据文件system01.dbf中,其大小为700MB。

● SYSAUX表空间(不与数据字典关联、但关系紧密的对象)在数据文件sysaux01.dbf中,其大小为550MB。

● 默认的临时表空间TEMP(用于临时数据——会话需要的空间,仅持续较短时间)在临时文件temp01.dbf中,其大小为20MB。撤消表空间UNDOTBS1(用于撤消段,是确保事务持续性所必须的)使用数据文件undotbs01.dbf,其大小为200MB。

接着指定数据库和语言的字符集。在例子中指定了Unicode。LOGFILE部分指定,数据库应有3个联机日志文件组,每个组都包含一个50MB的文件(日志文件成员)。最后,设置SYS和SYSTEM的密码。

这个数据库创建目录仅运行了几分钟。它只是创建了数据库所需的最小结构,最重要的是创建了数据字典。然后,控制权返回给调用的SQL脚本,它(在本例中)启动了更多的脚本。

● CreateDBFiles.sql创建了表空间USERS,用作默认的表空间,以存储永久对象(如表)。

● CreateDBCatalog.sql调用一组脚本,根据数据字典和各种提供的PL/SQL包,生成需要的视图。

● 接着几个脚本(JServer.sql到apex.sql)生成在DBCA对话框中选择的各个选项。

● postDBCreation.sql在创建后立即运行所有必要的操作,例如应用绑定的包,把pfile转换为spfile。

● lockAccount.sql锁定所有预先注册的账户(有几个例外),最后重新启动数据库。

根据DBCA对话框中的选项,生成的脚本及其内容互不相同。例如,如果第3步选择从模板中创建数据库,整个过程就简单许多,因为数据库不需要创建,大多数工作都通过调用RMAN Recovery Manager过程来完成,实际上是在模板中从一个备份中恢复数据库。

2.2.3 初始化参数文件

要启动数据库实例,DBCA必须创建一个初始化参数文件。选择创建数据库或生成脚本的选项时,就会生成该文件。该文件在其他脚本所在的目录下生成,在CreateDB.sql脚本的STARTUP命令下指定。

        startup nomount pfile="/u01/app/oracle/admin/orcl121/scripts/init.ora";

下面是练习2-1的对话框生成的文件(为简洁起见,删除了注释):

        db_block_size=8192
        open_cursors=300
        db_domain=""
        db_name="orcl121"
        control_files=("/u01/app/oracle/oradata/orcl121/control01.ctl",
        "/u01/app/oracle/fast_recovery_area/orcl121/control02.ctl")
        db_recovery_file_dest="/u01/app/oracle/fast_recovery_area"
        db_recovery_file_dest_size=5061476352
        compatible=12.0.0.0.0
        diagnostic_dest=/u01/app/oracle
        processes=300
        sga_target=503316480
        audit_file_dest="/u01/app/oracle/admin/orcl121/adump"
        audit_trail=db
        remote_login_passwordfile=EXCLUSIVE
        dispatchers="(PROTOCOL=TCP) (SERVICE=orcl121XDB)"
        pga_aggregate_target=167772160
        undo_tablespace=UNDOTBS1

所有这些参数都在后面的章节中讨论。该文件在上百个参数中仅指定了16个,是运行典型数据库所需的最少参数集。根据环境、规模和性能的要求,后面将添加更多的参数。

练习2-2 使用DBCA生成数据库创建脚本

使用DBCA生成几组数据库创建脚本。尽量多重复几次,每次都提供不同的数据库名和SID,选择不同的选项。下面是要执行的步骤:

(1) 启动DBCA。响应提示,如下所示:

A.选择Create Database单选按钮。单击Next按钮。

B.选择Advanced Mode 单选按钮。如果选择Create A Database With Default Configuration,就不会显示生成脚本的提示。单击Next按钮。

C.选择General Purpose Or Transaction Processing单选按钮。单击Next按钮。

D.把Global Database Name和SID值都指定为gpdb。单击Next按钮。

E.取消选择所有选项,单击Next按钮。

F.输入密码Oracle121。单击Next按钮。

G.在Storage Type下拉框中选择File System,其他使用默认值。单击Next按钮。

H.使用所有默认值,单击Next按钮。

I.使用所有默认值,单击Next按钮。

J.取消选择Create Database和Save As A Database Template复选框,选择Generate Database Creation Scripts复选框。注意创建脚本的目录。单击Next按钮。

K.这一步不需要任何输入。

L.研究汇总。注意从模板中安装,将包含上一练习提到的所有选项,还给不同的参数指定了值。单击Finish按钮。

M.生成脚本,单击OK按钮,再单击Close按钮。

(2) 研究脚本。

尝试逆向工程创建过程。注意使用模板,使该过程简单许多。比较这个练习和上个练习生成的脚本。

(3) 重复。

重复这个练习,使用不同的设置,熟悉DBCA对话框和它生成的脚本非常重要。