eygle.com   eygle.com
eygle.com eygle
eygle.com  
 

« 《循序渐进Oracle》第一章连载-之五 | Blog首页 | 一则杭州DBA招聘需求 »

《循序渐进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文件与数据库创建

在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。


历史上的今天...
    >> 2009-08-04文章:
           20090804 - 简报这一天
    >> 2008-08-04文章:
           墨墨恢复健康 - 病好了

无觅

By eygle on 2007-08-04 15:14 | Comments (5) | Books | 1533 |

5 Comments

我是初学者,请问你贴的代码都是在windows下运行的吗?如下:
[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.


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

to harv;
你要从头看起阿,我的这一章很多范例都是Windows上的没错。

你挑出的这一段是Linux下的。

呵呵,问了个弱智的问题:),我没有用过Linux,见笑了!

GetParDescrb.sql
完整脚本是什么?

set linesize 120
col name for a30
col value for a20
col describ for a60
SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ
FROM SYS.x$ksppi x, SYS.x$ksppcv y
WHERE x.inst_id = USERENV ('Instance')
AND y.inst_id = USERENV ('Instance')
AND x.indx = y.indx
AND x.ksppinm LIKE '%&par%'
/


CopyRight © 2004~2020 云和恩墨,成就未来!, All rights reserved.
数据恢复·紧急救援·性能优化 云和恩墨 24x7 热线电话:400-600-8755 业务咨询:010-59007017-7040 or 7037 业务合作: marketing@enmotech.com