Oracle Database与Oracle Instance

来源:百度文库 编辑:神马文学网 时间:2024/06/12 16:13:21
变量ORACLE_SID到底是什么,它跟instance有什么区别?
该问题有深度。
SID主要用于区分同一台计算机上的同一个数据库的不同实例。
oarcle数据库服务器主要有两部分组成:物理数据库和数据库管理系统
数据库管理系统是用户和物理数据库之间的一个中间层,是软件层。这个软件层具有一定的结构,这个结构又被称为例程结构。
在启动数据库时,oracle首先要在内存中获取、划分、保留各种用途的区域,运行各种用途的后台进程,即创建一个例程(instance),然后由该例程装载、打开数据库,最后由这个例程来访问和控制数据库的各种物理结构。
在启动数据库并使用数据库的时候,实际上是连接到该数据库的例程,通过例程来连接、使用数据库。所以例程是用户和数据库之间的一个中间层。
例程是由操作系统的内存结构和一系列进程所组成的,可以启动和关闭。
一台计算机上可以创建多个oracle数据库,当同时要使用这些数据库时,就要创建多个例程。为了不使这些例程相互混淆,每个例程都要用称为SID的符号来区分,即创建这些数据库时填写的数据库SID。
一个server可以安装多个database,每个database对应一个instance.
database与instance是一对一的关系.
database是物理文件的集合,而instance是内存区的集合.
在RAC环境下,一个database对应多个instance.一个instance只能对应一个database.
1.2.5 INSTANCE_NAME的含义及作用
作为Oracle数据库的重要组成部分INSTANCE也存在一个参数标示:INSTANCE_NAME。
INSTANCE_NAME是Oracle数据库的一个参数,在参数文件中定义,用于标示数据库实例的名称,其缺省值通常就是ORACLE_SID,但是不同的实例可以有相同的实例名。通过简单的参数文件复制,我们就可以在同一台服务器上创建多个具有相同instance_name的实例。
首先确认当前的参数文件:
bash-2.03$ cd $ORACLE_HOME/dbs
bash-2.03$ ls initeygle.ora
initeygle.ora
复制参数文件,更改名称:
bash-2.03$ cp initeygle.ora initjulia.ora
接下来通过导入新的ORACLE_SID我们就可以启动新的实例:
bash-2.03$ export ORACLE_SID=julia
bash-2.03$ sqlplus "/ as sysdba"
SQL*Plus: Release 9.2.0.4.0 - Production on Fri Feb 16 10:34:00 2007
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to an idle instance.
SQL> startup nomount;
ORACLE instance started.
Total System Global Area 303532408 bytes
Fixed Size 731512 bytes
Variable Size 184549376 bytes
Database Buffers 117440512 bytes
Redo Buffers 811008 bytes
现在ORACLE_SID为julia的实例已经启动,操作系统上的进程以julia名称标记:
bash-2.03$ ps -ef|grep pmon
oracle 12396 1 0 16:30 ? 00:00:00 ora_pmon_julia
oracle 16201 1 0 18:13 ? 00:00:00 ora_pmon_eygle
oracle 16256 16219 0 18:14 pts/1 00:00:00 grep pmon
但是新实例的instance_name仍然是eygle:
SQL> show parameter instance_name
NAME TYPE VALUE
------------------------------------ ---------------------- -----------------------
instance_name string eygle
总结一下,ORACLE_SID在这里用于标示进程,而instance_name则用来标示实例,两者可以具有不同的名称。
此外Oracle的监听器(listener)配置文件中的SID_NAME就是来自instance_name参数,监听器通过instance_name才能确定需要将连接请求注册到哪一个实例上。通常listener.ora文件中SID_NAME相关设置类似如下示例:
SID_LIST_LISTENER =
(SID_DESC =
(GLOBAL_DBNAME = eygle)
(ORACLE_HOME = /opt/oracle/product/9.2.0)
(SID_NAME = eygle)
)
一般来说,Oracle Database与Oracle Instance一一对应,一个Oracle Database对应一个Oracle Instance。
但在Oracle的并行环境(OPS , RAC)中,一个Oracle Database可对应多个Oracle Instance。
我们通常所说的一个可以访问的数据库实际上有三部分组成:
1.Oracle Software:一般存在本机上。由oracle的程序构成。
2.Oracle Instance:启动数据库后存在,关闭数据库后消失。是oracle使用的结构与后台进程的集合。
3.Oracle Database:存在本机硬盘上,或设备上。由oracle数据文件构成。
在实际的开发应用中,关于Oracle数据库,经常听见有人说建立一个数据库,建立一个Instance,启动一个Instance之类的话。 其实问他们什么是数据库,什么是Instance,很可能他们给的答案就是数据库就是Instance,Instance就是数据库啊,没有什么区别。在这里,只能说虽然他们Oracle用了可能有了一定的经验,不过基础的概念还是不太清楚。
什么是数据库,其实很简单,数据库就是存储数据的一种媒介。比如常用的文件就是一种,在Oracle10G中,数据的存储有好几种。第一种是文件形式,也就是在你的磁盘中创建一批文件,然后在这些文件中存储信息。第二种就是磁盘阵列形式,这个是什么意思呢,这个就是说明数据库不是存放为某个文件,而是把一个或者多个磁盘格式化成Oracle的一种格式了,等于整个磁盘就是存放Oracle数据库的,不能作为别的用途。这样的优点是存储性能高,因为不再借助别的文件格式了,而是把整个磁盘都成为Oracle最适应的文件系统格式。当然还可能有别的形式,比如网络什么的。不过我们最常用的还是文件格式的,在文件格式中,数据库指的就是那些数据文件,控制文件以及REDO文件等等一系列文件。
而什么是Instance呢,Instance其实就是指的操作系统中一系列的进程以及为这些进程所分配的内存块。在Oracle中,我们可以新建一个Oracle的Instance,这个时候虽然有了进程还有SGA等一系列的内存快,但是这个时候并没有把数据库文件读取进来。所以只是一个实例,在后来,你可以通过命令手动或者自动地把数据库文件加载进我们的数据库Instance中,这个时候的数据库才可以让我们真正的开始访问操作。
所以说,数据库的应用如果想实现,数据库和数据库Instance是缺一不可的,如果只有数据库的那些文件,那么,只能代表数据在这个文件中,但是我们无法直接进行操作。而如果只有数据库Instance,那么我们虽然可以急性操作,但是也不知道操作哪些数据,操作生成的数据也无法保存等等。所以,当一个Oracle Instance真正Load了一个Oracle Database了以后,数据库才可以被我们使用。
在这里要注意一点的是,Oracle的实例在启动以后,只能load一次数据库,如果想把数据库与Instance断开,然后再重新挂在(一个数据库Instance,那么就需要你首先把数据库Instance进程结束,然后重新建立这个instanc的一个进程,再load另外一个数据库。否则肯定要抛除ORA-16169错误,说数据库已经被打开。因为一个数据库Instance在其生存期中最多只能load和打开一个instance。