点击标题下「蓝色微信名」可快速关注
Oracle数据库中可能有很多容易混淆的名称,会让初学者觉得可能困惑,例如DB_NAME、DBID、DB_UNIQUE_NAME、INSTANCE_NAME、SID、SERVICE_NAME、GLOBAL_DATABASE_NAME。
但这正是Oracle数据库设计精妙的一个佐证,不同的名称,有着不同作用,没有一个名称是乱起的,这些名称从不同层面描述了数据库、实例及连接方式。
我们可以用一个"公司"的比喻来理解它们,想象一下,你经营一家公司(数据库),公司有一个注册名字(DB_NAME),一个营业执照编号(DBID),还有几个办公场所(实例),每个办公场所都有自己的门牌号(SID/INSTANCE_NAME),同时公司对外提供客服电话(SERVICE_NAME),而在集团(分布式数据库)中,公司还有个全称(GLOBAL_DATABASE_NAME)。如果开了分公司(Data Guard),还会有一个区分总公司和分公司的唯一名称(DB_UNIQUE_NAME)。
从以上的例子,我们还可以得到一个道理,就是很多技术和现实中的对象是可以映射的,而且通过这种映射可以加深我们的理解,有助于我们更好地设计系统。
下面我们逐一解释这些数据库名称:
1. DB_NAME(数据库名)
- 是什么:数据库的内部名字,就像公司的注册名。创建数据库时指定,一般不超过8个字符,保存在控制文件中。
- 作用:Oracle自己用这个名字来识别数据库。例如在参数文件(比如
init.ora)里会写db_name='orcl',表示这个数据库叫orcl。 - 注意:这个名字不用于客户端连接,它是"内部用"的。
2. DBID(数据库标识符)
- 是什么:数据库的唯一身份证号。创建数据库时自动生成的一串数字,写在控制文件和数据文件头部。
- 作用:用于绝对区分不同的数据库,尤其在备份恢复(RMAN)时,Oracle靠DBID来确认你备份的是哪个数据库,防止恢复错乱。即使两个数据库名字一样,DBID也一定不同。
3. DB_UNIQUE_NAME(数据库唯一名)
- 是什么:在Oracle Data Guard环境中使用的名字,用于区分主数据库和备数据库。如果不配置Data Guard,它默认和DB_NAME一样。
- 作用:当你有一个主库和一个备库,它们可能DB_NAME相同(因为本是同一个数据库的副本),但为了区分,给它们起不同的"唯一名",例如主库叫
orcl_primary,备库叫orcl_standby。
4. INSTANCE_NAME 与 SID(实例名与系统标识符)
这两个可以一起理解,因为它们经常指向同一个东西——实例。
- 实例(Instance):可以理解为Oracle的"运行现场",由内存(SGA)和后台进程组成。有了实例才能访问数据库。一个数据库可以被一个或多个实例挂载(比如RAC集群)。
- SID(系统标识符):操作系统级别识别实例的代号。你在服务器上设置环境变量
ORACLE_SID=orcl,操作系统就知道你要操作哪个实例。 - INSTANCE_NAME:Oracle实例自己的名字,通常就等于SID,由初始化参数
instance_name定义。例如你在SQL*Plus里执行show parameter instance_name就能看到。 - 简单关系:SID是操作系统层面叫的,INSTANCE_NAME是数据库内部叫的,它们一般一样。在单实例环境中,SID也经常和DB_NAME相同,但这不是必须的。
5. SERVICE_NAME(服务名)
- 是什么:客户端(例如你的应用程序)连接数据库时使用的逻辑名称。它是Oracle Net(网络层)的概念。
- 作用:以前老版本用SID连接,但SID只能指向一个具体的实例,而服务名可以指向一个或多个实例(比如RAC中所有实例对外提供一个服务名),还可以动态注册到监听器。你会在连接字符串中看到类似
SERVICE_NAME=orcl.example.com。 - 设置:由初始化参数
service_names定义,可以设置多个服务名。
6. GLOBAL_DATABASE_NAME(全局数据库名)
- 是什么:数据库在分布式环境中的全名,格式为
DB_NAME.DB_DOMAIN,例如orcl.example.com。 - 作用:用于在分布式数据库中唯一标识一个数据库,特别是在使用数据库链接(dblink)时。创建数据库时可以指定
GLOBAL_DATABASE_NAME,它会存储在数据字典中,并且可以通过global_names参数强制要求dblink名称必须与此一致。
因此,
- DB_NAME 是数据库的根本名字,很多其他名字默认由此衍生。
- DBID 是数据库的不可变身份证号,备份恢复时依赖。
- DB_UNIQUE_NAME 是Data Guard中为了区分不同副本而起的别名。
- SID/INSTANCE_NAME 是实例的名字,对应"运行中的程序"。
- SERVICE_NAME 是客户端连接时使用的服务名,可以灵活对应一个或多个实例。
- GLOBAL_DATABASE_NAME 是数据库在分布式世界里的完整域名。
举个例子:
- 你创建了一个数据库,
DB_NAME='orcl',生成DBID=1234567890。 - 服务器上设置
ORACLE_SID=orcl,所以INSTANCE_NAME也是orcl。 - 你配置了监听,对外提供
SERVICE_NAME=orcl.example.com,客户端通过这个服务名连接。 - 如果你搭建了Data Guard备库,备库的
DB_UNIQUE_NAME='orcl_stdby',但它的DB_NAME仍然可以是orcl,因为它是同一个数据库的副本。 - 在分布式环境中,这个数据库的
GLOBAL_DATABASE_NAME='orcl.example.com',其他数据库可以通过dblink用这个名字访问它。