互联网、电子商务、IT服务(系统、数据、维护)、计算机硬件、计算机软件
在实际的开发应用中,关于Oracle数据库,经常听见有人说建立一个数据库,建立一个Instance,启动一个Instance之类的话。
其实问他们什么是数据库,什么是Instance,很可能他们给的答案就是数据库就是Instance,Instance就是数据库啊,没有什么区别。
在这里,只能说虽然他们Oracle用了可能有了一定的经验,不过基础的概念还是不太清楚。
一、什么是数据库,其实很简单,数据库就是存储数据的一种媒介。比如常用的文件就是一种,在Oracle10G中,数据的存储有好几种。
第一种是文件形式,也就是在你的磁盘中创建一批文件,然后在这些文件中存储信息。
第二种就是磁盘阵列形式,这个是什么意思呢,这个就是说明数据库不是存放为某个文件,而是把一个或者多个磁盘格式化成Oracle的一种格式了,
等于整个磁盘就是存放Oracle数据库的,不能作为别的用途。这样的优点是存储性能高,因为不再借助别的文件格式了,而是把整个磁盘都成为
Oracle最适应的文件系统格式。
当然还可能有别的形式,比如网络什么的。不过我们最常用的还是文件格式的,在文件格式中,数据库指的就是那些数据文件,
控制文件以及REDO文件等等一系列文件。
二、什么是Instance,其实就是指的操作系统中一系列的进程以及为这些进程所分配的内存块。在Oracle中,我们可以新建一个Oracle的Instance,
这个时候虽然有了进程还有SGA等一系列的内存快,但是这个时候并没有把数据库文件读取进来。所以只是一个实例,在后来,你可以通过命令手动
或者自动地把数据库文件加载进我们的数据库Instance中,这个时候的数据库才可以让我们真正的开始访问操作。所以说,数据库的应用如果想实现,
数据库和数据库Instance是缺一不可的,如果只有数据库的那些文件,那么,只能代表数据在这个文件中,但是我们无法直接进行操作。
而如果只有数据库Instance,那么我们虽然可以进行操作,但是也不知道操作哪些数据,操作生成的数据也无法保存等等。所以,当一个Oracle Instance
真正Load了一个Oracle Database了以后,数据库才可以被我们使用。
在这里要注意一点的是,Oracle的实例在启动以后,只能load一次数据库,如果想把数据库与Instance断开,然后再重新挂在一个数据库Instance,
那么你首先把数据库Instance进程结束,然后重新建立这个instance的一个进程,再load另外一个数据库。否则肯定要抛除ORA-16169错误,
说数据库已经被打开。因为一个数据库Instance在其生存期中最多只能load和打开一个instance.
刚接触ORACLE的人肯定会对实例和数据库感到困惑,实例到底代表些什么?为什么会有这个概念的出现?
ORACLE实例 = 进程 + 进程所使用的内存(SGA)
实例是一个临时性的东西,你也可以认为它代表了数据库某一时刻的状态!
数据库 = 重做文件 + 控制文件 + 数据文件 + 临时文件
数据库是永久的,是一个文件的集合。
三、ORACLE实例和数据库之间的关系
1. 临时性和永久性
2. 实例可以在没有数据文件的情况下单独启动 startup nomount , 通常没什么意义
3. 一个实例在其生存期内只能装载(alter database mount)和打开(alter database open)一个数据库
4. 一个数据库可被许多实例同时装载和打开(即RAC),RAC环境中实例的作用能够得到充分的体现!
四、下面对实例和数据库做详细的诠释:
在Oracle领域中有两个词很容易混淆,这就是“实例”(instance)和“数据库”(database)。作为Oracle术语,这两个词的定义如下:
数据库(database):物理操作系统文件或磁盘(disk)的集合。使用Oracle 10g的自动存储管理(Automatic Storage Management,ASM)或RAW分区时,
数据库可能不作为操作系统中单独的文件,但定义仍然不变。
实例(instance):一组Oracle后台进程/线程以及一个共享内存区,这些内存由同一个计算机上运行的线程/进程所共享。这里可以维护易失的、非持久性内容
(有些可以刷新输出到磁盘)。就算没有磁盘存储,数据库实例也能存在。也许实例不能算是世界上最有用的事物,不过你完全可以把它想成
是最有用的事物,这有助于对实例和数据库划清界线。
这两个词有时可互换使用,不过二者的概念完全不同。
实例就是一组操作系统进程(或者是一个多线程的进程)以及一些内存。这些进程可以操作数据库;
数据库只是一个文件集合(包括数据文件、临时文件、重做日志文件和控制文件)。在任何时刻,一个实例只能有一组相关的文件(与一个数据库关联)。
大多数情况下,反过来也成立:一个数据库上只有一个实例对其进行操作。不过,Oracle的真正应用集群(Real Application Clusters,RAC)是一个例外,
这是Oracle提供的一个选项,允许在集群环境中的多台计算机上操作,这样就可以有多台实例同时装载并打开一个数据库(位于一组共享物理磁盘上)。
由此,我们可以同时从多台不同的计算机访问这个数据库。Oracle RAC能支持高度可用的系统,可用于构建可扩缩性极好的解决方案。
实例 就是治理相关库的内存结构的名字(由SGA、PGA、服务器进程、用户进程、后台进程等组成)
数据库 就是实际的磁盘上的文件(数据文件、日志文件、控制文件等),负责保存数据,但由对应的实例来操作它的数据
服务名 就是对外公布的名称,为网络监听服务
其实,在我们传统的概念里,数据库是一个统称的名字,在Oracle中,你可以把“数据库”理解成一个大概念,也要把它理解成一个小概念
1、一个Oracle数据库系统中可以同时安装几个数据库,每一个数据库对应一个唯一的实例,但是OPS系统除外,可以多个实例同时对一个数据库操作,称为并行服务器
2、只是一个名字,SID即是INSTANCE_NAME,SERVICE_NAMES主要用在监听器中,为了方便吧,有些是为了传统习惯的延续,有些是为了更方便的使用
3、NET EASY CONFIG操纵的应该是主机字符串,是为客户端服务的,
一个数据库可以对外公布多个服务名(SERVICE_NAMES)
一个客户端也可以用多个主机字符串连接到同一个数据库服务器上
4、一个OS上可以装多个Oracle数据库(小的概念),每个库可以对外公布多个服务名,都通过init.ora和listener.ora来实现
主机字符串,数据库服务名,数据库别名,不太一样。
service_names是对外的服务名,是服务器端使用的,一个库可以设置多个对外服务名,以实现不同的目的
“主机字符串”的叫法主要在SQL*Plus中使用,是在客户端使用,
“数据库别名”主要用在一些开发工具连接Oracle服务器时使用,是通俗叫法
还有像配置ODBC时的Data Source的Service Name,
它们都是一个道理,指向的都是客户端tnsnames.ora文件中的一小段文本
1、在SQL/PLUS中的登陆中,用USER/PWD@***,那么,这个***是主机字符串。
2、在设置ODBC时的用户和密码一定要是ORACLE中的合法用户和密码,但不输也行,引用ODBC名时再给出也可以。
3、若要向ORACLE代理商购买ORACLE,是以用户数来算钱的。那么,这个“用户”跟我们在ORACLE中通过
CREATE USER USERNAME IDENTIFIED BY PASSWORD创建的用户是不同概念,“用户数”指的是并发访问用户数,
sid用于实例区分各个数据库,service name用于外部链接。
对于初接触Oracle 数据库的人来讲,很容易混淆的两个概念即是Oracle 实例和Oracle 数据库。这两
概念不同于SQL sever下的实例与数据库,当然也有些相似之处。只是在SQL server我们根本不需要花费太
多的精力去搞清SQL实例和数据库,因为它简单易于理解。下面简要说明一下SQL实例、数据库,更多的是讲
述Oracle下的实例及数据库。