同事项目用到 Oracle,向我问起这些内容,虽本人忝列 OCP,但那是6年前的事了,这几年工做繁重,基本作了清零,受同事之托从新梳理了一遍。linux
涉及到的名字包括如:DB_NAME,DB_DOMAIN,ORACLE_SID,INSTANCE_NAME, SERVICE_NAME 等。算法
提起这些名字,首先要理解 ORACLE 的逻辑架构,咱们一般说的能够访问的ORACLE DB。其实两部分组成:实例(包括一组进程,和SGA内存等) + 物理介质。介质包括控制文件,数据文件,日志文件,参数文件等。实例进程就是一堆操做物理介质的进程。再者实例进程能够不挂载(mount)任何物理介质,这时的实例叫 idle instance.sql
上面的名字先找简单的说:DB_NAME。这两个东西建立数据库时指定,并且最具稳定性,DB_NAME遍及在数据文件,日志文件,参数文件中,99.9%状况下不会也不须要去变他。(虽然如今版本也能够修改了)。数据库
能够把他理解成物理介质的标记,这些物理介质都属这个DB。至于DB_DOMAIN只是为好分布式管理加的一个标识而已,意义不大,知道有这个东西便可。架构
ORACLE_SID:通常ORACLE_SID做环境变量用,他是个操做系统层面的东西, 最多见的两个用处:oracle
决定Oracle实例 进程的名字,在linux下看,Oracle相应的进程,会发现都缀有ORACLE_SID。app
定位Oracle的启动参数文件,Oracle在启动时要寻找其配置文件(目前以这个顺序查找spfile<ORACLE_SID>.ora -> spfile.ora -> init<ORACLE_SID>.ora)。分布式
Oracle启动以后,这个参数也没多大用处了。ide
注: 相同Oracle_HOME下,ORACLE_SID要不一样,不一样Oracle_HOME下,可相同。操作系统
INSTANCE_NAME:DB_NAME是物理介质的标识,INSTANCE_NAME就是实例进程的标识。
对ORACLE数据库,非RAC状况下,物理介质能够被任意实例进程挂载(mount)和打开(open)
但同一时间,只能有一个实例进程打开他。 RAC状况下,则容许多个实例进程打开相同的物理介质。
1+1变成了n+1,也就是说RAC状况下,多个实例对应着同一个物理介质。
JAVAEE同窗都记得JDBC的链接串为:jdbc:oracle:thin:@<host>:<port>:<SID>
这个SID就是INSTANCE_NAME。数据库链接,实际上是链接到实例进程。大多数时候咱们都当成了ORACLE_SID, 只是由于那个时候他们相同了。(关于各个参数的default值问题,这里不说子,码字累)。
彷佛有INSTANCE_NAME+DB_NAME已经完美的解决的实体的定位问题。直到RAC的出现,打破了这一宁静。出了多个实例同时打开同一个DB_NAME的状况。那个上面的JDBC的链接串就很差用了,这时SERVICE_NAME横空出世。
简单的说,SERVICE_NAME表明整个数据库(进程+DB),一个SERVICE_NAME下面能够有多个实例,因此不管是RAC,仍是单例数据库, jdbc:oracle:thin:@<host>:<port>:<SERVICE_NAME>均可以正常链接。
SERVICE_NAME怎么发挥作的呢,咱们知道Oracle监听在1521端口,由于存在一个监听器。在ORACLE实例启动时,PMON进程会将该实例注册到这个监听器上,当前也所括其所属性的服务名,这种叫动态注册,可能不易理解SERVICE_NAME(能够用lsnrctl status命令查看存在的service及instance),看一个静态注册的listener.ora:
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = ORCL) ---这里为INSTANCE_NAME (ORACLE_HOME = /mydatafile2/app/oracle/oracle/product/11.2.0/db_1) (GLOBAL_DBNAME=WOO.COM) ---这里为SERVICE_NAME。 ) )
链接到这个SERVICE,监听器就会按必定算法将链接负载到相应的实例上。
综上看:访问数据库关注的大多为Instance_name和service_name.
而管理数据库用到ORACLE_SID和DB_NAME
先写这么多吧,后面再补。