菜鸟雷区
在配置listener.ora 和 tnsnames.ora 连接Oracle数据库服务器时,我们需要把 以下容易混淆的概念区分开来
数据库域名
数据库名
全局数据库名
SID
数据库实例名
服务名
有图有真相
安装Oracle数据库时我们指定的这些东西在配置时需要使用,真坑,安装的时候也不提醒我一下
脚下留心:如果默认安装的话,以下输入框中是: ORCL
查询SQL见附录
1.数据库域名(db_domain)
分布式数据库系统中,不同版本的数据库服务器之间,不论运行的操作系统是unix或是windows,各服务器之间都可以通过数据库链路进行远程复制。
数据库域名主要用于oracle分布式环境中的复制。数据库域名被写入参数文件中,该参数为db_domain。
2.数据库名(db_name)
数据库名是在安装数据库时指定的,存储在(dbhome_1/dbs/init.ora)。
在数据库安装或创建完成之后,数据库名被写入参数文件中,该参数为db_name。
创建数据库控制文件、修改数据结构、备份与恢复数据库时都需要使用到。
3.全局数据库名(GLOBAL_NAME)
全局数据库名(name.domain)称唯一的标识Oracle数据库。储在控制文件中的名称,它代表的是数据库,也就是数据库包含的所有的物理文件的总称。
配置 tnsnames.ora 时可能需要使用到。
4.数据库实例名(instance_nam)和ORACLE_SID
数据库至少由一个Oracle数据库实例引用,该实例由 SID(Oracle服务标识符) 唯一标识,以区别一台计算机上的任何其他Oracle数据库实例。ORACLE_SID,Oracle服务标识符(SID),Oracle系统标识符都是同一个概念。ORACLE_SID标识Oracle实例,
一个数据库可以有多个实例,例如RAC,在oracle并行服务器架构(即oracle实时应用集群)中,数据库名和实例名是一对多的关系。实例名用于标识数据库内的每一个实例的名称。
在一般情况下,数据库名和实例名是一对一的关系,数据库名**和实例名可以相同也可以不同。
高能警告:两者关系有些复杂,通常情况下二者是一致的,如果不想了解的请移步下一个大标题
操作系统---------OracleSID---------》数据库实例------数据库实例名-----------》数据库管理系统
数据库实例名是指响应某个数据库操作的 数据库管理系统 的名字,操作系统和数据库之间的交互用的是数据库实例名。数据库实例名是用于和操作系统进行联系的标识。从操作系统的角度访问实例名,必须通过ORACLE_SID。
在winnt不台, ORACLE_SID需存在于注册表中。实例名被写入参数文件中,该参数为instance_name。ORACLE_SID必须与 instance_name 的值一致。否则,客户端连接时将会收到一个错误,在winnt平台,是“TNS:协议适配器错误”。在unix平台,是“ORACLE not available”
instance_name是oracle数据库参数。
ORACLE_SID是操作系统的环境变量。
5.服务名 (SERVICE_NAME)
数据库对外提供的名字,好比你与陌生人时你往往会把你的姓名告诉他,而不是你的绰号或者小名告诉他。
SERVICE_NAME指的是listener中的全局数据库名:这个名字是由listener.ora中GLOBAL_DBNAME参数决定的。
SERVICE_NAME是Oracle8i新引进的,8i之前一个数据库只能有一个实例。8i之后一个数据库可以对应多个实例,例如RAC。为了充分利用所有实例,并且令客户端连接配置简单,ORACLE提出了SERVICE_NAME的概念。该参数直接对应数据库,而不是某个实例。
如果数据库有域名,则 数据库服务名=全局数据库名=数据库名【.】数据库域名
数据库服务名与数据库名相同。
配置的时候建议要默认的ORCL,不带域名
约定>配置>编码
附录
上述专业名词名字在SQLplus中用sys或system登录可以查询
数据库名
SELECT * FROM V$DATABASE;
SELECT t.NAME FROM V$DATABASE t;
实例名
SELECT * FROM V$INSTANCE;
SELECT t.INSTANCE_NAME FROM V$INSTANCE t;
SID
select * from v$thread;
select t.INSTANCE from v$thread t;
域名
select * from v$parameter t where t.name = 'db_domain';
select t.VALUE from v$parameter t where t.name = 'db_domain';
服务名
select * from v$parameter t where t.name = 'service_names';
select t.VALUE from v$parameter t where t.name = 'service_names';