初步了解Oracle数据库名(DB_NAME)、实例名(INSTANCE_NAME)、服务名(SERVICE_NAME)

数据库名:数据库名是存储在控制文件中的名称,它代表的是数据库,也就是数据库包含的所有的物理文件的总称。

实例名:用于响应某个数据库操作的数据库管理系统的名称。实例名是由初始化参数文件的参数instance_name决定的。如果这个参数不被指定(即instance_name没有被指定为任何值),那么实例的名字由该用户的环境变量ORACLE_SID(注意这里是大写)决定。一个数据库可以有多个实例,例如RAC,实例名(SID)用于标识数据库内的每一个实例的名称

服务名:SERVICE_NAME指的是listener中的全局数据库名:这个名字是由listener.ora中GLOBAL_DBNAME参数决定的。SERVICE_NAME是Oracle8i新引进的,8i之前一个数据库只能有一个实例。8i之后一个数据库可以对应多个实例,例如RAC。为了充分利用所有实例,并且令客户端连接配置简单,ORACLE提出了SERVICE_NAME的概念。该参数直接对应数据库,而不是某个实例。

简单来说,
数据库是一个定义,实例是这个数据库Server启动后的实例(即实例=进程+内存块)。
服务停了,实例就没了,服务起来,实例就有了。

服务名是在listener.ora中配置的,可以和数据库名实例名不一样,监听也可以启动多个,只要端口不被占用即可。listener只是为了连接数据库而存在的,相当于对外的服务,多个实例可以公用一个服务名。
查询数据库名:

select name from v$database;

查询实例名:

select instance_name from v$instance;

在Oracle 8i之前,一个数据库只能由一个实例对应。所以我们连数据库的时候使用

jdbc:oracle:thin:@<host>:<port>:<SID>

这种SID连接方式即可。
在Oracle 8i之后,为了提高性能,一个数据库可以对应多个实例(但是一个实例只能对应一个数据库),当我们连接数据库时,Oracle建议使用service name方式连接:

jdbc:oracle:thin:@//<host>:<port>/<service_name>

但是用sid方式也能连,这里sid要输对,sid可以在v$instance这个视图中查询到,就是instance_name字段。

select instance_name from v$instance;

参考文章:
https://www.cnblogs.com/lixuwu/p/7127148.html#_label1
https://blog.csdn.net/makai5521/article/details/80468869
https://www.cnblogs.com/dream-1314/p/15803213.html

posted @ 2022-08-22 17:44  hucat  阅读(3314)  评论(0)    收藏  举报