点击标题下「蓝色微信名」可快速关注
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用这个名字访问它。
如果您认为这篇文章有些帮助,还请不吝点下文章末尾的"点赞"和"在看",或者直接转发朋友圈,
可以到各大平台找我,
微信公众号:@bisal的个人杂货铺
腾讯云开发者社区:@bisal的个人杂货铺
头条号:@bisal的个人杂货铺
CSDN:@bisal
ITPub:@bisal
墨天轮:@bisal
51CTO:@bisal
小红书:@bisal
抖音:@bisal
近期更新的文章:
《老朋友,好久不见了,愿你在天堂安好》
《达梦set schema版本场景》
《英超第二十九轮》
《OpenClaw:你养的是虾还是被时代落下的恐惧?》
《成为一名优秀DBA需要具备什么?》
近期Vlog:
《千岛湖》
《Skyline Luge》
《新疆之行(红山体育馆 - 国际大巴扎 - 红山公园 - 天山天池)》
《新疆之行(天马浴河 - 哈因塞 - 那拉提 - 依提根塞)》
《新疆之行(六星街 - 伊昭公路 - 夏塔)》
热文鉴赏:
《揭开"仿宋"和"仿宋_GB2312"的神秘面纱》
《Linux的"aarch"是多了个"a"?》
《中国队“自己的”世界杯》
《你不知道的C罗-Siu庆祝动作》
《大阪环球影城避坑指南和功略》
《推荐一篇Oracle RAC Cache Fusion的经典论文》
《"红警"游戏开源代码带给我们的震撼》
文章分类和索引:
《公众号2000篇文章分类和索引》