Oracle中SID INSTANCE_NAME Service_Name DB_Name等的介绍

本文遵循BY-SA版权协议,转载请附上原文出处链接。


本文作者: 黑伴白

本文链接: http://heibanbai.com.cn/posts/10ae5a95/

Oracle_SID & SID & INSTANCE_NAME

Oracle中SID的作用类似于一个“开关变量”—引导Oracle在实例启动时如何去默认位置下读取适当的参数文件并加载,以正确启动实例,通过SID来命名后台进程。

操作系统也必须通过SID来和Oracle实例打交道,操作系统并不知道什么INSTANCE_NAME,只知道Oracle_SID,在Oracle内部由Oracle自己根据这个SID去识别不同的实例。所以ORACLE_SID更多的是Oracle和外部操作系统沟通的一个窗口。

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

上图表示实例名instance_name、Oracle_SID与数据库及操作系统之间的关系

虽然这里两个参数都是数据库实例名,但 instance_name参数是Oracle数据库的参数,此参数可以在参数文件中查询到;而Oracle_SID参数则是操作系统环境变量,与 Oracle_BASE、Oracle_HOME等用法相同,用于和操作系统交互。

也就是说,在操作系统中要想得到实例名,就必须使用 Oracle_SID。且Oracle_SID必须与instance_name的值一致,否则,你将会收到一个错误,在unix平台,是“Oracle not available”,在winnt平台,是“TNS:协议适配器错误”。

简单来说就是: Oracle_SID = SID = INSTANCE_NAME

1
2
3
4
5
-- 查询当前数据库实例名
-- 方法一:
select instance_name from v$instance;
-- 方法二:
show parameter instance

Service_Name

Service_Name是Oracle实例提供的服务名。是从oracle 9i,10g开始引入的参数。用Service_names表示。数据库服务名与全局数据库名相同。它隔离了Oracle实例,客户端仅仅需要知道Service_Name就可以访问实例。而不需要知道实例的SID。更不需要知道DB_NAME等信息。

Service_names为实例定义一个或多个Service_name,这样可以通过多个Service_name将不同的用户连接区分开来。

Service_Name似乎应该分为两种,一种是实例服务名 instance service name,一种是网络服务名 net service name (也叫TNSName),如下tnsnames.ora所示:

1
2
3
4
5
6
7
8
9
net_service_name =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 199.188.166.110)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = instance_service_name)
)
)
1
2
3
4
5
-- 查询数据库服务名
-- 方法一:
select value from v$parameter where name = 'service_name';
-- 方法二:
show parameter service_name

DB_NAME

是用于区分一个数据的内部标示,即Oracle数据库的内部表示。是以二进制方式存储于数据库的控制文件的参数。在数据库安装或创建之后不得修改。

DB_NAME唯一性地标识了 oracle database,与数据库物理文件相关;而SID唯一性地标识了oracle instance,与所有进程相关。而oracle database和oracle instance一起组成了oracle server。

SID和DB_NAME在非RAC环境默认是相等的。但是二者相等与否,无关紧要。在RAC环境,因为一个DB_NAME对应多个SID,所以不可能相等了。

1
2
3
4
5
-- 查询参数文件db_name的数值 
-- 方法1
select name from v$database
-- 方法2
show parameter db_name

数据库域名

在Oracle10g中db_domain表示域名。与数据库名,数据库实例名一样数据库域名在安装数据库时候已经确定。abc.xxx.com.cn。后面的xxx.com.cn则表示域名。

1
2
3
4
5
6
7
-- 查询数据库域名
-- 方法一:
select value from v$parameter where name = 'db_domain';
-- 方法二:
show parameter domain
-- 方法三:
在参数文件中查询

全局数据库名

则表示数据库名和域名的总和。如果没有域名,全局数据库名就与数据库名相同。

JDBC连接ORACLE

1
2
3
4
5
6
7
8
# 格式一:
jdbc:oracle:thin:@//<host>:<port>/<service_name>
# 格式二:
jdbc:oracle:thin:@<host>:<port>:<SID>
# 格式三:
jdbc:oracle:thin:@<TNSName>
# 格式四:
jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = <host>)(PORT = <port>)))(CONNECT_DATA =(SERVICE_NAME = <service_name>)))

蚂蚁再小也是肉🥩!


Oracle中SID INSTANCE_NAME Service_Name DB_Name等的介绍
http://heibanbai.com.cn/posts/10ae5a95/
作者
黑伴白
发布于
2022年1月1日
许可协议

“您的支持,我的动力!觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信二维码

微信支付

支付宝二维码

支付宝支付