《循序渐进Oracle》第一章连载-之六

来源:互联网 发布:网店美工论文目录 编辑:程序博客网 时间:2024/06/16 06:09

《循序渐进Oracle》第一章连载-之六

作者:eygle |English Version 【转载时请以超链接形式标明文章出处和作者信息及本声明】
链接:http://www.eygle.com/archives/2007/08/stepbs_oracle_chp1_06.html
站内相关文章|Related Articles
  • 《循序渐进Oracle》一书及相关信息
  • 《循序渐进Oracle》再次重印
  • 《循序渐进Oracle》一书重印
  • 《循序渐进Oracle》之后写什么?
  • 《循序渐进Oracle》一书序言
  • 1.2.8 db_name参数和instance_name参数

    在启动实例后执行的创建数据库中,第一个语句就是
    CREATE DATABASE "eygle"
    这是数据库最重要的开始,其中"eygle"也就是 图1-4 中定义的数据库名称。

    对于Oracle数据库来说,db_name代表数据库的名称而instance_name代表实例的名称,instance_name通过参数文件即可修改,而db_name则不然,我们看一下Oracle对于数据库名称的定义:

    DB_NAME必须是一个不超过8个字符的文本串.在数据库创建过程中,db_name被记录在数据文件,日志文件和控制文件中。如果数据库实例启动过程中参数文件中的db_name和控制文件中的数据库名称不一致,则数据库不能启动。

    通过以上定义可以看到,db_name是最具有稳定意义的参数,在数据文件、日志文件和控制文件中都会记录数据库的名称,这个名称完全可以不同于instance_name。

    以下的测试数据库拥有相同的db_name和instance_name:

    [oracle@jumper oracle]$ cd $ORACLE_HOME/dbs
    [oracle@jumper dbs]$ grep name initeygle.ora
    *.db_name='eygle'
    *.instance_name='eygle'

    我们创建一个新的pfile为julia这个新的实例使用:

    [oracle@jumper oracle]$ cd $ORACLE_HOME/dbs
    [oracle@jumper dbs]$ cp initeygle.ora initjulia.ora

    修改这个文件更改instance_name参数:

    [oracle@jumper dbs]$ grep name initjulia.ora
    *.db_name='eygle'
    *.instance_name='julia'

    然后我们启动实例名称为julia的instance:

    >[oracle@jumper dbs]$ export ORACLE_SID=julia
    [oracle@jumper dbs]$ sqlplus "/ as sysdba"
    SQL*Plus: Release 9.2.0.4.0 - Production on Tue Jul 25 14:04:15 2006
    Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
    Connected to an idle instance.


    SQL> startup mount;
    ORACLE instance started.


    Total System Global Area  139531744 bytes
    Fixed Size                   452064 bytes
    Variable Size             121634816 bytes
    Database Buffers           16777216 bytes
    Redo Buffers                 667648 bytes
    ORA-01102: cannot mount database in EXCLUSIVE mode

    注意,此时试图加载数据库时出现错误,因为当前数据库被另外一个实例(instance)加载。在非并行模式(OPS/RAC)下,一个数据库同时只能被一个实例加载。

    此时已经启动了两个数据库实例,从后台进程可以看出:

    [oracle@jumper dbs]$ ps -ef|grep ora_pmon
    oracle 27321 1 0 Jul14 ? 00:00:00 ora_pmon_eygle
    oracle 15445 1 0 14:04 ? 00:00:00 ora_pmon_julia
    oracle 15459 15391 0 14:04 pts/2 00:00:00 ps -ef
    oracle 15460 15391 0 14:04 pts/2 00:00:00 grep ora_pmon

    关闭eygle这个数据库实例后,就可以通过实例julia加载并打开db_name=eygle的数据库了:

    [oracle@jumper dbs]$ export ORACLE_SID=julia
    [oracle@jumper dbs]$ sqlplus "/ as sysdba"
    SQL*Plus: Release 9.2.0.4.0 - Production on Tue Jul 25 14:05:06 2006
    Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
    ......
    SQL> alter database mount;
    alter database mount
    *
    ERROR at line 1:
    ORA-01990: error opening password file '/opt/oracle/product/9.2.0/dbs/orapw'
    ORA-27037: unable to obtain file status
    Linux Error: 2: No such file or directory
    Additional information: 3

    SQL> alter database open;
    Database altered.
    SQL> select name from v$datafile;
    NAME
    ----------------------------------------------------------------------------
    /opt/oracle/oradata/eygle/system01.dbf
    /opt/oracle/oradata/eygle/undotbs01.dbf
    /opt/oracle/oradata/eygle/users01.dbf
    /opt/oracle/oradata/eygle/eygle01.dbf

    新的实例具有独立的instance_name和db_name参数设置:

    SQL> ! ps -ef|grep ora_pmon
    oracle   15445     1  0 14:04 ?        00:00:00 ora_pmon_julia
    oracle   15515 15513  0 14:05 pts/2    00:00:00 /bin/bash -c  ps -ef|grep ora
    oracle   15516 15515  0 14:05 pts/2    00:00:00 ps -ef
    SQL> show parameter instance_name
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    instance_name                        string      julia
    SQL> show parameter db_name
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    db_name                              string      eygle

    我们再看看如果参数文件中的db_name和控制文件中的db_name不一致会出现什么错误。
    修改参数文件中的db_name参数:

    [oracle@jumper dbs]$ grep name initjulia.ora
    *.db_name='julia'
    *.instance_name='julia'

    在启动过程中,我们看到,在mount阶段,数据库会对参数文件和控制文件进行比较,如果两者记录的db_name不一致,则数据库无法启动:

    SQL> startup nomount;
    ORACLE instance started.
    <...ignore SGA info here...>

    SQL> alter database mount;
    alter database mount
    *
    ERROR at line 1:
    ORA-01103: database name 'EYGLE' in controlfile is not 'JULIA'

    最后总结一下:
    一个实例(instance_name)可以mount并打开任何数据库(db_name),但是同一时间一个实例只能打开一个数据库;一个数据库(db_name)同一时间可以为任一实例(instance_name)所打开,但是在非OPS/RAC情况下,同时只能被同一个实例所打开。

    1.2.9 sql.bsq文件与数据库创建

    在CREATEDATABASE的过程中,Oracle会调用$ORACLE_HOME/rdbms/admin/sql.bsq脚本,用于创建数据字典,这是非常重要的一个脚本,其中存储了数据字典的创建语句及注释说明,当我们对某些数据字典存在兴趣时,可以通过检查这个文件得到更为详细的信息,例如对于控制数据库启动的bootstrap$表,其创建语句就可以从这个文件中找到:

    create table bootstrap$
    ( line#         number not null,                       /* statement order id */
      obj#          number not null,                            /* object number */
      sql_text      varchar2("M_VCSZ") not null)                    /* statement */
      storage (initial 50K)            /* to avoid space management during IOR I */
    //                                            /* "//" required for bootstrap */

    sql.bsq文件的位置受到一个隐含的初始化参数(_init_sql_file)的控制:

    SQL> @GetParDescrb.sql
    Enter value for par: init_sql
    old 6: AND x.ksppinm LIKE '%&par%'
    new 6: AND x.ksppinm LIKE '%init_sql%'

    NAME VALUE DESCRIB
    --------------- --------------------- ----------------------------------------------------
    _init_sql_file ?/rdbms/admin/sql.bsq File containing SQL statements to execute upon database creation

    如果在创建过程中,Oracle无法找到sql.bsq文件,则数据库创建将会出错。可以测试一下移除sql.bsq文件,看一下数据库创建过程:

    [oracle@jumper scripts]$ sqlplus "/ as sysdba"
    SQL*Plus: Release 9.2.0.4.0 - Production on Fri Aug 18 15:45:26 2006
    Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

    Connected to an idle instance.
    SQL> startup nomount;
    ORACLE instance started.
    <...ignore SGA info here...>

    SQL> @CreateDB.sql
    CREATE DATABASE eygle
    *
    ERROR at line 1:
    ORA-01092: ORACLE instance terminated. Disconnection forced

    Disconnected from Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
    With the Partitioning option
    JServer Release 9.2.0.4.0 - Production

    此时警告日志(alert_.log)中会记录如下信息:

    Fri Aug 18 15:45:49 2006
    Errors in file /opt/oracle/admin/eygle/udump/eygle_ora_3632.trc:
    ORA-01501: CREATE DATABASE failed
    ORA-01526: error in opening file '?/rdbms/admin/sql.bsq'
    ORA-07391: sftopn: fopen error, unable to open text file.
    Error 1526 happened during db open, shutting down database
    USER: terminating instance due to error 1526
    Fri Aug 18 15:45:49 2006
    Errors in file /opt/oracle/admin/eygle/bdump/eygle_ckpt_3623.trc:
    ORA-01526: error in opening file ''
    Instance terminated by USER, pid = 3632
    ORA-1092 signalled during: CREATE DATABASE eygle
    MAXINSTANCES 1
    MAXLOGHISTORY...

    这就是sql.bsq文件在数据库创建过程中的作用。知道了这个内容之后,我们可以通过手工修改sql.bsq文件来更改数据库字典对象参数,从而实现特殊要求数据库的创建或测试自定义库,也可以通过修改_init_sql_file参数来重定位sql.bsq文件的位置(但是通常这些是不建议变更的)。

    1.2.10 数据文件及字典的创建

    再来看CreateDBFiles.sql文件:

    C:/Oracle/admin/eygle/scripts>type CreateDBFiles.sql
    connect "SYS"/"&&sysPassword" as SYSDBA
    set echo on
    spool C:/oracle/admin/eygle/scripts/CreateDBFiles.log
    CREATE SMALLFILE TABLESPACE "USERS" LOGGING DATAFILE SIZE 5M AUTOEXTENDON NEXT 1280K MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACEMANAGEMENT AUTO;
    ALTER DATABASE DEFAULT TABLESPACE "USERS";
    spool off

    这个文件向数据库中追加了USERS表空间,并将该表空间设置为系统缺省的数据表空间,注意最后一句:
    ALTER DATABASE DEFAULT TABLESPACE "USERS";

    这是Oracle 10g增加的新特性,在Oracle 10g之前,如果创建用户不指定缺省的数据表空间,那么用户的缺省表空间会被指向系统表空间,增加了数据库缺省数据表空间后,如果不指定,那么创建用户的缺省数据表空间会被指向这里:

    SQL> create user julia identified by eygle;
    用户已创建。

    SQL> select username,default_tablespace from dba_users
    2 where username='JULIA';
    USERNAME DEFAULT_TABLESPACE
    ------------------------------ ------------------------------
    JULIA USERS

    作为一个数据库属性,这个信息也可以从字典表props$中查询得到:

    SQL> select name,value$ from props$
    2 where name='DEFAULT_PERMANENT_TABLESPACE';
    NAME VALUE$
    ------------------------------ ------------------
    DEFAULT_PERMANENT_TABLESPACE USERS

    继续前面的讨论,接下来Oracle通过CreateDBCatalog.sql创建数据字典:

    C:/Oracle/admin/eygle/scripts>cat CreateDBCatalog.sql
    connect "SYS"/"&&sysPassword" as SYSDBA
    set echo on
    spool C:/oracle/admin/eygle/scripts/CreateDBCatalog.log
    @C:/oracle/10.2.0/rdbms/admin/catalog.sql;
    @C:/oracle/10.2.0/rdbms/admin/catblock.sql;
    @C:/oracle/10.2.0/rdbms/admin/catproc.sql;
    @C:/oracle/10.2.0/rdbms/admin/catoctk.sql;
    @C:/oracle/10.2.0/rdbms/admin/owminst.plb;
    connect "SYSTEM"/"&&systemPassword"
    @C:/oracle/10.2.0/sqlplus/admin/pupbld.sql;
    connect "SYSTEM"/"&&systemPassword"
    set echo on
    spool C:/oracle/admin/eygle/scripts/sqlPlusHelp.log
    @C:/oracle/10.2.0/sqlplus/admin/help/hlpbld.sql helpus.sql;
    spool off
    spool off

    这个文件依次调用Oracle的字典创建文件等。
    emRepository.sql文件是用于创建EM档案库的:

    C:/Oracle/admin/eygle/scripts>type emRepository.sql
    connect "SYS"/"&&sysPassword" as SYSDBA
    set echo off
    spool C:/oracle/admin/eygle/scripts/emRepository.log
    @C:/oracle/10.2.0/sysman/admin/emdrep/sql/emreposcre C:/oracle/10.2.0 SYSMAN &&sysmanPassword TEMP ON;
    WHENEVER SQLERROR CONTINUE;
    spool off

    最后一个执行的文件是postDBCreation.sql:

    C:/Oracle/admin/eygle/scripts>cat postDBCreation.sql
    connect "SYS"/"&&sysPassword" as SYSDBA
    set echo on
    spool C:/oracle/admin/eygle/scripts/postDBCreation.log
    connect "SYS"/"&&sysPassword" as SYSDBA
    set echo on
    create spfile='C:/oracle/10.2.0/database/spfileeygle.ora'
    FROM pfile='C:/oracle/admin/eygle/scripts/init.ora';
    shutdown immediate;
    connect "SYS"/"&&sysPassword" as SYSDBA
    startup ;
    alter user SYSMAN identified by "&&sysmanPassword" account unlock;
    alter user DBSNMP identified by "&&dbsnmpPassword" account unlock;
    select 'utl_recomp_begin: ' || to_char(sysdate, 'HH:MI:SS') from dual;
    execute utl_recomp.recomp_serial();
    select 'utl_recomp_end: ' || to_char(sysdate, 'HH:MI:SS') from dual;
    host C:/oracle/10.2.0/bin/emca.bat -config dbcontrol db -silent -DB_UNIQUE_NAME eygle
    -PORT 1521 -EM_HOME C:/oracle/10.2.0 -LISTENER LISTENER -SERVICE_NAME eygle
    -SYS_PWD &&sysPassword -SID eygle -ORACLE_HOME C:/oracle/10.2.0
    -DBSNMP_PWD &&dbsnmpPassword -HOST gqgai -LISTENER_OH C:/oracle/10.2.0
    -LOG_FILE C:/oracle/admin/eygle/scripts/emConfig.log -SYSMAN_PWD &&sysmanPassword;
    spool C:/oracle/admin/eygle/scripts/postDBCreation.log
    exit;

    在创建过程中,需要经历以下几个步骤后,数据库的创建才算正式完成:
    (1)Oracle首先通过参数文件创建了spfile文件;
    (2)解锁两个帐号;
    (3)编译;
    (4)配置EM。

     
    原创粉丝点击