ORACL中的DB_NAME,SERVICE_NAME,INSTANCE_NAME,ORACLE_SID,GLOBAL_DBNAME介绍

本文详细解析了Oracle数据库启动流程,包括实例创建、挂载数据库和启动数据库的步骤。阐述了ORACLE_SID、INSTANCE_NAME、DB_NAME、SERVICE_NAME和GLOBAL_DBNAME等关键参数的作用,并解释了它们之间的关联。同时,介绍了如何通过修改这些参数实现数据库实例的个性化配置,包括设置不同的服务名和服务地址。最后,提供了关于如何通过lsnrctl status观察监听器状态的实用技巧。
 Oracle内存在很多特殊意义的名字或者变量:ORACLE_SID,DB_NAME,INSTANCE_NAME,SERVICE_NAME,GLOBAL_DBNAME.

1.ORACLE_SID:(ORACLE SYSTEM IDENTIFIER)站点标示符

以环境变量的形式出现的。
Oracle实例是由SGA和一组后台进程组成的,实例的创建和启动需要一个参数文件,而参 数文件的名称就是由ORACLE_SID决定的。对于init文件,缺省的文件名称是init.ora,对于 spfile文件,缺省的文件名称是spfile.ora
设置不同的ORACLE_SID值,就可以默认使用不同的参数文件启动不同的数据库实例。
另外,ORACLE_SID的作用远远不是作为一个实例入口这么简单的,在实例启动后,实例名称INSTANCE_NAME也是从ORACLE_SID得到的。
2.INSTANCE_NAME:

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

    DB_NAME概念相比于INSTANCE_NAME要重要的多,它决定实例将挂在的数据文件。它出现在数据文件,控制文件,日志文件中。在参数文件中也出现,且必须出现。这个参数涉及到系统的物理文件。
4.SERVICE_NAME和GLOBAL_DBNAME:
    这两个参数之所以放在一起讲,是因为他们往往是成对出现的。SERVICE_NAME出现在Tnsnames.ora文件中,是客户端要请求的服务名。
GLOBAL_DBNAME 出现在Listener.ora文件中,是服务器提供的服务名,可以通过show paramerer service_names查看,并可以通过alter system set service_name='servicename' scope=both来修改。
SERVICE_NAMES为实例所连接的数据库定义一个或多个服务名,可以通过定义多个服务名将不同用户连接区分开来。这个参数的缺省格式为:DB_NAME.DB_DOMAIN,如果定义了DB_DOMAIN那么定义的服务名就类似: 
SERVICE_NAMES = sales.eygle.com, news.eygle.com
通过这样的定义,销售用户可以通过在客户端TNSNAME定义中使用SALES服务名来建
立连接,而新闻用户则可以通过NEWS服务名进行连接,最终用户可以不必关注数据库是哪
一个,他们只需要关心服务名。



二者对应,实现了Listerner.ora/Tnsnames.ora的重要功能----监听、请求与验证。

总结:一条startup命令,究竟是如何启动庞大的oracle数据库的呢?下面我们来贯穿起来整个启动流程,一探究竟:
首先,系统接收到startup命令,立刻采取行动,取得环境变量ORACLE_SID的值,启动第一阶段--实例创建。系统根据找到的参数文件启动 ORACLE数据库实例,实例启动后,一切由实例接管:注册INSTANCE_NAME,往往INSTANCE_NAME就是来自ORACLE_SID, 接着向监听器动态注册实例自己,并将INSTANCE_NAME写入系统数据字典表,
接下来,实例进一步读取参数文件,取得DB_NAME、控制文件、检查点等信息,进入第二阶段--挂载数据库。实例从控制文件中取得DB_NAME,并取 得数据文件、日志文件等信息,进行DB_NAME的一致性检验、文件的存在性判断等工作之后,实例将挂载数据库,挂载的数据库就是DB_NAME指定的数 据库。
最后,实例进入第三阶段--启动数据库。这一阶段,实例进行了两项检查:检查点和更改点检查,之后启动数据库。

init.ora 中的instance_name是可以设置的,这个大家都知道是没有错误的,但是这个和我们ORACLE_SID又有什么区别呢?其实还是有一些区别 的,ORACLE_SID就是系统表示符,这个环境变量就是要告诉OS,我要读取那个init.ora文件或者spfile来启动我的Oracle instance,比如set ORACLE_SID=mylife,这个时候当我连入Oracle后,运行startup,那么Oracle就会寻找spfilemylife.ora 或者initmylife.ora这样的参数文件,并启动我的instance,在数据库成 功open后,我们可以通过select instance_name from v$instance来观察这个已经记录的SID,这个时候我们也可以show parameter instance_name来观察这个值,没错都是mylife,一般来讲,我们启动instance所加载的pfile或者spfile中也记录了一个 instance_name这个参数,但是这个参数一般没有显示的列出,因此我们可以手动的去加上这个参数或者修改这个参数,把这个参数的值改为和 mylife不相同的一个值mylove,这个时候再重新启动数据库,会发现show parameter和select instance_name from v$instance的方式有两个不同的值分别是mylove和mylife,如果我们的tnsnames.ora中的文件是以sid方式来寻找服务,那 么这个sid 的值就不是mylife了,而要改为mylove.恩,大体上就是这个意思。还没有深入研究太多,对于大多数用户来讲,理解这些就足够了。
再 说一下service_name,如果我们的参数文件中记录了db_domain比如是cn.ibm.com,那么service_name默认就是 db_name+db_domain,但是我们完全可以修改这个值,原先数据库的service_name=icmnlsdb.cn.ibm.com,现 在比如我在pfile中显示的指定service_names=abc,重启database后,这个service_name就变为了abc,而不是先 前的icmnlsdb.cn.ibm.com了,那么在tnsnames.ora中的service_name列,我就要指定这个值为 abc+db_domain.注意不是service_name+db_domain,因为我的service_name在修改后是不带domain标识 的,那么如果db_domain为空的话,tnsnames.ora文件中的service_name就直接可以写为abc了。大体就是这个意思,解释的 有点饶,但是总算可以从这条路中走出来了。
最后一点,lsnrctl status我们随时观察一下listener的状态,看看他到底有什么变化。很有意思的。


在init.ora中有db_name,instance_name,service_name
在操作系统中需要配置oracle_sid
在listener.ora中有SID_NAME,GLOBAL_DBNAME,
在tnsname.ora中有SERVICE_NAME,SID
这么多,是不是你也看糊涂了。先晕一个,下面慢慢道来。

在init.ora中有db_name,instance_name,service_name
db_name是数据库的名称,在db安装时就已经设置了,这里不可修改,它觉得了数据库安装文件的位置。
instance_name是实例名,是数据库运行中名称,其实在OO中db_name相当于类而instance_name向当于对象,它也 是代表数据库运行中的内存及其进程,同时影响到了这些进程的名称,譬如:一个数据库db_name=cus,而其实例instance_name= aking,那么数据库起来后,其进程名可能为:Pmon_aking_1。这里的实例名称要和PWDsid.ora和initSid.ora等文件匹配 上,否则,db起动报错。从这里可以看出db_name是类名,定义后是不可修改的,而对于instance_name实例名向当于对象,所以我们可以设 定自己喜欢的对象名称。不过话虽这样讲,但改了instance_name后,牵扯到很多其他的设置,还是最好不要动他,默认和db_name是一样的, 这样多好。
service_name我觉得应该是指数据库网络连接时的名称,在listener配置中会有所考虑的。这个值也是可以随意改动的,并且还可以有多个值。alter system set service_name=serv1,serv2 scope=both;

在listener.ora中有SID_NAME,GLOBAL_DBNAME
这里SID_NAME指数据库的运行的实例名,应该是和instance_name一致
而对于GLOBAL_DBNAME是listener配置的对外网络连接名称,我们在配置tnsname.ora时会考虑这个参数。这个参数可以任意的设置。
另外有一点需要注意,一般我们会在listener.ora手工配置数据库实例的监听配置。但oracle可以通过pmon进程支持自动注册, 这时自动注册的对外网络连接名称就会用到init.ora文件中service_name,有多个值的话就会注册多个,对于上面的例子,在这里就会注册 serv1和serv2两个监听服务。如果你还手工配置了一个GLOBAL_DBNAME=serv3的监听服务的话,那么对于实例 instance_name=aking就会有三个监听服务。

在tnsname.ora中有SERVICE_NAME,SID
下面配置客户端的tnsname.ora
对于这里的配置主要要给出要连接的数据库的IP及其连接的实例或服务
在监听配置中我们提到了对外网络连接名称,在这里如果我们用SERVICE_NAME的话,就需要SERVICE_NAME= (GLOBAL_DBNAME或者service_name这里要求oracle已经自动注册到了监听器中),对于SID= (instance_name)即可,譬如:
SERVICE_NAME=serv1,serv2,serv3都可以,或者
SID=aking

最后一个是ORACLE_SID参数,这个参数是操作系统中用到的,它是描述我们要默认连接的数据库实例,对于一个机器上有多个实例的情况下,要修改后才能通过 conn / as sysdba连接,因为这里用到了默认的实例名。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24742969/viewspace-1614020/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/24742969/viewspace-1614020/

<think>好的,用户现在问的是Oracle中的GLOBAL_DBNAMESID_NAME是否必须相同。根据之前的对话,用户已经了解过SIDService Name的区别,现在可能是在配置监听器时遇到了问题,或者对这两个参数的关系不太清楚。 首先,我需要回顾之前的回答,确保信息的一致性。之前提到过SID是实例标识,而Service Name是逻辑服务名,通常用于客户端连接,尤其是在RAC环境中。现在用户提到的GLOBAL_DBNAMESID_NAME是监听器配置文件中的参数,需要明确他们的定义和用途。 根据用户提供的引用内容,引用1指出ORACLE_SID是实例标识符,作为环境变量存在,与INSTANCE_NAME不同,但需要保持一致。引用2提到ORACLE_SID操作系统的环境变量,必须与INSTANCE_NAME的值一致。而引用3说明GLOBAL_DBNAME在listener.ora中出现,是服务器提供的服务名,可以通过参数service_names查看和修改。 接下来需要分析GLOBAL_DBNAMESID_NAME的关系。GLOBAL_DBNAME通常对应Service Name,而SID_NAME对应实例的SID。在静态注册时,GLOBAL_DBNAME可以设置为Service NameDB_NAME,而SID_NAME必须与实例的ORACLE_SID一致。动态注册下,实例会自动注册Service Name到监听器,无需手动配置GLOBAL_DBNAME。 用户的问题核心在于这两个参数是否必须相同。根据引用内容,GLOBAL_DBNAME可以是Service Name,而SID_NAME是实例的SID,两者不需要相同。例如,在单实例中,GLOBAL_DBNAME可能设为Service Name,而SID_NAME是实例的SID,可能不同。在RAC环境中,GLOBAL_DBNAME可能是一个统一的Service Name,而每个节点的SID_NAME不同。 此外,用户可能遇到的实际配置问题,例如监听器无法识别实例,可能由于静态注册时GLOBAL_DBNAMESID_NAME配置错误导致。需要给出配置示例和常见错误排查方法,帮助用户理解如何正确设置这两个参数。 最后,总结两者的关系,明确不需要相同,并给出最佳实践建议,比如在静态注册时如何设置,动态注册的优势等,以帮助用户根据实际环境进行配置。</think>### **Oracle GLOBAL_DBNAMESID_NAME 的配置关系** 在 Oracle 数据库的监听器(Listener)配置中,`GLOBAL_DBNAME` 和 `SID_NAME` 是两类关键参数,**两者不要求必须相同**,但需根据具体场景进行合理配置。以下是二者的核心区别与关联逻辑: --- ### **1. 概念与用途对比** | **参数** | **GLOBAL_DBNAME** | **SID_NAME** | |--------------------|------------------------------------|----------------------------------| | **定义** | 监听器配置中标识逻辑服务名 | 监听器配置中标识实例的 SID | | **作用对象** | 客户端连接时使用的服务名(Service Name) | 实例的唯一标识符(ORACLE_SID) | | **关联参数** | `SERVICE_NAMES`(数据库参数) | `INSTANCE_NAME`(数据库参数) | | **配置文件** | `listener.ora`(静态注册) | `listener.ora`(静态注册) | --- ### **2. 配置场景与逻辑** #### **(1) 静态注册(Manual Registration)** 当监听器通过 `listener.ora` **手动配置**实例时: - **`GLOBAL_DBNAME`**:通常设置为数据库的 `SERVICE_NAMES` 或 `DB_NAME`,用于客户端通过服务名连接。 - **`SID_NAME`**:必须与实例的 `ORACLE_SID` 完全一致,用于监听器定位具体实例进程。 **示例配置**: ```ini # listener.ora 配置片段 SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = app_service) # 逻辑服务名(可自定义) (ORACLE_HOME = /u01/app/oracle/product/19c) (SID_NAME = ORCL) # 必须与实例的 ORACLE_SID 一致 ) ) ``` **关系说明**: - 若客户端使用 `GLOBAL_DBNAME`(如 `app_service`)连接,监听器将其映射到 `SID_NAME` 对应的实例。 - **允许不同**:`GLOBAL_DBNAME` 可以是任意服务名,与 `SID_NAME` 无强制关联。 #### **(2) 动态注册(Dynamic Registration)** 当实例通过 `PMON` 进程**自动注册**到监听器时(默认行为): - **`GLOBAL_DBNAME`**:自动填充为数据库的 `SERVICE_NAMES`,无需手动配置。 - **`SID_NAME`**:自动填充为实例的 `ORACLE_SID`,与 `INSTANCE_NAME` 一致。 **动态注册优势**: - 无需手动维护 `listener.ora`,减少配置错误风险。 - 支持实时更新服务状态(如 RAC 节点的增删)。 --- ### **3. 是否必须相同?** - **否**:`GLOBAL_DBNAME` 与 `SID_NAME` 可以是不同的值,具体取决于用途: - **单实例场景**: - `GLOBAL_DBNAME` 可设置为业务相关的服务名(如 `app_service`)。 - `SID_NAME` 必须与实例的 `ORACLE_SID` 一致(如 `ORCL`)。 - **RAC 集群场景**: - 所有节点共享同一个 `GLOBAL_DBNAME`(如 `rac_service`),但每个节点的 `SID_NAME` 不同(如 `ORCL1`, `ORCL2`)。 **典型错误案例**: 若在静态注册中将 `SID_NAME` 错误设置为与 `ORACLE_SID` 不一致的值,会导致监听器无法识别实例,报错 **ORA-12505**。 --- ### **4. 验证与排查方法** #### **(1) 查看监听器注册信息** ```bash lsnrctl status ``` 输出中检查 `Service` 和 `Instance` 的对应关系: ``` Service "app_service" has 1 instance(s). Instance "ORCL", status READY, has 1 handler(s) for this service... ``` #### **(2) 检查数据库参数** ```sql -- 查看实例的 ORACLE_SIDSERVICE_NAMES SELECT INSTANCE_NAME FROM V$INSTANCE; -- 输出 SID_NAME SHOW PARAMETER SERVICE_NAMES; -- 输出 GLOBAL_DBNAME 的候选值 ``` --- ### **5. 总结与最佳实践** - **静态注册**: - `GLOBAL_DBNAME` 可自由定义,用于逻辑服务隔离。 - `SID_NAME` 必须严格匹配 `ORACLE_SID`。 - **动态注册**: - 优先使用默认行为,避免手动配置冲突。 - 通过 `SERVICE_NAMES` 参数统一管理服务名。 --- ### **相关问题** 1. **如何在 RAC 环境中为同一服务配置多个 `GLOBAL_DBNAME`?** 2. **动态注册失败时如何强制手动注册实例到监听器?** 3. **监听器日志中 `TNS-12560` 错误与 `SID_NAME` 配置不匹配有何关联?** [^1]: `GLOBAL_DBNAME` 是监听器配置中的逻辑服务名,与 `SERVICE_NAMES` 参数关联。 [^2]: `SID_NAME` 必须与实例的 `ORACLE_SID` 一致,用于实例进程识别。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值