我们知道,Oracle中的各种NAME会在我们的各个配置文件里常常出现,大致有下面这些:

在init.ora中有DB_NAME,INSTANCE_NAME,SERVICE_NAME

配置DG的时候,为了区分主备库,还要使用DB_UNIQUE_NAME

在操作系统中须要配置环境变量,ORACLE_SID

在listener.ora中有SID_NAMEGLOBAL_DBNAME

在tnsname.ora中有SERVICE_NAMESIDNET SERVICE NAME

那么这么多名字究竟有哪些差别呢?我们在使用过程中,又要注意些什么问题呢?以下我来总结一下:

这么多名字中,有些是初始化參数,如DB_NAME,DB_QUNIQUE_NAME,DB_DOMAIN,GLOBAL_NAME
有些则仅仅是一种叫法或者说是概念(并没有一个地方能够去设置它),如NET SERVICE NAME
有些则是某些表/视图中的字段名,如V$INSTANCE视图的INSTANCE_NAME
有些则是环境变量中的叫法,如ORACLE_SID
亦或是监听或client配置文件里设置的參数,如SID,SID_NAME,SERVICE_NAME,GLOBAL_DBNAME

DB_NAME:

对一个数据库(Oracle database)的唯一标识。这样的表示对于单个数据库是足够的,可是随着由多个数据库构成的分布式数据库的普及,这样的命令数据库的方法给数据库的管理造成一定的负担,由于各个数据库的名字可能一样,造成管理上的混乱。为了解决这样的情况,引入了Db_domain參数,这样在数据库的标识是由Db_name和Db_domain两个參数共同决定的,避免了由于数据库重名而造成管理上的混乱。这类似于互连网上的机器名的管理。我们将Db_name和Db_domain两个參数用’.’连接起来,表示一个数据库,并将该数据库的名称称为Global_name,即它扩展了Db_name。Db_name參数仅仅能由字母、数字、’_’、’#’、’$’组成,并且最多8个字符。特别要注意这个限制,有的时候会掉坑里,我就掉过一次T_T


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 <db_name.db_domain>命令进行改动,然后改动对应參数。



SERVICE_NAME:

该參数是oracle8i新引进的。在8i曾经,我们用SID来表示标识数据库的一个实例,可是在Oracle的并行环境中,一个数据库相应多个实例,这样就须要多个网络服务名,设置繁琐。为了方便并行环境中的设置,引进了Service_name參数,该參数相应一个数据库,而不是一个实例,并且该參数有很多其他的优点。该參数的缺省值为Db_name.
Db_domain,即等于Global_name。一个数据库能够相应多个Service_name,以便实现更灵活的配置。该參数与SID没有直接关系,即Service name不必与SID一样。


例如说我能够在环境变量设置的时候,设置ORACLE_SID=zlm,那么这个时候SID就是zlm,而在tnsnames.ora中,我能够把SERVICE_NAME改成zlm_SN

##tnsnames.ora

ZLM10G =  ##ZLM10G为NET SERVICE NAME

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.91)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = zlm_SN)
##SERVICE_NAME为zlm_SN,与SID为zlm不同

    )

  )

能够看到,SERVICE_NAME用了刚才在netca中配置的zlm_SN,SID用了ORACLE_SID设置的zlm,而且把tnsnames.ora里系统自己主动加入的NET SERVICE NAME相关的内容删除了(即由pmon进程自己主动注冊的2个动态监听),仅仅留下自己配置的部分

注意,这里我还使用了netmgr配置了静态监听(从status UNKNOWN事实上便可知),静态监听的目的,除了简化配置外,还能够提供在数据库未启动前仍能连接的功能,而不再是等数据库实例启动后,由pmon进程负责动态向监听注冊服务,动态监听会通常比較滞后,启动监听后,要等若干分钟,才干看到服务被监听。

##listener.ora

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (SID_NAME = PLSExtProc)

      (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)

      (PROGRAM = extproc)

    )

    (SID_DESC =

      (GLOBAL_DBNAME = zlm_SN)

      (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)

      (SID_NAME = zlm)

    )

  )

经过上面的tnsnames.ora和linstener.ora的配置,当我们查看监听状态的时候,就会发现不同:

$lsnrctl status
......
Services Summary...

Service "PLSExtProc" has 1 instance(s).

  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...

Service "zlm_SN" has 1 instance(s).## 表示对应的SERVICE_NAME为zlm_SN

  Instance "zlm", status
UNKNOWN, has 1 handler(s) for this service...  ##表示对应的INSTANCE_NAME为zlm,也即SID和ORACLE_SID

The command completed successfully

而通常情况下,我们会设置SERVICE_NAME和INSTANCE_NAME一致。这里还要注意的是,SERVICE_NAME尽管能够脱离INSTANCE_NAME搞别名,可是必须相应listener.ora里配置的GLOBAL_DBNAME,否则就算配好了静态监听,也是注冊不了服务的

注意,数据库数据文件存放的路径,是依据DB_NAME来确定的,而对于单实例数据库而言,默认与SID和INSTANCE_NAME是一致的,当然,也能够不一致(有DB_DOMAIN的情况下),DBCA的时候能够选择,通常这3个參数在DBCA的时候确认下来后,就基本不再去改动了,那么数据文件路径也就确定下来了,如我的环境中:
数据文件就放在/u01/app/oracle/oradata/zlm以下
而跟踪日志就放在/u01/app/oracle/admin/zlm/bdump以下

过了片刻以后,再查看监听状态,发现自己主动还是会去动态注冊一个SERVICE_NAME

Listening Endpoints Summary...

  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.91)(PORT=1521)))

  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))

Services Summary...

Service "PLSExtProc" has 1 instance(s).

  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...

Service "zlm" has 1 instance(s).

  Instance "zlm", status
READY, has 1 handler(s) for this service...

Service "zlmXDB" has 1 instance(s).

  Instance "zlm", status READY, has 1 handler(s) for this service...

Service "zlm_SN" has 1 instance(s).

  Instance "zlm", status UNKNOWN, has 1 handler(s) for this service...

Service "zlm_XPT" has 1 instance(s).

  Instance "zlm", status
READY, has 1 handler(s) for this service...

The command completed successfully

再贴一个DG中物理Standby上的监听

Listening Endpoints Summary...

  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.92)(PORT=1521)))

  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))

Services Summary...

Service "PLSExtProc" has 1 instance(s).

  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...

Service "ZLMDG" has 1 instance(s).

  Instance "zlm", status
READY, has 1 handler(s) for this service...

Service "ZLMDG_XPT" has 1 instance(s).

  Instance "zlm", status
READY, has 1 handler(s) for this service...

Service "zlmXDB" has 1 instance(s).

  Instance "zlm", status READY, has 1 handler(s) for this service...

Service "zlm_SN1" has 1 instance(s).

  Instance "zlm", status UNKNOWN, has 1 handler(s) for this service...

The command completed successfully

这种话,我个人推断,假设不配置静态监听的话,pmon进程始终会去监听那里注冊一个名字和DB_UNIQUE_NAME一致的SERVICE_NAME(原来我觉得会以INSTANCE_NAME(SID)来作为SERVICE_NAME的,但显然我的物理Standby上设置了DB_QUNIQUE_NAME为ZLMDG),即便已经在tnsnames.ora中改动了SERVICE_NAME=zlm_SN,而仅仅有通过静态监听强制注冊一个与INSTANCE_NAME(SID)不一致的SERVICE_NAME,才会被监听到,设置不同的各种NAME,有利于分析这些NAME是怎样工作的,生产环境中还是建议配置成同一个NAME,能够降低出问题的几率,也方便排查解决故障


NET SERVICE NAME:

网络服务名,又能够称为数据库别名(database alias)。是client程序訪问数据库时所需,屏蔽了client怎样连接到server端的细节,实现了数据库的位置透明的特性。通常当我们用DBLINK连接数据库时,使用的就是这个名字,由USINGkeyword指定,USING
'connect_string'这里connect_string事实上就是NET SERVICE NAME。
说到DBLINK还要提一点,就是当源数据库GLOBAL_NAME=TRUE时,link_name必须与远程数据库的全局数据库名global_name)相同;否则,能够随意命名。相同地,当我们用sqlplus system/oracle@xxx来连接DB SERVER时,这个xxx就是NET
SERVICE NAME,我的环境中是ZLM10G,如:

ZLM10G =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.91)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = zlm_SN)

    )

  )

那么依据tnsnames.ora的配置,这里ZLM10G就是zlm_SN这个SERVICE_NAME所相应的NET SERVICE NAME
假设用sqlplus system/oracle@zlm是连不上DB SERVER的,仅仅实用sqlplus system/oracle@zlm10g才行

[oracle@10dg1 ~]$ sqlplus system/oracle@zlm





SQL*Plus: Release 10.2.0.5.0 - Production on Tue Jul 29 14:48:39 2014





Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.





ERROR:

ORA-12560: TNS:protocol adapter error









Enter user-name: 

[oracle@10dg1 ~]$ sqlplus system/oracle@zlm10g





SQL*Plus: Release 10.2.0.5.0 - Production on Tue Jul 29 14:48:50 2014





Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.









Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL>

注意,用@NET SERVICE NAME方式登录,必须保证数据库是open的,否则即便是用对了名字,也会出现这样的情况:
[oracle@10dg1 ~]$ sqlplus system/oracle@zlm10g





SQL*Plus: Release 10.2.0.5.0 - Production on Tue Jul 29 14:46:16 2014





Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.





ERROR:

ORA-01034: ORACLE not available

ORA-27101: shared memory realm does not exist

Linux-x86_64 Error: 2: No such file or directory









Enter user-name: 

[oracle@10dg1 ~]$


实例(相应INSTANCE_NAME),就是管理相关库的内存结构的名字(由SGA、PGA、server进程、用户进程、后台进程等组成)


数据库(相应DB_NAME或GLOBAL_NAME),就是实际的磁盘上的文件(数据文件、日志文件、控制文件等),负责保存数据,但由相应的实例来操作它的数据


服务名(相应SERVICE_NAME),就是对外发布的名称,为网络监听服务


事实上,在我们传统的概念里,数据库是一个统称,在Oracle中,你能够把“数据库”理解成一个大概念,也要把它理解成一个小概念


1、一个Oracle数据库系统中能够同一时候安装多个数据库,每个数据库相应一个唯一的实例(1:1),可是OPS系统除外,能够多个实例同一时候对一个数据库操作,称为并行server(1:N),还有RAC架构,也是多个实例为一个数据库实例服务(1:N),另外还有ASM磁盘组实例,用于管理ASM这样的OMF存储结构而诞生的实例,这些都是非常easy混淆的概念。

2、SID即是INSTANCE_NAME,SERVICE_NAMES主要用在监听器中。
在listener.ora中有SID_NAME,GLOBAL_DBNAME,这里SID_NAME指数据库的执行的实例名,应该是和instance_name一致

而对于GLOBAL_DBNAME是listener配置的对外网络连接名称,在配置tnsname.ora时会考虑这个參数。这个參数能够随意的设置。注意:与GLOBAL_NAME的感念是不同的,GLOBAL_NAME=DB_NAME.DB_DOMAIN

另外有一点须要注意,一般我们会在listener.ora手工配置数据库实例的监听配置。但oracle能够通过pmon进程支持自己主动注冊,这时自己主动注冊的对外网络连接名称就会用到init.ora文件里SERVICE_NAME,有多个值的话就会注冊多个监听服务,如zlm_SN,zlm_SN2。假设你还手工配置了一个GLOBAL_DBNAME=zlm_SN3的监听服务的话,那么对于实例INSTANCE_NAME=zlm就会有三个监听服务。这也就是之前提到过,通常GLOBAL_DBANME能够设置成和SERVICE_NAME一致,但不强求
 
在tnsname.ora中有SERVICE_NAME,SID
配置client的tnsname.ora时,要给出连接的数据库的IP及其连接的实例或服务
在监听配置中提到了对外网络连接名称,假设用SERVICE_NAME的话,就须要SERVICE_NAME=(GLOBAL_DBNAME或者SERVICE_NAME=(zlm_SN),zlm_SN能够替换成zlm_SN2,zlm_SN3,这里要求oracle已经自己主动注冊到了监听器中,或者不写SERVICE_NAME=....
,而是写成SID=(zlm),都是能够的
 
ORACLE_SID參数,这个參数是操作系统中用到的,它是描写叙述我们要默认连接的数据库实例.
instance_name是oracle数据库參数。而ORACLE_SID是操作系统的环境变量,ORACLE_SID必须与instance_name的值一致.对于一个机器上有多个实例的情况下,要改动后才干通过
conn / as sysdba连接,如,SET ORACLE_SID=XXX,由于这里用到了默认的实例名。
 
1.ORACLE_SID:(ORACLE SYSTEM IDENTIFIER)

以环境变量的形式出现的。Oracle实例是由SGA和一组后台进程组成的,实例的创建和启动须要一个參数文件,而參数文件的名称就是由ORACLE_SID决定的。对于init文件,缺省的文件名是init<ORACLE_SID>.ora,对于spfile文件,缺省的文件名是spfile<ORACLE_SID>.ora


设置不同的ORACLE_SID值,就能够默认使用不同的參数文件启动不同的数据库实例。另外,ORACLE_SID的作用远远不是作为一个实例入口这么简单的,在实例启动后,实例名称INSTANCE_NAME也是从ORACLE_SID得到的。


2.INSTANCE_NAME:

实例名称,这是Oracle实例的名字,用来区分不通的实例。在Oracle9i之前,该名字存储在两个地方:參数文件和数据库的内部试图(V$INSTANCE),而在Oracle10g之后的版本号中,该名字不再出如今參数文件里,而是动态从系统中获得,默认是取自ORACLE_SID。INSTANCE_NAME的作用除了差别不同实例之外,在监听器动态注冊时,还会用于向监听器注冊。比方instance_name=zlm,监听中将动态注冊Instance
"zlm",status READY信息。


3.DB_NAME:
    
DB_NAME概念相比于INSTANCE_NAME要重要的多,它决定实例将挂在的数据文件。它出如今数据文件,控制文件,日志文件里。在參数文件里也出现,且必须出现。这个參数涉及到系统的物理文件。


4.SERVICE_NAME和GLOBAL_DBNAME:


这两个參数之所以放在一起讲,是由于他们往往是成对出现的。SERVICE_NAME出如今tnsnames.ora文件里,是client要请求的服务名。

GLOBAL_DBNAME出如今listener.ora文件里,是server提供的服务名,能够通过show paramererservice_names查看,并能够通过alter systemset service_name='servicename'
scope=both来改动。

二者相应,实现了listerner.ora/tnsnames.ora的重要功能——监听、请求与验证。

一条startup命令,到底是怎样启动庞大的oracle数据库的呢?以下我们来贯穿起来整个启动流程,一探到底:


      首先,nomount状态,系统接收到startup命令,立马採取行动,取得环境变量ORACLE_SID的值,開始分配SGA内存,启动第一阶段--实例创建。系统依据找到的參数文件启动ORACLE数据库实例,实例启动后,一切由实例接管:注冊INSTANCE_NAME,往往INSTANCE_NAME就是来自ORACLE_SID,接着向监听器动态注冊实例自己,并将INSTANCE_NAME写入系统数据字典表。


      接下来,mount状态,实例进一步读取參数文件,取得DB_NAME、控制文件、检查点等信息,进入第二阶段--挂载数据库。实例从控制文件里取得DB_NAME,并取得数据文件、日志文件等信息,进行DB_NAME的一致性检验、文件的存在性推断等工作之后,实例将挂载数据库,挂载的数据库就是DB_NAME指定的数据库。


      最后,open状态,实例进入第三阶段--启动数据库。这一阶段,实例进行了两项检查:检查点和更改点检查,之后启动数据库。

总结:如今,了解了那么多oracle中出现的各种NAME以后,我们发现,名称确实非常多,概念也非常easy混淆,如,SERVICE_NAME设置错误,就会造成服务无法正确注冊到监听,client连接不到数据库server等等,为了方便不出错,建议能设置的成一样的名字,尽量都用同一个,如:SID,ORACLE_SID,SID_NAME,INSTANCE_NAME,SERVICE_NAME,NET
SERVICE NAME,DB_NAME,GLOBAL_DBNAME这些名字,都能够设置成zlm,DB_DOMAIN能不用就尽量不设置,除非生产环境中有非常多库,为了惟一标识,假设设置了,那么GLOBAL_NAME就不再是DB_NAME了,而是DB_NAME.DB_DOMAIN,而当使用DBLINK的时候,LINK的名字也必须使用DB_NAME.DB_DOMAIN了,会带来不小麻烦。

ORACLE 中极易混淆的几个 NAME 的分析和总结的更多相关文章

  1. css常见的易混淆属性和值的区别(一)

    css的属性很多,每一个属性的值也很多,组合起来便有成千上万种.不同属性之间的相互组合也可以产生不同的样式,css真是一种优美的样式设计语言.下面对工作中常见的易混淆的属性和值进行总结: 1. lin ...

  2. C#中一些易混淆概念总结

    C#中一些易混淆概念 这几天一直在复习C#基础知识,过程中也发现了自己以前理解不清楚和混淆的概念.现在给大家分享出来我的笔记: 一,.NET平台的重要组成部分都是有哪些 1)FCL (所谓的.NET框 ...

  3. C#中易混淆的知识点

    C#中易混淆的知识点 一.引言 今天在论坛中看到一位朋友提出这样的一个问题,问题大致(问题的链接为:http://social.msdn.microsoft.com/Forums/zh-CN/52e6 ...

  4. a链接易混淆与form表单简易验证用法详解

    链接可以说遍布互联网,比如你想提供一个可以跳转到百度首页的链接给网友,那么代码如下: <a href="http://www.baidu.com">百度一下,你就知道& ...

  5. lua中易混淆函数

    lua中易混淆的函数 ipairs和pairs: ipairs只能顺序遍历table,遇到key不是数字就会退出 pairs可以遍历table中所有元素 ----------------------- ...

  6. JavaScript中易混淆的DOM属性及方法对比

    JavaScript中易混淆的DOM属性及方法对比 ParentNode.children VS Node.prototype.childNodes ParentNode.children:该属性继承 ...

  7. [Swift-2019力扣杯春季初赛]1. 易混淆数

    给定一个数字 N,当它满足以下条件的时候返回 true: 把原数字旋转180°以后得到新的数字. 如 0, 1, 6, 8, 9 旋转 180° 以后,得到了新的数字 0, 1, 9, 8, 6 . ...

  8. PHP易混淆函数的区别及用法汇总

    本文实例分析了PHP易混淆函数的区别及用法.分享给大家供大家参考.具体分析如下: 1.echo和print的区别PHP中echo和print的功能基本相同(输出),但是两者之间还是有细微差别的.ech ...

  9. 【C#小知识】C#中一些易混淆概念总结(七)---------解析抽象类,抽象方法

    目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 [C#小知识]C#中一些易混淆概念总结(二)--------构造函数,this关键字 ...

随机推荐

  1. oracle设备

    # Oracle Environment export ORACLE_BASE=/opt/oracle export ORACLE_HOME=/opt/oracle/product/11gR2/db ...

  2. 在java代码中获取JVM参数(转)

    近日关注性能调优,关注JMX,发现java.lang.management.*之强大.同时查阅了资料,整合一版关于JVM参数获取的note,仅供参考: MemoryMXBean memorymbean ...

  3. 自己写CPU第九阶段(3)——加载存储指令说明2(swl、swr)

    我们会继续上传新书<q=%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E5%86%99CPU&ie=utf-8&src=se_lighten_quot ...

  4. 【本·伍德Lua专栏】补充的基础09:使用table.concat将一个大的字符串

    近期2天都没有写新的文章了.主要是近期的内容没有特别有意思的. 之前的协同程序也临时没有感觉到特别适用的地方.今天在看数据结构的部分,也是没多大意思(不代表没用). 但是突然发现了一个有意思的地方,那 ...

  5. Windows PHone 8 获取硬件信息

    /// <summary> /// 获取系统信息 /// </summary> private string GetDeviceInfo() { StringBuilder s ...

  6. CCBValue

    #ifndef __CCB_VALUE_H__ #define __CCB_VALUE_H__ #include "cocos2d.h" #include "Extens ...

  7. java实现生产者消费者问题(转)

    引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...

  8. 有趣 IOS 开展 - block 使用具体解释

    Block 它是iOS于4.0新的程序语法之后,于iOS SDK 4.0之后,block应用几乎无处不在. 在其他语言中也有类似的概念,称为闭包(closure),实例object C兄弟swift ...

  9. Down to the TLP: How PCI express devices talk (Part II)

    http://xillybus.com/tutorials/pci-express-tlp-pcie-primer-tutorial-guide-2 Data Link Layer Packets A ...

  10. Unity3D移动端内存优化(NGUI方面)

     Unity3D引擎技术交流QQ群:[21568554] 做3d移动端内存一直是人们头疼的问题,载入的资源释放了,还有其它的须要释放.比方ngui释放,事实上主要是NGUI的Texture和Spr ...