Oracle DBA基础教程
上QQ阅读APP看书,第一时间看更新

1.5 手工建库

1.5.1 手工建库的步骤以及注意事项

手工创建数据库需要详细的前期工作,并且要求对操作系统和应用系统有清晰的了解,手工创建数据库的过程如下:

01 确定唯一的实例名和数据库名;

02 选择数据库字符集;

03 设置操作系统变量;

04 编辑或创建初始化参数文件;

05 启动实例(NOMOUNT);

06 执行CREATE DATABASE指令;

07 运行脚本来创建数据字典并完成之后的数据库创建过程。

下面将对以上步骤做详细的介绍。

1.确定实例名

首先需要确定数据库名和实例名,一般在设置时将二者的名字设为相同以便于维护,一个数据库可以对应多个实例,如集群RAC系统,但是一个实例只能对应一个数据库。

2.选择数据库字符集

要根据操作系统选择字符集,如果是中文Windows系统,则最好选用中文字符集ZHS16GBK,这样可以减少数据库字符集和操作系统字符集之间的转换。

3.设置操作系统变量

在创建数据库前要设置如下所示的操作系统变量。

● Oracle_BASE:在Oracle软件的顶层目录。例如在笔者的电脑上,这个顶层目录为F:\Oracle。

● Oracle_HOME:设置Oracle软件的安装目录。在笔者电脑上该安装目录为F:\Oracle\product\10.2.0。

● ORA_NLS33:当创建不是US7ASCII字符集的数据库时使用该操作系统参数,如$Oracle_HOME/ocommon/nls/admin/data。

● PATH:设置操作系统搜索可执行文件的目录,如执行SQLPLUS、DBCA等工具,在Oracle11g中该目录是$Oracle_HOME/bin,并且需要将该目录添加到操作系统的PATH变量中。

● LD_LIBRARY_PATH:说明操作系统和Oracle数据库文件的目录,笔者的电脑上为$Oracle_HOME/lib。

4.创建初始化参数文件

在安装数据库软件时生成了一个初始化参数文件init.ora,此时创建一个新库需要的初始化参数文件newinit.ora,将init.ora文件中的内容全部复制到newinit.ora文件中,然后修改newinit.ora文件中的参数选项,如修改数据库名db_name,或SGA大小sga_target参数等。在参数文件中至少有一个数据库名参数,其他参数可以没有。

此时如果需要使用SPFILE参数文件启动数据库,可以使用如下命令初始化SPFILE参数文件,即CREATE SPFILE FORM PFILE。

5.启动数据库到NOMOUNT状态

此时启动了实例,读取参数文件,在当前数据库状态下执行数据库创建,如下所示。

    SQL> connect system/Oracle@orcl as sysdba 

6.使用CREATE DATABASE指令创建数据库

我们首先给出文献中提供的手工创建数据库的语法格式,然后给出一个例子详细介绍。

创建数据库的语法格式如下所示。

    CREATE DATABASE [database]
      [CONTROLFILE REUSE]
      LOGFILE [GROUP integer]] filename
      [MAXLOGFILES integer]
    [MAXLOGMEMBERS integer]
     [MAXLOGHISTORY integer] 
    [MAXDATAFILES integer]
    [MAXDINSTANCES integer]
    [ARCHIVELOG|NOARCHIVELOG]
    [CHARACTER SET charset]
    [NATIONAL CHARACTER SET charset]
    [DATAFILE filename [autoextend_clause]]

下面我们给出一个例子说明如何使用CREATE DATABASE来创建数据库。

    SQL> CREATE DATABASE LIN
      2  LOGFILE
      3  GROUP 1 ('F:/logfile/redo01_lin.log') size 20M
      4  GROUP 1 ('F:/logfile/redo02_lin.log') size 20M
      5  GROUP 1 ('F:/logfile/redo03_lin.log') size 20M
      6  MAXLOGFILES 5
      7  MAXLOGMEMBERS 5
      8  MAXLOGHISTORY 8
      9  MAXDATAFILES 256
     10  MAXINSTANCES 1
     11  ARCHIVELOG
     12  FORCE LOGGING
     13  DATAFILE 'F:/LINDATA/SYSTEM01_LIN.DBF' SIZE 500m
     14  UNDO TABLESPACE UNDOTBS
     15  DATAFILE 'F:/UNDODATA/UNDO01_LIN.DBF' SIZE 100m
     16  DEFAULT TEMPORARY TABLESPACE temp
     17  TEMPFILE 'F:/TEMPFILE/temp01_lin.dbf' SIZE 100M
     18  EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M
     19  character set ZHS16GBK;

● 第1行:创建名为LIN的数据库。

● 第2行~5行:创建3个重做日志组,每个日志组一个重做日志成员,每个成员大小为20MB。

● 第6行:该数据库中最多有5个重做日志组。

● 第7行:每个重做日志组最多有5个重做日志成员。

● 第8行:在集群环境中自动介质恢复时需要的最多归档日志文件数量。

● 第9行:控制文件中保留的数据文件记录个数。

● 第10行:可以同时打开的数据库个数为1。

● 第11行:新建的数据处于归档模式。

● 第12行:强制将除临时表空间和临时段中的变化数据外的所有变化,记录到重做日志文件中。

● 第13行:新数据库使用的数据文件为F:/LINDATA/SYSTEM01_LIN.DBF,大小为500MB,注意此时该文件是系统SYSTEM表空间基于的数据文件,默认是用户创建的表或其他数据库对象将保存在系统表空间中,所以在创建数据库后要创建一个USERS表空间用来存储用户数据。

● 第14行~15行:设置UNDO表空间(还原表空间),该表空间基于的数据文件为F:/UNDODATA/UNDO01_LIN.DBF,文件大小为100MB。

● 第16~17行:设置TEMP表空间(默认临时表空间),该表空间基于的数据文件为F:/TEMPFILE/temp01_lin.dbf,文件大小为100MB。

● 第18行:临时表空间的存储参数。该表空间为本地管理的表空间,EXTENT大小为1MB。

● 第19行:设置数据库字符集为中文字符集ZHS16GBK。

注意

在上述手工创建数据库的过程中没有创建用户,此时使用数据库默认的用户名和密码,其中SYS用户的密码为change_on_install,而SYSTEM用户的密码为 manager。

此时,数据库中包含了数据文件、控制文件和重做日志文件,一个数据表空间,一个还原表空间以及一个临时表空间。但是还需要使用脚本文件来创建数据字典。

7.创建数据字典视图

此时使用catalog.sql脚本文件,目录$Oracle_HOME\RDBMS\ADMIN为该脚本文件的存储目录。如果读者查看该文件的内容会发现一系列创建视图的SQL语句,Oracle使用脚本文件使得SQL指令成批地执行,在执行该脚本文件创建数据字典时要确保数据库处于打开状态,如下所示。

    SQL> CONNECT SYSTEM/Oracle@ORCL AS SYSDBA
    SQL>@F:\Oracle\product\10.2.0\db_1\RDBMS\ADMIN\CATALOG.SQL;

8.创建PL/SQL的软件包和过程

此时使用catproc.sql脚本文件。目录$Oracle_HOME\RDBMS\ADMIN为该脚本文件的存储目录。在数据库打开的状态下执行该脚本,如下所示。

    SQL> CONNECT SYSTEM/Oracle@ORCL AS SYSDBA
    SQL>@F:\Oracle\product\10.2.0\db_1\RDBMS\ADMIN\CATPROC.SQL;

9.创建用户的概要文件以及相关过程

此时使用pupbld.sql脚本文件。目录$Oracle_HOME\SQLPLUS\ADMIN为该脚本文件的存储目录。该文件必须在DBA用户下执行,如下所示。

    SQL> CONNECT SYSTEM/Oracle@ORCL AS SYSDBA
    SQL>@F:\Oracle\product\10.2.0\db_1\RDBMS\SQLPLUS\CATPROC.SQL;

说明

此时成功手工创建了数据库,但是在创建数据库的过程中会出现一些问题,如创建的文件可能已经存在,此时必须手工删除这些文件再重新创建数据库,如果建库过程中出现了问题,而需要使用CREATE DATABASE创建数据库,则要先删除掉操作系统上已经创建的文件。如遇到文件权限或磁盘空间不足的情况也需要重新执行相关指令,所以在手工创建数据库前要做详细的“调查研究”,搞清楚需求和机器的硬件软件资源。

1.5.2 Linux系统上的手工建库实例

前提是我们预先安装了Oracle数据库软件,即RDBMS,并且配置了环境变量$Oracle_HOME、$Oracle_BASE。下面我们详细介绍在此基础上如何从无到有,手工创建一个数据库。

1.查看当前的环境变量

     [Oracle@ocm1 ~]$ echo $Oracle_HOME
    /u01/app/Oracle/product/10.2.0/db_1
    [Oracle@ocm1 ~]$ echo $Oracle_BASE;
    /u01/app/Oracle

获得环境变量值,为编写参数文件中的某些参数涉及的目录做准备。

2.编写参数文件

参数文件的内容如下:

    compatible=10.2.0.1.0   
    db_name=pod
    instance_name=POD
    sga_max_size=500m
    sga_target=300m
    undo_management=auto
    undo_tablespace=undotbs
    job_queue_processes=10
    user_dump_dest=/u01/app/Oracle/admin/POD/udump
    core_dump_dest=/u01/app/Oracle/admin/POD/cdump
    background_dump_dest=/u01/app/Oracle/admin/POD/bdump
    control_files='/u01/app/Oracle/oradata/POD/control01.ctl','/u01/app/Oracle/oradata/POD/cont
    rol02.ctl','/u01/app/Oracle/oradata/POD/control03.ctl'

下面我们依次解释这些参数的含义:

● compatible:Oracle数据库版本号;

● db_name:数据库名;

● instance_name:实例名;

● sga_max_size:设置SGA的最大值;

● sga_target:设置SGA_TARGET的值,该值不大于SGA_MAX_SIZE的值;

● undo_management:还原表空间的管理方式;

● undo_tablespace:数据库要使用的还原表空间;

● job_queue_processes:作业队列进程数;

● user_dump_dest:用户后台导出文件目录,参考$Oracle_BASE设置;

● core_dump_dest:核心后台导出文件目录,参考$Oracle_BASE设置;

● background_dump_dest:后台进程导出文件目录,参考$Oracle_BASE设置;

● control_files:控制文件的目录和文件名,控制文件需要多工设置。

3.创建密码文件

密码文件存放的目录位于$Oracle_HOME/dbs下,我们在该目录下创建密码文件,如下所示。

    [Oracle@ocm1 dbs]$ orapwd file=orapwPOD password=Oracle

此时,我们完成了初始化参数为文件和密码文件的创建,就可以启动数据库到nomount状态了,但是要注意,由于是手工建库,某些目录需要创建,下面我们就创建这些必要的目录。

4.创建所需要的目录

    mkdir /u01/app/Oracle/admin/POD/{a,b,c,u,dp}dump -p
    mkdir /u01/app/Oracle/oradata/disk1 -p
    mkdir /u01/app/Oracle/oradata/disk2
    mkdir /u01/app/Oracle/oradata/POD/ -p

5.启动数据库到nomount状态

首先需要告诉数据库要启动的是哪个数据库,通过export的一个环境变量获得,之后使用pfile参数启动数据库到nomount状态。

    export Oracle_SID=POD
    
    sqlplus / as sysdba
    SQL> startup nomount pfile='/u01/app/Oracle/product/10.2.0/db_1/dbs/initPROD.ora';
    Oracle instance started.
    
    Total System Global Area  524288000 bytes
    Fixed Size                  1220384 bytes
    Variable Size             310378720 bytes
    Database Buffers          209715200 bytes
    Redo Buffers                2973696 bytes
    SQL> create spfile from pfile;
    
    File created.

接下来,使用startup force指令来强制数据库关闭再重启,但只是启动到nomount状态。

    SQL> startup force nomount;
    Oracle instance started.
    
    Total System Global Area  524288000 bytes
    Fixed Size                  1220384 bytes
    Variable Size             310378720 bytes
    Database Buffers          209715200 bytes
    Redo Buffers                2973696 bytes

6.创建数据库

该步骤将使用一系列创建数据库的参数,如实例数,日志组数,字符集以及各种表空间的设置,具体如下所示。

    create database pod
    maxinstances 2
    maxdatafiles 200
    maxlogfiles 32
    maxlogmembers 5
    maxloghistory 100
    user sys identified by Oracle
    user system identified by Oracle
    character set al32utf8
    national character set al16utf16
    datafile '/u01/app/Oracle/oradata/POD/system01.dbf' size 300m autoextend on
    extent management local segment space management auto
    sysaux datafile '/u01/app/Oracle/oradata/POD/sysaux01.dbf' size 300m autoextend on
    undo tablespace undotbs datafile '/u01/app/Oracle/oradata/POD/undotbs01.dbf' size 
    100m autoextend on
    default temporary tablespace temp tempfile '/u01/app/Oracle/oradata/POD/temp01.dbf' 
    size 100m autoextend on
    logfile
    group 1 '/u01/app/Oracle/oradata/POD/disk1/redo01.log' size 100m,
    group 2 '/u01/app/Oracle/oradata/POD/disk2/redo02.log' size 100m

参数的含义在手工建库的步骤中已经说明,虽然此时已经成功创建了一个合法的数据库,但是具体使用还需要一些工作要做。首先需要创建一个用户表空间,然后需要运行必要的脚本来创建数据字典和PL/SQL过程,最后还需要配置必要的监听和tns文件。下面我们一步步完成这些需求。

创建永久表空间。

    create tablespace users datafile '/u01/Oracle/oradata/POD/users01.dbf' size 100m 
    autoextend on;

设置数据库默认永久表空间为USERS,如果新建的用户没有指定永久默认表空间,将使用USERS表空间作为永久默认表空间。

    alter database default tablespace users;

7.配置监听

    cd $Oracle_HOME/network/admin
    vi listener.ora     

编辑后的listener.ora文件的内容如下所示。

    SID_LIST_LISTENER =
        (SID_LIST =
            (SID_DESC =
                (SID_NAME = POD)
                (Oracle_HOME=/u01/app/Oracle/product/10.2.0/db_1)
                (GLOBAL_DBNAME = POD)
            )
        )
    LISTENER =
        (DESCRIPTION_LIST =
         (DESCRIPTION =
            (ADDRESS = (PROTOCOL = TCP)(HOST = ocm1.uplooking.com)(PORT = 1521))
         )
        )

8.编辑TNS文件

    cd $Oracle_HOME/network/admin
    vi tnsnames.ora

编辑后的tnsnames.ora文件内容如下所示。

    POD =
        (DESCRIPTION =
          (ADDRESS_LIST =
            (ADDRESS = (PROTOCOL = TCP)(HOST = ocm1.uplooking.com)(PORT = 1521))
          )
          (CONNECT_DATA =
            (SERVICE_NAME = POD)
          )
        )

然后启动监听。

    lsnrctl start

通过TNSPING指令测试连通性。

    SQL>tnsping POD
    [Oracle@ocm1 dbs]$ tnsping std
    
    TNS Ping Utility for Linux: Version 10.2.0.1.0 - Production on 08-OCT-2011 21:23:30
    
    Copyright (c) 1997, 2005, Oracle.  All rights reserved.
    
    Used parameter files:
    
    
    Used TNSNAMES adapter to resolve the alias
    Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 
    ocm1.oracle)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) 
    (SERVICE_NAME = POD)))
    OK (50 msec)

9.执行三个脚本

前两个脚本使用sys as sysdba连接数据库执行,如下所示。

    sqlplus sys/Oracle as sysdba
    @?/rdbms/admin/catalog     //创建数据字典
    @?/rdbms/admin/catproc    //创建必须PL/SQL过程

第三个脚本使用system用户连接并执行。

    connect system/Oracle
    @?/sqlplus/admin/pupbld    //创建必须PL/SQL过程