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

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

作者: eygle |<script type="text/javascript" src="http://www.eygle.com/English.js"></script> English Version 【转载时请以超链接形式标明文章 和作者信息及 本声明
链接:

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文件与数据库创建

在CREATE DATABASE的过程中,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 AUTOEXTEND ON NEXT 1280K MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT 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。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值