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

本文详细解析了Oracle数据库中的关键参数,包括db_name、instance_name、service_name等,并阐述了它们在数据库管理和启动过程中的作用。文章还介绍了如何通过参数文件、listener配置和tnsname配置来实现数据库的连接与监听,以及ORACLE_SID参数在实例启动过程中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近查过一些资料,准备把oracle里纷乱的参数整理一下,这里主要讨论以下参数,及其用法的总结,如有不对的地方,望高人指点!
在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:对一个数据库(Oracle database)的唯一标识,该数据库为第一章讲到的Oracle database。这种表示对于单个数据库是足够的,但是随着由多个数据库构成的分布式数据库的普及,这种命令数据库的方法给数据库的管理造成一定的负担,因为各个数据库的名字可能一样,造成管理上的混乱。为了解决这种情况,引入了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 命令进行修改,然后修改相应参数。

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

Net service name:网络服务名,又可以称为数据库别名(database alias)。是客户端程序访问数据库时所需要,屏蔽了客户端如何连接到服务器端的细节,实现了数据库的位置透明的特性。
 
实例 就是管理相关库的内存结构的名字(由SGA、PGA、服务器进程、用户进程、后台进程等组成)
数据库 就是实际的磁盘上的文件(数据文件、日志文件、控制文件等),负责保存数据,但由对应的实例来操作它的数据
服务名 就是对外公布的名称,为网络监听服务
其实,在我们传统的概念里,数据库是一个统称的名字,在Oracle中,你可以把“数据库”理解成一个大概念,也要把它理解成一个小概念
1、一个Oracle数据库系统中可以同时安装几个数据库,每一个数据库对应一个唯
一的实例,但是OPS系统除外,可以多个实例同时对一个数据库操作,称为并行服务
2、只是一个名字,SID即是INSTANCE_NAME,SERVICE_NAMES主要用在监听器中。
在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参数,这个参数是操作系统中用到的,它是描述我们要默认连接的数据库实例.
instance_name是oracle数据库参数。而ORACLE_SID是操作系统的环境变量,ORACLE_SID必须与instance_name的值一致.对于一个机器上有多个实例的情况下,要修改后才能通过 conn / as sysdba连接,因为这里用到了默认的实例名。
 
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=kanon,监听中将动态注册Instance "kanon",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来修改。
     二者对应,实现了Listerner.ora/Tnsnames.ora的重要功能----监听、请求与验证。
总结:一条startup命令,究竟是如何启动庞大的oracle数据库的呢?下面我们来贯穿起来整个启动流程,一探究竟:
      首先,系统接收到startup命令,立刻采取行动,取得环境变量ORACLE_SID的值,启动第一阶段--实例创建。系统根据找到的参数文件启动ORACLE数据库实例,实例启动后,一切由实例接管:注册INSTANCE_NAME,往往INSTANCE_NAME就是来自ORACLE_SID,接着向监听器动态注册实例自己,并将INSTANCE_NAME写入系统数据字典表,
      接下来,实例进一步读取参数文件,取得DB_NAME、控制文件、检查点等信息,进入第二阶段--挂载数据库。实例从控制文件中取得DB_NAME,并取得数据文件、日志文件等信息,进行DB_NAME的一致性检验、文件的存在性

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

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

<think>好的,我现在需要分析用户提供的`listener.ora`配置文件内容,并解释其中各个部分的含义,同时指出可能存在的问题。用户之前遇到了监听器无法启动的问题,现在提供了配置文件,希望了解配置内容并找到潜在的错误。 首先,我需要回忆`listener.ora`文件的结构和作用。这个文件是Oracle网络配置的一部分,用于定义监听器的参数,如监听的地址、端口、服务名等。常见的配置包括`LISTENER`块和`SID_LIST_LISTENER`块,分别用于动态和静态注册数据库实例。 接下来,我需要逐行解析用户提供的配置内容: 1. **注释行**:文件开头说明了这是由Oracle配置工具生成的,路径正确,位于Oracle Home的NETWORK/ADMIN目录下,这是标准位置,没有问题。 2. **SID_LIST_LISTENER部分**: - 这里定义了一个SID列表,用于静态注册服务。当前只有一个SID_DESC,即CLRExtProc,这是Oracle的外部过程服务,通常用于调用外部DLL。配置了ORACLE_HOME、PROGRAM和ENVS参数。其中ENVS指定了EXTPROC_DLLS,限制只能加载oraclr19.dll,这是安全做法,没有问题。 3. **LISTENER部分**: - DESCRIPTION_LIST包含两个ADDRESS条目,分别使用TCP协议(端口1521)和IPC协议(键EXTPROC1521)。HOST设置为localhost,这意味着监听器只在本地监听。如果用户需要远程连接,localhost可能需要改为实际IP或主机名。 接下来,我需要分析潜在问题: - **缺少数据库实例的静态注册**:用户的配置中只有CLRExtProc的SID,没有用户数据库实例的静态注册。如果数据库没有动态注册(比如实例未启动或配置问题),监听器将无法识别该实例,导致连接问题。需要确认是否需要在SID_LIST中添加数据库SID。 - **HOST设置为localhost的影响**:使用localhost可能限制监听器只能接受本地连接。如果用户需要远程访问,应将HOST改为服务器的IP地址或可解析的主机名,或者0.0.0.0以监听所有接口。 - **IPC协议的适用性**:IPC协议通常用于本地进程间通信,但某些环境下可能需要检查权限或路径是否正确,特别是如果用户遇到与IPC相关的错误。 然后,我需要考虑用户之前遇到的错误,如TNS-12541无监听程序,可能的原因包括监听器未启动、配置错误或端口冲突。结合当前配置,可能的问题点在于HOST设置或缺少数据库实例的注册。 为了验证配置是否正常,可以检查监听器日志,查看是否有注册失败的信息,或者使用lsnrctl services命令查看已注册的服务。如果数据库实例未动态注册,可能需要静态注册或启动数据库实例。 最后,需要给出建议的修改步骤,比如添加数据库SIDSID_LIST,修改HOST为实际IP,并指导如何测试配置是否生效。</think>--- ### **`listener.ora` 配置文件解析与优化建议** 以下是您提供的 `listener.ora` 文件内容分析及潜在问题排查: --- #### **一、配置文件逐项解析** ```ini # listener.ora Network Configuration File: G:\Oracle\WINDOWS.X64_193000_db_home\NETWORK\ADMIN\listener.ora # Generated by Oracle configuration tools. SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = CLRExtProc) # 外部进程服务(如调用DLL) (ORACLE_HOME = G:\Oracle\WINDOWS.X64_193000_db_home) (PROGRAM = extproc) # 外部程序路径 (ENVS = "EXTPROC_DLLS=ONLY:G:\Oracle\WINDOWS.X64_193000_db_home\bin\oraclr19.dll") # 限制仅加载指定DLL ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) # 监听本地TCP连接 (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) # 本地进程间通信 ) ) ``` --- #### **二、当前配置的潜在问题** 1. **缺少数据库实例静态注册** - 现有配置仅包含 `CLRExtProc`(外部过程服务),**未显式注册您的数据库实例**。 - 若数据库未通过动态注册(例如实例未启动或未配置),监听器将无法识别数据库,导致 `TNS-12541` 错误。 2. **`HOST = localhost` 的限制** - 监听器仅绑定到本地回环地址(127.0.0.1),**无法接受远程连接**。 - 若需允许远程访问,需将 `HOST` 改为服务器实际 IP 或 `0.0.0.0`(监听所有网络接口)。 3. **IPC 协议兼容性问题** - `ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)` 用于本地进程通信,但在某些环境中可能因权限或路径问题失效(如您之前遇到的 `No such file or directory` 错误)。 --- #### **三、优化配置建议** ##### **1. 添加数据库实例静态注册(可选)** 在 `SID_LIST_LISTENER` 中添加数据库实例的静态注册(适用于数据库未动态注册的情况): ```ini SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = CLRExtProc) (ORACLE_HOME = G:\Oracle\WINDOWS.X64_193000_db_home) (PROGRAM = extproc) (ENVS = "EXTPROC_DLLS=ONLY:G:\Oracle\WINDOWS.X64_193000_db_home\bin\oraclr19.dll") ) (SID_DESC = # 新增数据库实例注册 (SID_NAME = <您的数据库SID>) # 例如:ORCL (ORACLE_HOME = G:\Oracle\WINDOWS.X64_193000_db_home) (GLOBAL_DBNAME = <全局数据库名>) # 可选,与tnsnames.ora匹配 ) ) ``` ##### **2. 修改监听地址支持远程访问** 将 `HOST = localhost` 改为服务器实际 IP 或 `0.0.0.0`: ```ini LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521)) # 改为实际IP (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) ``` ##### **3. 简化配置(移除IPC地址)** 若不需要本地进程通信,可删除 IPC 配置: ```ini LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) # 监听所有IP ) ) ``` --- #### **四、操作验证步骤** 1. **重启监听器服务**: ```cmd lsnrctl stop lsnrctl start ``` 2. **检查监听状态**: ```cmd lsnrctl status ``` - 正常输出应包含: ```ini Services Summary... Service "<数据库SID>" has 1 instance(s). # 确认数据库实例已注册 ``` 3. **远程连接测试**: 使用 SQL*Plus 或客户端工具尝试连接: ```sql sqlplus username/password@//服务器IP:1521/<服务名> ``` --- #### **五、常见问题处理** | 现象 | 解决方案 | |------|----------| | 监听器启动失败 | 检查 `listener.log` 日志(路径:`%ORACLE_HOME%\diag\tnslsnr\<主机名>\listener\trace\listener.log`) | | 远程连接超时 | 确认防火墙已开放 1521 端口,或临时关闭防火墙测试 | | 静态注册无效 | 确保 `SID_NAME` 与数据库实例实际名称一致 | --- #### **附:最终配置示例** ```ini SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = CLRExtProc) (ORACLE_HOME = G:\Oracle\WINDOWS.X64_193000_db_home) (PROGRAM = extproc) (ENVS = "EXTPROC_DLLS=ONLY:G:\Oracle\WINDOWS.X64_193000_db_home\bin\oraclr19.dll") ) (SID_DESC = (SID_NAME = ORCL) # 示例数据库SID (ORACLE_HOME = G:\Oracle\WINDOWS.X64_193000_db_home) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) # 允许所有IP连接 ) ) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值