目录

oracle-10g中的几个概念表空间,数据库名,实例名

oracle 10g中的几个概念(表空间,数据库名,实例名)

2012-09-22 18:06:38

分类: Oracle

oracle 10g中的几个概念(表空间,数据库名,实例名

解释数据库、表空间、数据文件、表、数据的最好办法就是想象一个装满东西的柜子。数据库其实就是柜子,柜中的抽屉是表空间,抽屉中的文件夹是数据文件,文件夹中的纸是表,写在纸上的信息就是数据。

表空间的设计理念:

1.Oracle表空间之基本概念

ORACLE数据库被划分成称作为表空间的逻辑区域——形成ORACLE数据库的逻辑结构。一个ORACLE数据库能够有一个或多个Oracle,而一个表空间则对应着一个或多个物理的数据库文件。表空间是ORACLE数据库恢复的最小单位,容纳着许多数据库实体,如表、视图、索引、聚簇、回退段和临时段等。

每个ORACLE数据库均有SYSTEM表空间,这是数据库创建时自动创建的。SYSTEM表空间必须总要保持联机,因为其包含着数据库运行所要求的基本信息(关于整个数据库的数据字典、联机求助机制、所有回退段、临时段和自举段、所有的用户数据库实体、其它ORACLE软件产品要求的表)。

一个小型应用的ORACLE数据库通常仅包括SYSTEM表空间,然而一个稍大型应用的ORACLE数据库采用多个表空间会对数据库的使用带来更大的方便。

2.Oracle表空间之作用

表空间的作用能帮助DBA用户完成以下工作:

1.决定数据库实体的空间分配;

2.设置数据库用户的空间份额;

3.控制数据库部分数据的可用性;

4.分布数据于不同的设备之间以改善性能;

5.备份和恢复数据。

用户创建其数据库实体时其必须于给定的表空间中具有相应的权力,所以对一个用户来

说,其要操纵一个ORACLE数据库中的数据,应该:

1.被授予关于一个或多个表空间中的RESOURCE特权;

2.被指定缺省表空间;

3.被分配指定表空间的存储空间使用份额;

4.被指定缺省临时段表空间。

一、数据库名

1.数据库名的概念

数据库名(db_name)就是一个数据库的标识,就像人的身份证号一样。如果一台机器上装了多全数据库,那么每一个数据库都有一个数据库名。在数据库安装或创建完成之后,参数DB_NAME被写入参数文件之中。

数据库名在$ORACLE_HOME/admin/db_name/pfile/init.ora文件中

###########################################

Database Identification

###########################################

db_domain=""

db_name=orcl

在创建数据库时就应考虑好数据库名,并且在创建完数据库之后,数据库名不宜修改,即使要修改也会很麻烦。因为,数据库名还被写入控制文件中,控制文件是以 二进制型式存储的,用户无法修改控制文件的内容。假设用户修改了参数文件中的数据库名,即修改DB_NAME的值。但是在Oracle启动时,由于参数文 件中的DB_NAME与控制文件中的数据库名不一致,导致数据库启动失败,将返回ORA-01103错误。

2.数据库名的作用

数据库名是在安装数据库、创建新的数据库、创建数据库控制文件、修改数据结构、备份与恢复数据库时都需要使用到的。

有很多Oracle安装文件目录是与数据库名相关的,如:

winnt: F:oracleproduct10.2.0oradataDB_NAME…

又如参数文件pfile:

winnt: F:oracleproduct10.2.0adminDB_NAMEpfileinit.ora.54200885729

如果控制文件损坏或丢失,数据库将不能加载,这时要重新创建控制文件,方法是以nomount方式启动实例,然后以create controlfile命令创建控制文件,当然这个命令中也要指明DB_NAME。

3.修改数据库名

建议:应在创建数据库时就确定好数据库名,数据库名不应作修改,因为修改数据库名是一件比较复杂的事情。

现在就来说明一下,如何在已创建数据之后,修改数据库名。步骤如下:

(1)关闭数据库。

(2)修改数据库参数文件中的DB_NAME参数的值为新的数据库名。

(3)以NOMOUNT方式启动实例,修建控制文件(有关创建控制文件的命令语法,请参考oracle文档)

4.查询当前数据库名

方法一: select name from v$database;

方法二:show parameter db

方法三:查看参数文件

二、数据库实例名

1.数据库实例名的概念(instance_name)

先来解释以下,实例是什么东西。实例是访问Oracle数据库所需的一部分计算机内存和辅助处理后台进程,是由进程和这些进程所使用的内存(SGA)所构成一个集合,它根本不需要一个与其相关联的数据库,没有任何数据文件也可以启动实例。下面是Oralce的启动过程:

sqlplus / as sysdba

sql>startup nomount #启动了一个实例,现在SGA分配了,进程在运行,除数据库所有的东西都启动了

sql>alter database mount#利用控制文件(init.ora文件中指定)定位重作文件、数据文件、临时文件

sql>alter database open#数据库可供任何人通过这个实例访问。

所以可以这么理解:大家访问Oracle都是访问一个实例,但这个实例如果关联了数据库文件,就是可以访问的,如果没有,就会得到实例不可用的错误。

实例名指的是用于响应某个数据库操作的数据库管理系统的名称。她同时也叫SID。实例名是由参数instance_name决定的。如果这个参数不被指定(即instance_name没有被指定为任何值),那么实例的名字由该用户的环境变量ORACLE_SID(注意这里是大写)决定。在windows平台下,则是注册表中oracle_sid值决定。

实例名和SID是一一对应的,名字相同,但在存储位置不同。

2.实例和数据库

实例和数据库之间的区别如下:

(1)实例是临时的,它只在相关的进程和内存集合存在时存在;数据库是永久的,只要文件存在它就存在

(2)一个实例在其生存期内可安装和打开单个数据库;数据库可以被很多实例安装和打开,或者一个接一个的实例安装和打开,或者由多个实例同时安装和打开(RAC)

顺便提一下RAC,简单来说RAC就是多个实例同时打开一个数据库文件的系统,在结构上是多台机器,每天机器运行一个实例,每个实例都打开同一个数据库 (这个是用磁盘共享技术实现的),这些实例之间需要同步高速缓存,这样保证多个实例是完全一致的,不会相互冲突乃至覆盖。

数据库实例名(instance_name)用于对外部连接。在操作系统中要取得与数据库的联系,必须使用数据库实例名。例如,要去连接一个数据库服务器,就必须知道其数据库实例名,只知道数据库名是没有用的。与数据库名不同,在数据安装或创建数据库之后,实例名可以被修改。数 据库名和实例名可以相同也可以不同。在一般情况下,数据库名和实例名是一对一的关系,但如果在oracle并行服务器架构(即oracle实时应用集群) 中,数据库名和实例名是一对多的关系(一个数据库对应多个实例,同一时间内用户只一个实例相联系,当某一实例出现故障,其它实例自动服务,以保证数据库安 全运行) 。

3.查询当前数据库实例名

方法一:select instance_name from v$instance;

方法二:show parameter instance

三、ORACLE_SID

在实际中,对于数据库实例的标识有时使用实例名,有时使用ORACLE_SID,它们有什么区别呢?

(ORACLE_SID)

OS<—————-> ORACLE 数据库 <——–(instance_name(实例名))

上图表示实例名instance_name、ORACLE_SID与数据库及操作系统之间的关系,虽然这里列出的两个参数都是数据库实例名,但 instance_name参数是ORACLE数据库的参数,此参数可以在参数文件中查询到;而ORACLE_SID参数则是操作系统环境变量,与 ORACLE_BASE、ORACLE_HOME等用法相同,用于和操作系统交互。也就是说,在操作系统中要想得到实例名,就必须使用ORACLE_SID。且ORACLE_SID必须与instance_name的值一致,否则,你将会收到一个错误,在winnt平台,是“TNS:协议适配器错误”。

四、数据库域名与全局数据库名

1.概念与联系

使用数据库名(da_name)对一个数据库进行唯一标识,这种表示对于单个数据库是足够的,但是随着由多个数据库构成的分布式数据库的普及,这种命令数 据库的方法给数据库的管理造成一定的负担,因为各个数据库的名字可能一样,造成管理上的混乱。为了解决这种情况,引入了db_domain参数,这样在数 据库的标识是由db_name和db_domain两个参数共同决定的,避免了因为数据库重名而造成管理上的混乱。这类似于互连网上的机器名的管理。我们 将db_name和db_domain两个参数用‘.’连接起来,表示一个数据库,并将该数据库的名称称为global_name,即它扩展了 db_name。db_name参数只能由字母、数字、’_’、’#’、’$’组成,而且最多8个字符。

数据库域名(db_domain):定义一个数据库所在的域,该域的命名同互联网的’域’没有任何关系,只是数据库管理员为了更好的管理分布式数据库而根据实际情况决定的。当然为了管理方便,可以将其等于互联网的域。

全局数据库名(global_name):对一个数据库(Oracle database)的唯一标识,oracle建议用此种方法标识数据库。该值是在创建数据库时决定的,缺省值为db_name. db_domain。在以后对参数文件中db_name与db_domain参数的任何修改不影响global_name的值,如果要修改 Global_name,只能用alter database rename global_name to 命令进行修改,然后修改相应参数。

2.查询数据库域名

方法一:select value from v$parameter where name = ‘db_domain’;

方法二:show parameter domain

方法三:在参数文件中查询

3.例子

全国交通GIS系统的分布式数据库,其中:

吉林节点: jl.jtgis

吉林长春节点: cc.jl.jtgis

河北节点: hb.jtgis

河北石家庄节点:sjz.hb.jtgis

这些就是数据库域名,数据库域名在存在于参数文件中,她的参数是db_domain.

全局数据库名=数据库名+数据库域名,如前述福建节点的全局数据库名是:orcl.jl.jtgis

五、数据库服务名

该参数是oracle8i新引进的。在8i以前,我们用SID来表示数据库的一个实例,但是在Oracle的并行环境中,一个数据库对应多个实例,这样就需要多网络服务名,设置繁琐。为了方便并行环境中的设置,引进了service_name参数。该参数对应一个数据库,而不是一个实例,而且该参数有许多其它的好处。

该参数的缺省值为db_name.db_domain,即等于global_name.如果数据库有域名,则数据库服务名就是全局数据库名;否则,数据库 服务名与数据库名相同。一个数据库可以对应多个service_name,以便实现更灵活的配置。该参数与SID没有直接关系,即 service_name 不必与SID一样。

从Oracle8i开始的oracle网络组件,数据库与客户端连接的主机字符串使用的是数据库服务名。之前用的是SID,即数据库实例名。

查询数据库服务名

方法一:select value from v$parameter where name = ‘service_name’;

方法二:show parameter service_name

六、网络服务名

网络服务名(net_service_name),又可以称为数据库别名(database alias)。是客户端程序访问数据库时所需要,屏蔽了客户端如何连接到服务器端的细节,实现了数据库的位置透明的特性。网络服务名被记录在 tnsnames.ora文件中。

可以通过netmgr来新建网络服务名。

网络服务名是从客户端的角度出发,当客户端连接远程数据库或其他服务时,可以指定网络服务名。因此需要使用一个或多个命名方法将此Net服务名解析为连接数据库或其他服务的连接描述符,看下面:

[本地]——将存储在本地客户机的tnsnames.ora文件中的网络服务名解析为连接描述符。

[Oracle Names]——由Oracle名字服务器提供为网络上的每个Oracle Net服务提供解析方法

[主机名]——通过TCP/IP环境中的主机别名连接到Oracle数据库服务

Sun NIS/DCE CDS——专用系统用的,在Windows 2000系统环境下不适用

===============================================================================================

2012-02-23 12:02

54人阅读

(0)

刚接触ORACLE的人肯定会对实例和 感到困惑,实例到底代表些什么?|

为什么会有这个概念的出现?

ORACLE实例 = 进程 + 进程所使用的内存(SGA)

实例是一个临时性的东西,你也可以认为它 代表了数据库某一时刻的状态 !

数据库 = 重做文件 + 控制文件 + 数据文件 + 临时文件

数据库是永久的,是一个文件的集合 。

ORACLE实例和数据库之间的关系

1.临时性和永久性

2.实例可以在没有数据文件的情况下单独启动 startup nomount , 通常没什么意义

3.一个实例在其生存期内只能装载(alter database mount)和打开(alter database open)一个数

据库

4.一个数据库可被许多实例同时装载和打开(即 ),RAC环境中实例的作用能够得到充分

的体现!

下面对实例和数据库做详细的诠释:

在Oracle领域中有两个词很容易混淆,这就是“实例”(instance)和“数据库”(database)。

作为Oracle术语,这两个词的定义如下:

数据库(database):物理操作系统文件或磁盘(disk)的集合。使用Oracle 的自动存储

(Automatic Storage Management,ASM)或RAW分区时,数据库可能不作为操作系统

中单独的文件,但定义仍然不变。

实例(instance):一组Oracle后台进程/线程以及一个共享内存区,这些内存由同一个计算

机上运行的线程/进程所共享。这里可以维护易失的、非持久性内容(有些可以刷新输出到

磁盘)。就算没有磁盘存储,数据库实例也能存在。也许实例不能算是世界上最有用的事物,

不过你完全可以把它想成是最有用的事物,这有助于对实例和数据库划清界线。

这两个词有时可互换使用,不过二者的概念完全不同。实例和数据库之间的关系是:数据库

可以由多个实例装载和打开,而实例可以在任何时间点装载和打开一个数据库。实际上,准

确地讲,实例在其整个生存期中最多能装载和打开一个数据库!稍后就会介绍这样的一个例

子。是不是更糊涂了?我们还会做进一步的解释,应该能帮助你搞清楚这些概念。实例就是

一组操作系统进程(或者是一个多线程的进程)以及一些内存。这些进程可以操作数据库;

而数据库只是一个文件集合(包括数据文件、临时文件、重做日志文件和控制文件)。在任

何时刻,一个实例只能有一组相关的文件(与一个数据库关联)。大多数情况下,反过来也

成立:一个数据库上只有一个实例对其进行操作。不过,Oracle的真正应用集群(Real

Application Clusters,RAC)是一个例外,这是Oracle提供的一个选项,允许在集群环境中的

多台计算机上操作,这样就可以有多台实例同时装载并打开一个数据库(位于一组共享物理

磁盘上)。由此,我们可以同时从多台不同的计算机访问这个数据库。Oracle RAC能支持高

度可用的系统,可用于构建可扩缩性极好的解决方案。

下面来看一个简单的例子。假设我们刚 了Oracle 10g10.1.0.3。我们执行一个纯 安装,

不包括初始的“启动”数据库,除了软件以外什么都没有。

通过pwd命令可以知道当前的工作目录(这个例子使用一个Linux平台的计算机)。我们的

当前目录是dbs(如果在Windows平台上,则是database目录)。执行ls–l 命令显示出这个

目录为“空”。其中没有init.ora 文件,也没有任何存储参数文件(stored parameter file,SPFILE);

存储参数文件将在以后讨论。

使用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)等,这些进程将在以后详细介绍。

再使用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使用默认设置,把所有内容都放在一起,并把数据库创建为一组持久的文件。如果关

闭这个数据库,再试图打开,就会发现数据库无法打开:

一个实例在其生存期中最多只能装载和打开一个数据库。要想再打开这个(或其他)数据库,

必须先丢弃这个实例,并创建一个新的实例。

重申一遍:实例是一组后台进程和共享内存。

数据库是磁盘上存储的数据集合。

实例“一生”只能装载并打开一个数据库 。

数据库可以由一个或多个实例(使用RAC)装载和打开。

前面提到过,大多数情况下,实例和数据库之间存在一种一对一的关系。可能正因如此,才

导致人们很容易将二者混淆。从大多数人的经验看来,数据库就是实例,实例就是数据库。

不过,在许多测试环境中,情况并非如此。在我的磁盘上,可以有5个不同的数据库。测试

主机上任意时间点只会运行一个Oracle实例,但是它访问的数据库每天都可能不同(甚至

每小时都不同),这取决于我的需求。只需有不同的配置文件,我就能装载并打开其中任意

一个数据库。在这种情况下,任何时刻我都只有一个“实例”,但有多个数据库,在任意时

间点上只能访问其中的一个数据库。所以,你现在应该知道,如果有人谈到实例,他指的就

是Oracle的进程和内存。提到数据库时,则是说保存数据的物理文件。可以从多个实例访

问一个数据库,但是一个实例一次只能访问一个数据库。