1.1 DBID(DataBase IDentifier)
DBID 可以看成是db_name在数据库内部的表示。 DBID是在创建数据库时,用db_name 结合一种算法来创建的。 具体用什么算法,不太清楚。它存在与数据文件和控制文件,用于表示数据文件的归属。 所以这个DBID 是唯一的。 对于不同的数据库,DBID 是不同的,但是db_name 有可能相同。
用身份证打个比方: 可以有同名的人,但是它的省份证号码肯定是不同的
SQL> select dbid from v$database;
DBID
----------
1274677836
可以是DBID命令修改,步骤如下:
(1)将数据库启动到mount状态
(2)用nid命令修改:nid TARGET=/ DBNAME=atlanta
(3)修改之后,在启动到mount:startup mount
(4)resetlogs 打开数据库:ALTER DATABASE OPEN RESETLOGS;
1.2 DB_NAME(DataBase Name)
DB_NAME 是数据库名,它的长度不能超过8个字节,超过8个会被截断。对于RAC环境,各个节点之间的DB_NAME都是相同的,INSTANCE_NAME 不同。 对于Data Guard环境,DB_NAME相同,DB_UNIQUE_NAME 不同
DB_NAME记录在datafile,redo log和control file中。 这个记录方式就是通过DBID。 因为DBID 就是用DB_NAME 加算法来生成的
db_name还有一个非常重要的作用就是动态注册监听,不管是否指定了service_name,或者说service_name的值是什么,pmon都会使用db_name动态注册监听的
还是借用身份证的比喻: DB_NAME 就是姓名,DBID就是身份证
SQL> show parameter db_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_name string atlanta
1.3 INSTNACE_NAME(Instance Name)
instance_name除了动态注册监听用到之外,到目前为止我没有发现其他用处,也许oracle用它来区分各个实例
SQL> show parameter instance_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string atlanta
1.4 SERVICE_NAMES(Service Names)
服务名是复数,大家看好了,意味着service_names 可以是多个值,这里的服务名除了在动态注册的监听中被用到之外,没有发现其它用处,还有其它用处大家可以补充,dataguard中建议大家在primary,standby上使用相同的service_names,这样可能便于尽可能的实现透明切换,前提是如果没有配置静态监听的话,当然如果配置了静态注册的监听在primary,standby上也务必保持在listener中要求输入的服务名相同,还是那句话,尽可能的实现透明切换
SQL> show parameter service_names
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string ATLANTA
1.5 DB_DOMAIN(DataBase Domain)
doc上说它被"."分割,包括句点最多128个字符,没改过这么长的,不知道,没有验证过,谁想验证就验证一下,db_domain 的作用主要是用在分布式数据库中,分布式事务的各个数据库应该有db_domain ,但是要求他们是否相同,doc上没说,我也不知道,之前单位开发有分布式环境,但是当时没有注意过,不过高级复制中要同步的对象所在的数据库是无论如何也要设置db_domain 的,是否要求相同也不得而知了,我在配置复制的时候把db_domain 设置为相同的了。介绍db_domain 的另一个用途就是在同一个os域中如果要创建同名db_name的数据库时建议最好让具有相同db_name的数据库具有不同的db_domain,以保证在同一个域中global_name是唯一的。doc上也是这样建议的:Oracle recommends that you specify DB_DOMAIN as a unique string for all databases in a domain
SQL> show parameter db_domain
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_domain string COM
1.6 DB_UNIQUE_NAME
DB_UNIQUE_NAME是10g的参数,在配置dataguard环境时必须为处于dg环境中每个db设置一个唯一值,在没有DB_UNIQUE_NAME参数之前,在同一台机器上搭建dg时必须使用参数LOCK_NAME_SPACE在standby参数文件中,10g有了参数db_unique_name,LOCK_NAME_SPACE已经被废弃
SQL> show parameter db_unique_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_unique_name string ATLANTA
1.7 GLOBAL_NAME
global_name 是由db_name.db_domain构成,但是通过验证发现oracle并没有把db_name.db_domain和global_name 同步起来,不知道为什么?global_name oracle是通过提供了一个view,sys.global_name,该试图是源于props$的,可以查看创建view的脚本,最终我们访问的是一个public synonym global_name
不过我们也可以修改global_name:alter database rename global_name to test1.com;
一旦加上了域就不能通过上面的命令去掉了:alter database rename global_name to test123.com;
不过可以直接update global_name 或者props$来去掉后缀:update global_name set global_name='test1';
global_name 的作用主要也是用在Distributed Database中,我只在高级复制中用过global_name
SQL> select * from global_name;
GLOBAL_NAME
--------------------------------------------------
ATLANTA
1.8 GLOBAL_NAMES
Global_names 是一个布尔值,global_names的作用是创建db link时是否强制使用远程数据库的global_name,如果global_names=true,则db link name必须要求是remote database的global_name,否则创建之后db link 不能连同,缺省值是false。多用于分布式系统
SQL> show parameter global_names
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
global_names boolean FALSE
[ora10g@kf admin]$ cat listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = atlanta)
(ORACLE_HOME = /u02/app/ora10g/product/10.2.0/db_1)
(SID_NAME = atlanta)
)
(SID_DESC =
(GLOBAL_DBNAME = jssweb)
(ORACLE_HOME = /u02/app/ora10g/product/10.2.0/db_1)
(SID_NAME = jssweb)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.137.125)(PORT = 1522))
)
)
1.9 SID_NAME
在Listener.ora中使用,SID_NAME指数据库的运行的实例名,和instance_name保持一致
1.10 GLOBAL_DBNAME
配置静态监听注册时,需要输入SID和GLOBAL_NAME
GLOBAL_DBNAME 是listener配置的对外网络连接名称,我们可以写成任意值。 在客户端配置监听的tnsnames.ora 文件中的service_name 与这个GLOBAL_DBNAME 保持一致就可以了。因为客户端访问数据库是通过监听来实现的。
如果采用动态注册的话,PMON进程会根据初始化参数initSID.ora中的instance_name,service_names两个参数将实例和服务动态注册到listener中,这时自动注册的对外网络连接名称就是initSID.ora文件中service_names
因为service_names可以有多个值,如果有多个值,就会注册多个。 但是他们对应都是同一个instance_name。 这样,我们在客户端配置tnsnames.ora 时,在service_name 写其中任意一个都可以正常连上数据库
atlanta=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.137.125)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = atlanta)
)
)
1.11 SERVICE_NAME
如果服务器采监听采用了静态注册,那么这个参数就等于Listener.ora 文件中的GLOBAL_DBNAME的值
如果是动态注册,那么这个值就是initSID.ora 文件中service_names中的值
1.12 SID
在tnsnames.ora文件中还可以使用SID。 如果使用该参数,只需要把该参数指定为instance_name就可以了
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/15672129/viewspace-709630/
,如需转载,请注明出处,否则将追究法律责任。