Oracle有很多name如:DB_NAME、DB_UNIQUE_NAME、INSTANCE_NAME、SERVICE_NAME、DBID等等。很多初学者容易弄混,下面会通过各个层面的展示,从视觉、流程角度去了解,而并非单一通过概念去认识他们,这样会更容易认识他们,了解他们之间的区别。
1、DB_NAME
数据库名称,指定最多8个字符的数据库标识符。必须指定此参数,并且该参数必须与CREATE DATABASE语句中指定的名称相对应。如果有多个数据库,则此参数的值应与每个数据库的Oracle实例标识符匹配,以避免与系统上运行的其他数据库混淆。DB_NAME在备用和生产初始化参数文件中,的值应相同。DB_NAME记录在datafile、redolog、control file。
使用BBED查看system01.DBF如下
此处我们看到,数据文件头只有八个字符的位置存储 Oracle 的数据库名,这也是我们为什么说,长度不能超过 8个字符,dump可以看到如下内容:
从第 32 位字符开始,就是存储的数据文件,给位置根据第一幅图 O 所反馈的 @32 可知,也可以由以下语句进行验证
2、DBID
DBID 是在数据库创建的时候用DB_NAME结合算法计算出来的,由一串数字组成,它存在于 datafile 和 control file 中,用来表示数据文件的归属,所以DBID是唯一的,对于不同的数据库,DB_NAME可以是相同的,但是DBID一定是唯一的,我们还是以上图的 system01.dbf 为例,它是以倒序的形式存储在数据文件头部的。
我们依然可以用to_char命令进行验证
3、DB_UNIQUE_NAME
在DataGuard中,主备库拥有相同的DB_NAME,为了区别,就必须有不同的DB_UNIQUE_NAME。DB_UNIQUE_NAME在DG中会影响动态注册的SERVICE_NAME,即如果采用的是动态注册,则注册的SERVICE_NAME为DB_UNIQUE_NAME,但是实例还是INSTANCE_NAME,即SID。
4、SID & INSTANCE_NAME
在操作系统中要想得到实例名,就必须使用ORACLE_SID。initSID.ora 和 orapwSID 文件要与 ORACLE_SID 保持一致。
数据库根据 ORACLE_SID 来查找 spfile,然后以 ORACLE_SID 作为 INSTANCE_NAME 来启动实例,所以其相关的进程名,也为 ORACLE_SID 的名称。
此名称可以和数据库名称一致,也可以不一致,为了便于区分,一般差别不大。
手动建库时,会读取参数文件中 DB_NAME,然后在创建过程中写入控制文件、数据文件和重做日志文件,所以数据库名和实例名可以不一致。
5、SERVICE_NAME
数据库和客户端相连是使用的服务名,默认与 DB_UNIQUE_NAME 一致,也可以添加多个 SERVICE_NAME 用于服务。
网络服务名称是映射到包含在数据库网络地址中的别名。 连接描述符。连接描述符通过协议地址和要连接的数据库的服务名称包含侦听器的位置。与应用程序建立连接时,客户端和数据库服务器(它们是其他数据库服务器的客户端)使用网络服务名称。tnsnames.ora文件包含映射到本地命名方法的描述符的网络服务名称,或映射到侦听器协议地址的网络服务名称。