1、(c) Copyright 2000 Oracle Corporation. All rights reserved.Connected to an idle instance.SQL startup nomount;ORACLE instance started. ! ps -ef|grep ora_smon_eygleoracle8 11123 11076 0 10:24:15 pts/1 0:00 grep ora_smon_eygleoracle8 11092 1 0 10:02 ? 0:00 ora_smon_eygle 接下来又可以启动另外$ORACLE_HOME下ORACLE_S
2、ID为eygle的实例: Release 9.2.0.4.0 - Production on Fri Feb 16 10:43 2007Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.oracle9 11214 11172 0 10:58 pts/1 0:oracle9 11188 1 0 10:48 ? 现在这同一台主机上就启动了两个相同名称的实例,在操作系统上,Oracle能够通过ID标示将共享内存或信号量区分开来:$ ipcs -iIPC status fromas of Fri Feb 16 10:30
3、:02 CST 2007T ID KEY MODE OWNER GROUPMessage Queues:q 0 0x2e781d5 -rw-r-r- root rootT ID KEY MODE OWNER GROUP ISMATTCHShared Memory:m 4096 0xabdc9b64 -rw-r- oracle8 dba 12m 1025 0x79552064 -rw-r- oracle9 dba 11Semaphores:s 1245184 0x79978bac -ra-r- oracle8 dbas 458753 0xa0e9f594 -ra-r- oracle9 dba 通
4、过Oracle提供的一个小工具sysresv,我们可以找到对应于不同的ORACLE_SID,操作系统上创建的共享内存段ID(Shared Memory)和信号量ID(Semaphores)等信息:$ sysresv -l eygle juliaIPC Resources for ORACLE_SID eygle :ID KEY2560 0x79552064720896 0xa0e9f594Oracle Instance alive for sid julia514 0xab281214196610 0xa7645a54INSTANCE_NAME在数据库内部和ORACLE_SID相关联的概念就是
5、INSTANCE_NAME. Oracle数据库内部存在一个初始化参数INSTANCE_NAME,用于标示数据库实例的名称,其缺省值通常就是ORACLE_SID;但是初始化参数INSTANCE_NAME和ORACLE_SID可以不同,不同实例可以拥有相同的INSTANCE_NAME.在同一个ORACLE_HOME下,只要ORACLE_SID不同,数据库并不校验INSTANCE_NAME参数;通过简单的参数文件复制,我们就可以在同一台服务器上创建多个具有相同instance_name的实例(注意以下测试来自Oracle9i数据库):bash-2.03$ cd $ORACLE_HOME/dbsba
6、sh-2.03$ cp initeygle.ora initjulia.orabash-2.03$ export ORACLE_SID=juliabash-2.03$ sqlplus Total System Global Area 303532408 bytesFixed Size 731512 bytesVariable Size 184549376 bytesDatabase Buffers 117440512 bytesRedo Buffers 811008 bytes 此时同一主机上就可以启动多个实例,ORACLE_SID不同,但是拥有了相同的instance_name: show
7、parameter instance_nameNAME TYPE VALUE- - -instance_name string eygle 但是注意,在数据库内部视图V$INSTANCE中也记录着一个INSTANCE_NAME,这个INSTANCE_NAME来自数据库实例的SID,始终和ORACLE_SID保持一致,这就可能出现数据库中这两个INSTANCE_NAME不一致的情况: select instance_name from v$instance;-julia- - - 所以存在这种歧义是因为在Oracle9i中,当创建数据库进行相关配置时,数据库将INSTANCE_NAME参数写入了
8、参数文件,这就导致了当我们修改参数文件名称变更ORACLE_SID时可能并不修改INSTANCE_NAME参数的情况;值得注意的是,从Oracle10g开始,参数文件中缺省不再记录INSTANCE_NAME,此时INSTANCE_NAME可以动态从系统获得,从而消除了以前可能常见的歧义:D:oracleproductgrep instance_name 9.2.0databaseSPFILEEEYGLE.ORA*.instance_name=eeyglegrep instance_name 10.2.0databaseSPFILEEYGLE.ORAgrep instance_name 11.1
9、.0databaseSPFILEEYGLEE.ORA INSTANCE_NAME除了用来标识实例名称之外,在监听器动态注册时还会用于向监听器注册。比如在一个数据库db_name=julia,instance_name=eygle的数据库中,监听器动态注册会包含如下信息,这里的Instance内容就来自INSTANCE_NAME参数设置:Services Summary.Service has 1 instance(s).Instance , status READY, has 1 handler(s) for this service. V$INSTANCE视图和数据库实例的生命周期相关,用于
10、显示当前实例的状态,通过这个视图可以获得包括实例的启动时间、运行主机等重要信息,通过以下一段SQL可以获得数据库的UPTIME信息: COLUMN STARTED_AT format a25 COLUMN UPTIME format a50 SELECT TO_CHAR (startup_time, DD-MON-YYYY HH24:MI:SS) started_at,2 TRUNC (SYSDATE - (startup_time)3 | day(s), | TRUNC ( 24 * (SYSDATE - startup_time) -4 TRUNC (SYSDATE - startup_t
11、ime)5 | hour(s), | MOD (TRUNC ( 1440 * ( (SYSDATE - startup_time) -6 TRUNC (SYSDATE - startup_time),60)7 | minute(s), | MOD (TRUNC ( 86400 * ( (SYSDATE - startup_time) -8 TRUNC (SYSDATE - startup_time),60)9 | seconds uptime10 FROM v$instance;STARTED_AT UPTIME- -05-JUL-2005 10:36:58 803 day(s), 2 hou
12、r(s), 27 minute(s), 55 secondsDB_NAME相较INSTANCE_NAME参数来说,对于Oracle数据库更为重要的一个参数是DB_NAME.DB_NAME代表了实例即将挂接的数据库名称,关系到具体的物理文件。通常缺省的数据库instance_name和db_name可以设置相同(在RAC环境下,由于多个实例对应一个数据库,所以instance_name和db_name不同)。 在创建数据库的过程中,下图是用于定义数据库名称(db_name)和影响INSTANCE_NAME的SID: Oracle文档中对于db_name的定义如下:DB_NAME用来定义数据库名称
13、,必须是一个不超过8个字符的文本串,在数据库创建过程中,db_name被记录在数据文件,日志文件和控制文件中。如果数据库实例启动过程中参数文件中的db_name和控制文件中的数据库名称不一致,则数据库不能启动。 此外常见的几个结论有: 1. 一个实例可以mount并打开任何数据库,但是同一时间一个实例只能打开一个数据库 2. 一个数据库可以被一个或多个实例所mount并打开(在OPS/RAC环境下,一个数据库可以被多个实例所打开)。 DB_NAME的另外一个作用是在监听器动态注册时作为缺省服务名注册,以下是Oracle10g的动态注册监听示范: 通过下面的测试来看一下DB_NAME与数据库的关
14、系。首先initeygle.ora文件代表了一个数据库实例:oraclejumper oracle$ cd $ORACLE_HOME/dbsoraclejumper dbs$ grep name initeygle.ora*.db_name=eygle 这个实例以及当前数据库的相关参数如下: show parameter db_name- - -db_name string eygle 现在创建另外一个实例,通过复制创建一个pfile文件为名为julia这个新的实例使用:oraclejumper dbs$ cp initeygle.ora initjulia.oraoraclejumper d
15、bs$ ll init*-rw-r-r- 1 oracle dba 982 Jul 25 14:03 initeygle.ora04 initjulia.ora 修改这个文件,更改instance_name参数,设置instance_name = julia,修改后的参数设置如下所示:oraclejumper dbs$ grep name initjulia.orajulia 现在来启动这个实例名称为julia的instance:oraclejumper dbs$ export ORACLE_SID=juliaoraclejumper dbs$ sqlplus startup mount;To
16、tal System Global Area 139531744 bytesFixed Size 452064 bytesVariable Size 121634816 bytesDatabase Buffers 16777216 bytesRedo Buffers 667648 bytesORA-01102: cannot mount database in EXCLUSIVE mode 注意,当试图加载数据库时出现错误,因为当前数据库被另外一个实例(instance)加载。在非并行模式(Ops/RAC)下,一个数据库同时只能被一个实例加载。 此时已经启动了两个数据库实例,从后台进程可以看出
17、:oraclejumper dbs$ ps -ef|grep dbworacle 27323 1 0 Jul14 ? 00:00:00 ora_dbw0_eygleoracle 15447 1 0 14:04 ?00 ora_dbw0_juliaoracle 25030 25000 0 18:38 pts/2 00:00 grep dbw 关闭eygle这个数据库实例:oraclejumper dbs$ export ORACLE_SID=eygle shutdown immediate; 然后就可以通过实例julia加载并打开db_name=eygle的数据库了,这也就是前面所说的,一个数据
18、库可以被任何一个实例挂接打开(当然是有条件限制的): alter database mount;alter database mount*ERROR at line 1:ORA-01990: error opening password file /opt/oracle/product/9.2.0/dbs/orapwORA-27037: unable to obtain file statusLinux Error: 2: No such file or directoryAdditional information: 3 alter database open;Database altere
19、d. 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.dbfinstance_name string julia 进一步的,再来研究一下如果参数文件中的db_name和控制文件中的db_name不一致会出现什么错误。 修改参数文件中的db_name参数: 在nomount环节不存在任何
20、问题,而在mount阶段,数据库会对参数文件和控制文件进行比较,如果两者记录的db_name不一致,则数据库无法启动,错误提示指定的数据库名称和控制文件中记录的名称不符:ORA-01103: database name EYGLE in controlfile is not JULIASERVER NAMEService Name:服务名,如果数据库有域名则等同于Global DB Name、没有的话则等同于数据库名,这是因为数据库启动后会自动把数据库名注册到监听成为服务名,同时数据库参数service_names也会注册为服务名,所以一个数据库可以有多个服务名。当在Oracle客户端连接服务器的时候,主机字符串应该使用服务名。TNSNAME网络服务名,也有人叫TNS别名、网络连接串(connect string),在tnsnames.ora中配置的名称,如下面例子的DBTNS。sqlplus sys/sysorcl as sysdba(这种连法会根据tnsnames.ora中配置的网络服务名连接到本机或者远程的oracle,走的是网络通信)看看数据库参数设置: NAME
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1