ener.ora中有SID_NAME,GLOBAL_DBNAME,这里SID_NAME指数据库的运行的实例名,应该是和instance_name一致
而对于GLOBAL_DBNAME是listener配置的对外网络连接名称,在配置tnsname.ora时会考虑这个参数。这个参数可以任意的设置。注意:与GLOBAL_NAME的感念是不同的,GLOBAL_NAME=DB_NAME.DB_DOMAIN
另外有一点需要注意,一般我们会在listener.ora手工配置数据库实例的监听配置。但oracle可以通过pmon进程支持自动注册,这时自动注册的对外网络连接名称就会用到init.ora文件中SERVICE_NAME,有多个值的话就会注册多个监听服务,如zlm_SN,zlm_SN2。如果你还手工配置了一个GLOBAL_DBNAME=zlm_SN3的监听服务的话,那么对于实例INSTANCE_NAME=zlm就会有三个监听服务。这也就是之前提到过,通常GLOBAL_DBANME可以设置成和SERVICE_NAME一致,但不强求 在tnsname.ora中有SERVICE_NAME,SID 配置客户端的tnsname.ora时,要给出连接的数据库的IP及其连接的实例或服务在监听配置中提到了对外网络连接名称,如果用SERVICE_NAME的话,就需要SERVICE_NAME=(GLOBAL_DBNAME或者SERVICE_NAME=(zlm_SN),zlm_SN可以替换成zlm_SN2,zlm_SN3,这里要求oracle已经自动注册到了监听器中,或者不写SERVICE_NAME=.... ,而是写成SID=(zlm),都是可以的 ORACLE_SID参数,这个参数是操作系统中用到的,它是描述我们要默认连接的数据库实例. instance_name是oracle数据库参数。而ORACLE_SID是操作系统的环境变量,ORACLE_SID必须与instance_name的值一致.对于一个机器上有多个实例的情况下,要修改后才能通过 conn / as sysdba连接,如,SET ORACLE_SID=XXX,因为这里用到了默认的实例名。 1.ORACLE_SID:(ORACLE SYSTEM IDENTIFIER)
以环境变量的形式出现的。Oracle实例是由SGA和一组后台进程组成的,实例的创建和启动需要一个参数文件,而参数文件的名称就是由ORACLE_SID决定的。对于init文件,缺省的文件名称是init.ora,对于spfile文件,缺省的文件名称是spfile.ora
设置不同的ORACLE_SID值,就可以默认使用不同的参数文件启动不同的数据库实例。另外,ORACLE_SID的作用远远不是作为一个实例入口这么简单的,在实例启动后,实例名称INSTANCE_NAME也是从ORACLE_SID得到的。
2.INSTANCE_NAME:
实例名称,这是Oracle实例的名字,用来区分不通的实例。在Oracle9i之前,该名字存储在两个地方:参数文件和数据库的内部试图(V$INSTANCE),而在Oracle10g之后的版本中,该名字不再出现在参数文件中,而是动态从系统中获得,默认是取自ORACLE_SID。INSTANCE_NAME的作用除了区别不同实例之外,在监听器动态注册时,还会用于向监听器注册。比如instance_name=zlm,监听中将动态注册Instance "zlm",status READY信息。
3.DB_NAME: DB_NAME概念相比于INSTANCE_NAME要重要的多,它决定实例将挂在的数据文件。它出现在数据文件,控制文件,日志文件中。在参数文件中也出现,且必须出现。这个参数涉及到系统的物理文件。
4.SERVICE_NAME和GLOBAL_DBNAME:
这两个参数之所以放在一起讲,是因为他们往往是成对出现的。SERVICE_NAME出现在tnsnames.ora文件中,是客户端要请求的服务名。
GLOBAL_DBNAME出现在listener.ora文件中,是服务器提供的服务名,可以通过show paramererservice_names查看,并可以通过alter systemset service_name='servicename' scope=both来修改。
二者对应,实现了listerner.ora/tnsnames.ora的重要功能——监听、请求与验证。
一条startup命令,究竟是如何启动庞大的oracle数据库的呢?下面我们来贯穿起来整个启动流程,一探究竟:
首先,nomount状态,系统接收到startup命令,立刻采取行动,取得环境变量ORACLE_SID的值,开始分配SGA内存,启动第一阶段--实例创建。系统根据找到的参数文件启动ORACLE数据库实例,实例启动后,一切由实例接管:注册INSTANCE_NAME,往往INSTANCE_NAME就是来自ORACLE_SID,接着向监听器动态注册实例自己,并将INSTANCE_NAME写入系统数据字典表。
接下来,mount状态,实例进一步读取参数文件,取得DB_NAME、控制文件、检查点等信息,进入第二阶段--挂载数据库。实例从控制文件中取得DB_NAME,并取得数据文件、日志文件等信息,进行DB_NAME的一致性检验、文件的存在性判断等工作之后,实例将挂载数据库,挂载的数据库就是DB_NAME指定的数据库。
最后,open状态,实例进入第三阶段--启动数据库。这一阶段,实例进行了两项检查:检查点和更改点检查,之后启动数据库。
总结:现在,了解了那么多oracle中出现的各种NAME以后,我们发现,名称确实很多,概念也很容易混淆,如,SERVICE_NAME设置错误,就会造成服务无法正确注册到监听,客户端连接不到数据库服务器等等,为了方便不出错,建议能设置的成一样的名字,尽量都用同一个,如:SID,ORACLE_SID,SID_NAME,INSTANCE_NAME,SERVICE_NAME,NET SERVICE NAME,DB_NAME,GLOBAL_DBNAME这些名字,都可以设置成zlm,DB_DOMAIN能不用就尽量不设置,除非生产环境中有很多库,为了惟一标识,如果设置了,那么GLOBAL_NAME就不再是DB_NAME了,而是DB_NAME.DB_DOMAIN,而当使用DBLINK的时候,LINK的名字也必须使用DB_NAME.DB_DOMAIN了,会带来不小麻烦。
|