ORACLE实例与数据库的区别

系统 1274 0
刚接触ORACLE的人肯定会对实例和数据库感到困惑,实例到底代表些什么?为什么会有这个概念的出现?
ORACLE实例 = 进程 + 进程所使用的内存(SGA)
实例是一个临时性的东西,你也可以认为它代表了数据库某一时刻的状态!
数据库 = 重做文件 + 控制文件 + 数据文件 + 临时文件
数据库是永久的,是一个文件的集合。
ORACLE实例和数据库之间的关系
1.
临时性和永久性
2.
实例可以在没有数据文件的情况下单独启动 startup nomount , 通常没什么意义
3.
一个实例在其生存期内只能装载(alter database mount)和打开(alter database open)一个数据库
4.
一个数据库可被许多实例同时装载和打开(即RAC),RAC环境中实例的作用能够得到充分的体现!

下面对实例和数据库做详细的诠释:
Oracle 领域中有两个词很容易混淆,这就是“实例”( instance )和“数据库”( database )。作为 Oracle 术语,这两个词的定义如下:
q
数据库 database ):物理操作系统文件或 磁盘 disk )的集合。使用 Oracle 10 g 的自动存储管理( Automatic Storage Management ASM )或 RAW 分区时,数据库可能不作为操作系统中单独的文件,但定义仍然不变。
q
实例 instance ):一组 Oracle 后台进程 / 线程以及一个共享内存区,这些内存由同一个计算机上运行的线程 / 进程所共享。这里可以维护易失的、非持久性内容(有些可以刷新输出到磁盘)。就算没有磁盘存储,数据库实例也能存在。也许实例不能算是世界上最有用的事物,不过你完全可以把它想成是最有用的事物,这有助于对 实例 数据库 划清界线。
这两个词有时可互换使用,不过二者的概念完全不同。实例和数据库之间的关系是:数据库可以由多个实例 装载 打开 ,而实例可以在任何时间点 装载 打开 一个数据库。实际上,准确地讲,实例在其整个生存期中最多能装载和打开一个数据库!稍后就会介绍这样的一个例子。
是不是更糊涂了?我们还会做进一步的解释,应该能帮助你搞清楚这些概念。实例就是一组操作系统进程(或者是一个多线程的进程)以及一些内存。这些进程可以操作数据库;而数据库只是一个文件集合(包括数据文件、临时文件、重做日志文件和控制文件)。在任何时刻,一个实例只能有一组相关的文件(与一个 数据库 关联)。大多数情况下,反过来也成立:一个数据库上只有一个实例对其进行操作。不过, Oracle 真正应用集群 Real Application Clusters RAC )是一个例外,这是 Oracle 提供的一个选项,允许在集群环境中的多台计算机上操作,这样就可以有多台实例同时装载并打开一个数据库(位于一组共享物理磁盘上)。由此,我们可以同时从多台不同的计算机访问这个数据库。 Oracle RAC 能支持高度可用的系统,可用于构建可扩缩性极好的解决方案。
下面来看一个简单的例子。假设我们刚安装了 Oracle 10 g 10.1.0.3 。我们执行一个纯软件安装,不包括初始的“启动”数据库,除了软件以外什么都没有。
通过 pwd 命令可以知道当前的工作目录(这个例子使用一个 Linux 平台的计算机)。我们的当前目录是 dbs (如果在 Windows 平台上,则是 database 目录)。执行 ls l 命令显示出这个目录为“空”。其中没有 init.ora  文件,也没有任何 存储参数文件 stored parameter file SPFILE );存储参数文件将在第 3 章详细讨论。

使用 ps (进程 态)命令,可以看到用户 ora10g 运行的所有进程,这里假设 ora10g Oracle 软件的所有者。此时还没有任何 Oracle 数据库进程。

然后使用 ipcs 命令,这个 UNIX 命令可用于显示进程间的通信设备,如共享内存、信号量 等。目前系统中没有使用任何通信设备。

然后启动 SQL*Plus Oracle 的命令行界面),并作为 SYSDBA 连接( SYSDBA 账户可以在数据库中做任何事情)。连接成功后, SQL*Plus 报告称我们连上了一个空闲的实例:

我们的“实例”现在只包括一个 Oracle 服务器进程,见以下输出中粗体显示的部分。此时还没有分配共享内存,也没有其他进程。


现在来启动实例:

这里提示的文件就是启动实例时必须要有的一个文件,我们需要有一个参数文件(一种简单的平面文件,后面 会详细说明),或者要有一个存储参数文件 。现在就来创建参数文件,并放入启动数据库实例所需的最少信息(通常还会指定更多的参数,如数据库块大小、控制文件位置,等等)。

然后再回到 SQL*Plus

这里对 startup 命令加了 nomount 选项,因为我们现在还不想真正“装载”数据库(要了解启动和关闭的所有选项,请参见 SQL*Plus 文档)。
注意
Windows 上运行 startup 命令之前 还需要使用 oradim.exe 实用程序执行一条服务创建语句。

现在就有了所谓的“实例”。运行数据库所需的后台进程都有了,如进程监视器( process monitor PMON )、日志写入器( log writer LGWR )等,这些进程将在第 5 章详细介绍。

再使用 ipcs 命令,它会首次报告指出使用了共享内存和信号量,这是 UNIX 上的两个重要的进程间通信设备:

注意,我们还没有“数据库”呢!此时,只有数据库之名(在所创建的参数文件中),而没有数据库之实。如果试图“装载”这个数据库,就会失败,因为数据库根本就不存在。下面就来创建数据库。有人说创建一个 Oracle 数据库步骤很繁琐,真是这样吗?我们来看看:

这里创建数据库就是这么简单。但在实际中,也许要使用一个稍有些复杂的 CREATE DATABASE 命令,因为可能需要告诉 Oracle 把日志文件、数据文件、控制文件等放在哪里。不过,我们现在已经有了一个完全可操作的数据库了。可能还需要运行 $ORACLE_HOME/rdbms/admin/ catalog.sql 脚本和其他编录脚本( catalog script )来建立我们每天使用的数据字典(这个数据库中还没有我们使用的某些视图,如 ALL_OBJECTS ),但不管怎么说,数据库已经有了。可以简单地查询一些 Oracle V$ 视图(具体就是 V$DATAFILE V$LOGFILE V$CONTROLFILE ),列出构成这个数据库的文件:

Oracle 使用默认设置,把所有内容都放在一起,并把数据库创建为一组持久的文件。如果关闭这个数据库,再试图打开,就会发现数据库无法打开:


一个实例在其生存期中最多只能装载和打开一个数据库。要想再打开这个(或其他)数据库,必须先丢弃这个实例,并创建一个新的实例。
重申一遍:
q
实例 是一组后台进程和共享内存。
q
数据库 是磁盘上存储的数据集合。
q
实例“一生”只能装载并打开一个数据库。
q
数据库可以由一个或多个实例(使用 RAC )装载和打开。
前面提到过,大多数情况下,实例和数据库之间存在一种一对一的关系。可能正因如此,才导致人们很容易将二者混淆。从大多数人的经验看来,数据库就是实例,实例就是数据库。
不过,在许多测试环境中,情况并非如此。在我的磁盘上,可以有 5 个不同的数据库。测试主机上任意时间点只会运行一个 Oracle 实例,但是它访问的数据库每天都可能不同(甚至每小时都不同),这取决于我的需求。只需有不同的配置文件,我就能装载并打开其中任意一个数据库。在这种情况下,任何时刻我都只有一个“实例”,但有多个数据库,在任意时间点上只能访问其中的一个数据库。
所以,你现在应该知道,如果有人谈到实例,他指的就是 Oracle 的进程和内存。提到数据库时,则是说保存数据的物理文件。可以从多个实例访问一个数据库,但是一个实例一次只能访问一个数据库。

ORACLE实例与数据库的区别


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论