oracle 10g中的几个概念(sid/db_name/server_name)
一、数据库名
1.数据库名的概念
1.数据库名的概念
数据库名(db_name)就是一个数据库的标识,就像人的身份证号一样。如果一台机器上装了多全数据库,那么每一个数据库都有一个数据库名。在数据库安装或创建完成之后,参数DB_NAME被写入参数文件之中。
env | grep ORACLE
数据库名在$ORACLE_HOME/admin/db_name/pfile/init.ora文件中
###########################################
# Database Identification
###########################################
db_domain=""
db_name=orcl
在创建数据库时就应考虑好数据库名,并且在创建完数据库之后,数据库名不宜修改,即使要修改也会很麻烦。因为,数据库名还被写入控制文件中,控制文件是以 二进制型式存储的,用户无法修改控制文件的内容。假设用户修改了参数文件中的数据库名,即修改DB_NAME的值。但是在Oracle启动时,由于参数文 件中的DB_NAME与控制文件中的数据库名不一致,导致数据库启动失败,将返回ORA-01103错误。
# Database Identification
###########################################
db_domain=""
db_name=orcl
在创建数据库时就应考虑好数据库名,并且在创建完数据库之后,数据库名不宜修改,即使要修改也会很麻烦。因为,数据库名还被写入控制文件中,控制文件是以 二进制型式存储的,用户无法修改控制文件的内容。假设用户修改了参数文件中的数据库名,即修改DB_NAME的值。但是在Oracle启动时,由于参数文 件中的DB_NAME与控制文件中的数据库名不一致,导致数据库启动失败,将返回ORA-01103错误。
2.数据库名的作用
数据库名是在安装数据库、创建新的数据库、创建数据库控制文件、修改数据结构、备份与恢复数据库时都需要使用到的。
有很多Oracle安装文件目录是与数据库名相关的,如:
winnt: F:\oracle\product\10.2.0\oradata\DB_NAME\...
有很多Oracle安装文件目录是与数据库名相关的,如:
winnt: F:\oracle\product\10.2.0\oradata\DB_NAME\...
又如参数文件pfile:
winnt: F:\oracle\product\10.2.0\admin\DB_NAME\pfile\init.ora.54200885729
winnt: F:\oracle\product\10.2.0\admin\DB_NAME\pfile\init.ora.54200885729
如果控制文件损坏或丢失,数据库将不能加载,这时要重新创建控制文件,方法是以nomount方式启动实例,然后以create controlfile命令创建控制文件,当然这个命令中也要指明DB_NAME。
3.修改数据库名
建议:应在创建数据库时就确定好数据库名,数据库名不应作修改,因为修改数据库名是一件比较复杂的事情。
现在就来说明一下,如何在已创建数据之后,修改数据库名。步骤如下:
(1)关闭数据库。
(2)修改数据库参数文件中的DB_NAME参数的值为新的数据库名。
(3)以NOMOUNT方式启动实例,修建控制文件(有关创建控制文件的命令语法,请参考oracle文档)
现在就来说明一下,如何在已创建数据之后,修改数据库名。步骤如下:
(1)关闭数据库。
(2)修改数据库参数文件中的DB_NAME参数的值为新的数据库名。
(3)以NOMOUNT方式启动实例,修建控制文件(有关创建控制文件的命令语法,请参考oracle文档)
4.查询当前数据库名
方法一: select name from v$database;
方法二:show parameter db
方法三:查看参数文件
方法二:show parameter db
方法三:查看参数文件
二、数据库实例名
1.数据库实例名的概念(instance_name)
先来解释以下,实例是什么东西。实例是访问Oracle数据库所需的一部分计算机内存和辅助处理后台进程,是由进程和这些进程所使用的内存(SGA)所构成一个集合,它根本不需要一个与其相关联的数据库,没有任何数据文件也可以启动实例。下面是Oralce的启动过程:
sqlplus / as sysdba
sql>startup nomount #启动了一个实例,现在SGA分配了,进程在运行,除数据库所有的东西都启动了
sql>alter database mount#利用控制文件(init.ora文件中指定)定位重作文件、数据文件、临时文件
sql>alter database open#数据库可供任何人通过这个实例访问。
所以可以这么理解:大家访问Oracle都是访问一个实例,但这个实例如果关联了数据库文件,就是可以访问的,如果没有,就会得到实例不可用的错误。
实例名指的是用于响应某个数据库操作的数据库管理系统的名称。她同时也叫SID。实例名是由参数instance_name决定的。如果这个参数不被指定(即instance_name没有被指定为任何值),那么实例的名字由该用户的环境变量ORACLE_SID(注意这里是大写)决定。在windows平台下,则是注册表中oracle_sid值决定。
先来解释以下,实例是什么东西。实例是访问Oracle数据库所需的一部分计算机内存和辅助处理后台进程,是由进程和这些进程所使用的内存(SGA)所构成一个集合,它根本不需要一个与其相关联的数据库,没有任何数据文件也可以启动实例。下面是Oralce的启动过程:
sqlplus / as sysdba
sql>startup nomount #启动了一个实例,现在SGA分配了,进程在运行,除数据库所有的东西都启动了
sql>alter database mount#利用控制文件(init.ora文件中指定)定位重作文件、数据文件、临时文件
sql>alter database open#数据库可供任何人通过这个实例访问。
所以可以这么理解:大家访问Oracle都是访问一个实例,但这个实例如果关联了数据库文件,就是可以访问的,如果没有,就会得到实例不可用的错误。
实例名指的是用于响应某个数据库操作的数据库管理系统的名称。她同时也叫SID。实例名是由参数instance_name决定的。如果这个参数不被指定(即instance_name没有被指定为任何值),那么实例的名字由该用户的环境变量ORACLE_SID(注意这里是大写)决定。在windows平台下,则是注册表中oracle_sid值决定。
2.实例和数据库
实例和数据库之间的区别如下:
(1)实例是临时的,它只在相关的进程和内存集合存在时存在;数据库是永久的,只要文件存在它就存在
(2)一个实例在其生存期内可安装和打开单个数据库;数据库可以被很多实例安装和打开,或者一个接一个的实例安装和打开,或者由多个实例同时安装和打开(RAC)
顺便提一下RAC,简单来说RAC就是多个实例同时打开一个数据库文件的系统,在结构上是多台机器,每天机器运行一个实例,每个实例都打开同一个数据库 (这个是用磁盘共享技术实现的),这些实例之间需要同步高速缓存,这样保证多个实例是完全一致的,不会相互冲突乃至覆盖。
实例和数据库之间的区别如下:
(1)实例是临时的,它只在相关的进程和内存集合存在时存在;数据库是永久的,只要文件存在它就存在
(2)一个实例在其生存期内可安装和打开单个数据库;数据库可以被很多实例安装和打开,或者一个接一个的实例安装和打开,或者由多个实例同时安装和打开(RAC)
顺便提一下RAC,简单来说RAC就是多个实例同时打开一个数据库文件的系统,在结构上是多台机器,每天机器运行一个实例,每个实例都打开同一个数据库 (这个是用磁盘共享技术实现的),这些实例之间需要同步高速缓存,这样保证多个实例是完全一致的,不会相互冲突乃至覆盖。
数据库实例名(instance_name)用于对外部连接。在操作系统中要取得与数据库的联系,必须使用数据库实例名。例如,要去连接一个数据库服务器,就必须知道其数据库实例名,只知道数据库名是没有用的。与数据库名不同,在数据安装或创建数据库之后,实例名可以被修改。数 据库名和实例名可以相同也可以不同。在一般情况下,数据库名和实例名是一对一的关系,但如果在oracle并行服务器架构(即oracle实时应用集群) 中,数据库名和实例名是一对多的关系(一个数据库对应多个实例,同一时间内用户只一个实例相联系,当某一实例出现故障,其它实例自动服务,以保证数据库安 全运行) 。
3.查询当前数据库实例名
3.查询当前数据库实例名
方法一:select instance_name from v$instance;
方法二:show parameter instance
方法二:show parameter instance
三、ORACLE_SID
在实际中,对于数据库实例的标识有时使用实例名,有时使用ORACLE_SID,它们有什么区别呢?
(ORACLE_SID)
OS<----------------> ORACLE 数据库 <--------(instance_name(实例名))
OS<----------------> ORACLE 数据库 <--------(instance_name(实例名))
上图表示实例名instance_name、ORACLE_SID与数据库及操作系统之间的关系,虽然这里列出的两个参数都是数据库实例名,但 instance_name参数是ORACLE数据库的参数,此参数可以在参数文件中查询到;而ORACLE_SID参数则是操作系统环境变量,与 ORACLE_BASE、ORACLE_HOME等用法相同,用于和操作系统交互。也就是说,在操作系统中要想得到实例名,就必须使用ORACLE_SID。且ORACLE_SID必须与instance_name的值一致,否则,你将会收到一个错误,在winnt平台,是“TNS:协议适配器错误”。
四、数据库域名与全局数据库名
1.概念与联系
使用数据库名(da_name)对一个数据库进行唯一标识,这种表示对于单个数据库是足够的,但是随着由多个数据库构成的分布式数据库的普及,这种命令数 据库的方法给数据库的管理造成一定的负担,因为各个数据库的名字可能一样,造成管理上的混乱。为了解决这种情况,引入了db_domain参数,这样在数 据库的标识是由db_name和db_domain两个参数共同决定的,避免了因为数据库重名而造成管理上的混乱。这类似于互连网上的机器名的管理。我们 将db_name和db_domain两个参数用‘.’连接起来,表示一个数据库,并将该数据库的名称称为global_name,即它扩展了 db_name。db_name参数只能由字母、数字、’_’、’#’、’$’组成,而且最多8个字符。
数据库域名(db_domain):定义一个数据库所在的域,该域的命名同互联网的’域’没有任何关系,只是数据库管理员为了更好的管理分布式数据库而根据实际情况决定的。当然为了管理方便,可以将其等于互联网的域。
全局数据库名(global_name):对一个数据库(Oracle database)的唯一标识,oracle建议用此种方法标识数据库。该值是在创建数据库时决定的,缺省值为db_name. db_domain。在以后对参数文件中db_name与db_domain参数的任何修改不影响global_name的值,如果要修改 Global_name,只能用alter database rename global_name to 命令进行修改,然后修改相应参数。
2.查询数据库域名
方法一:select value from v$parameter where name = 'db_domain';
方法二:show parameter domain
方法三:在参数文件中查询
方法二:show parameter domain
方法三:在参数文件中查询
3.例子
全国交通GIS系统的分布式数据库,其中:
吉林节点: jl.jtgis
吉林长春节点: cc.jl.jtgis
河北节点: hb.jtgis
河北石家庄节点:sjz.hb.jtgis
这些就是数据库域名,数据库域名在存在于参数文件中,她的参数是db_domain.
全局数据库名=数据库名+数据库域名,如前述福建节点的全局数据库名是:orcl.jl.jtgis
吉林节点: jl.jtgis
吉林长春节点: cc.jl.jtgis
河北节点: hb.jtgis
河北石家庄节点:sjz.hb.jtgis
这些就是数据库域名,数据库域名在存在于参数文件中,她的参数是db_domain.
全局数据库名=数据库名+数据库域名,如前述福建节点的全局数据库名是:orcl.jl.jtgis
五、数据库服务名
该参数是oracle8i新引进的。在8i以前,我们用SID来表示数据库的一个实例,但是在Oracle的并行环境中,一个数据库对应多个实例,这样就需要多网络服务名,设置繁琐。为了方便并行环境中的设置,引进了service_name参数。该参数对应一个数据库,而不是一个实例,而且该参数有许多其它的好处。
该参数的缺省值为db_name.db_domain,即等于global_name.如果数据库有域名,则数据库服务名就是全局数据库名;否则,数据库 服务名与数据库名相同。一个数据库可以对应多个service_name,以便实现更灵活的配置。该参数与SID没有直接关系,即 service_name 不必与SID一样。
从Oracle8i开始的oracle网络组件,数据库与客户端连接的主机字符串使用的是数据库服务名。之前用的是SID,即数据库实例名。
该参数是oracle8i新引进的。在8i以前,我们用SID来表示数据库的一个实例,但是在Oracle的并行环境中,一个数据库对应多个实例,这样就需要多网络服务名,设置繁琐。为了方便并行环境中的设置,引进了service_name参数。该参数对应一个数据库,而不是一个实例,而且该参数有许多其它的好处。
该参数的缺省值为db_name.db_domain,即等于global_name.如果数据库有域名,则数据库服务名就是全局数据库名;否则,数据库 服务名与数据库名相同。一个数据库可以对应多个service_name,以便实现更灵活的配置。该参数与SID没有直接关系,即 service_name 不必与SID一样。
从Oracle8i开始的oracle网络组件,数据库与客户端连接的主机字符串使用的是数据库服务名。之前用的是SID,即数据库实例名。
查询数据库服务名
方法一:select value from v$parameter where name = 'service_name';
方法二:show parameter service_name
方法一:select value from v$parameter where name = 'service_name';
方法二:show parameter service_name
六、网络服务名
网络服务名(net_service_name),又可以称为数据库别名(database alias)。是客户端程序访问数据库时所需要,屏蔽了客户端如何连接到服务器端的细节,实现了数据库的位置透明的特性。网络服务名被记录在 tnsnames.ora文件中。
可以通过netmgr来新建网络服务名。
网络服务名是从客户端的角度出发,当客户端连接远程数据库或其他服务时,可以指定网络服务名。因此需要使用一个或多个命名方法将此Net服务名解析为连接数据库或其他服务的连接描述符,看下面:
[本地]——将存储在本地客户机的tnsnames.ora文件中的网络服务名解析为连接描述符。
[Oracle Names]——由Oracle名字服务器提供为网络上的每个Oracle Net服务提供解析方法
[主机名]——通过TCP/IP环境中的主机别名连接到Oracle数据库服务
[Sun NIS]/[DCE CDS]——专用系统用的,在Windows 2000系统环境下不适用
[Oracle Names]——由Oracle名字服务器提供为网络上的每个Oracle Net服务提供解析方法
[主机名]——通过TCP/IP环境中的主机别名连接到Oracle数据库服务
[Sun NIS]/[DCE CDS]——专用系统用的,在Windows 2000系统环境下不适用
TNS简要介绍与应用
Oracle中TNS的完整定义:transparence Network Substrate透明网络底层,监听服务是它重要的一部分,不是全部,不要把TNS当作只是监听器。
Oracle中TNS的完整定义:transparence Network Substrate透明网络底层,监听服务是它重要的一部分,不是全部,不要把TNS当作只是监听器。
TNS是Oracle Net的一部分,专门用来管理和配置Oracle数据库和客户端连接的一个工具,在大多数情况下客户端和数据库要通讯,必须配置TNS,当然在少数情况下,不用配置TNS也可以连接Oracle数据库,比如通过JDBC。如果通过TNS连接Oracle,那么客户端必须安装Oracle client程序。
Oracle当中,如果想访问某个服务器,必须要设置TNS,它不像SQL SERVER那样在客户端自动列举出在局域网内所有的在线服务器,只需在客户端选择需要的服务器,然后使用帐号与密码登录即可。而Oracle不能自动列举出网内的服务器,需要通过读取TNS配置文件才能列出经过配置的服务器名。
配置文件名一般为:tnsnames.ora,默认路径:%ORACLE_HOME%\network\admin\tnsnames.ora
TNS的详细配置文件
TNS的配置文件包括服务器端和客户端两部分。服务器端有listener.ora、sqlnet.ora和tnsnames.ora,如果通过OCM(Oracle Connection Manage)和域名服务管理客户端连接,服务器端可能还包括cman.ora等文件;客户端有tnsnames.ora,sqlnet.ora。Oracle所有的TNS配置文件的默认路径:%ORACLE_HOME%\network\admin
TNS的详细配置文件
TNS的配置文件包括服务器端和客户端两部分。服务器端有listener.ora、sqlnet.ora和tnsnames.ora,如果通过OCM(Oracle Connection Manage)和域名服务管理客户端连接,服务器端可能还包括cman.ora等文件;客户端有tnsnames.ora,sqlnet.ora。Oracle所有的TNS配置文件的默认路径:%ORACLE_HOME%\network\admin
listener.ora:监听器配置文件,成功启动后是驻留在服务器端的一个服务。监听器是用来侦听客户端的连接请求以及建立客户端和服务器端连接通道的一个服务程序。默认情况下Oracle在1521端口上侦听客户端连接请求。
sqlnet.ora:用来管理和约束或限制tns连接的配置,通过在该文件中设置一些参数,可以管理TNS连接。根据参数作用的不同,需要分别在服务器和客户端配置.。
tnsnames.ora:配置客户端到服务器端的连接服务,包括客户端要连接到的服务器和数据库的配置信息。
可以通过Oracle Net Configuretion Assitant配置TNS,也可以手动配置。首先在Oracle服务器端安装完成之后,应该先着手配置LISTENER,LISTENER是进行Oracle通讯的首要组件,紧接着在客户端安装Oracle client,同时配置tnsnames.ora文件。
可以通过Oracle Net Configuretion Assitant配置TNS,也可以手动配置。首先在Oracle服务器端安装完成之后,应该先着手配置LISTENER,LISTENER是进行Oracle通讯的首要组件,紧接着在客户端安装Oracle client,同时配置tnsnames.ora文件。
首先监听器包括两个部分:Oracle要监听的地址、端口、通讯协议;Oracle要监听的数据库实例,非RAC环境下,LISTENER只能监听本服务器的地址和实例,RAC环境下,LISTENER还可以监听远程服务器。每个数据库最少要配置一个监听器。(注:RAC环境,指的是Oracle服务器集群配置的环境)
LISTENER部分配置了Oracle要监听的地址和端口信息;该文件中还会包括SID_LIST_LISTENER部分,这部分配置了Oracle需要监听的实例。(注:在上述截图中并没有SID_LIST_LISTENER这一部分,这是因为Oracle自9i版本引入了动态监听服务注册,在数据库启动时,会自动注册当前数据库实例到监听列表,所以无需配置SID_LIST_LISTENER部分了)
LISTENER部分配置了Oracle要监听的地址和端口信息;该文件中还会包括SID_LIST_LISTENER部分,这部分配置了Oracle需要监听的实例。(注:在上述截图中并没有SID_LIST_LISTENER这一部分,这是因为Oracle自9i版本引入了动态监听服务注册,在数据库启动时,会自动注册当前数据库实例到监听列表,所以无需配置SID_LIST_LISTENER部分了)
HOST参数可以是Oracle服务器主机名称,也可以是相应的IP地址。在一个多IP的服务器上可以配置listener同时监听多个地址,比如下面的配置:LISTENER= (DESCRIPTION= (ADDRESS_LIST= (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.11)(PORT=1521)) (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.2.11) (PORT=1521))) ),或者可以配置多个监听器,分别监听不同的IP地址。
RAC方式
由于Oracle数据库通常需要在不同地方被访问,所以Oracle开发人员必须搞清楚数据库性能如何被网络通讯所影响。由Oracle提供的TNS(Transparent Network Substrate)允许不同数据库之间的分布式通讯。
作为一种分布式协议的TNS,允许远距离的系统之间的透明数据库通讯。TNS成为Oracle逻辑数据请求与远距离服务器的物理通讯之间的“绝 缘体(insulator)”。由此,网络管理人员可以控制很多方面的网络性能优化,这样,Oracle管理人员就极少获得影响整个数据库性能(图A)的 网络设置的控制权。
作为一种分布式协议的TNS,允许远距离的系统之间的透明数据库通讯。TNS成为Oracle逻辑数据请求与远距离服务器的物理通讯之间的“绝 缘体(insulator)”。由此,网络管理人员可以控制很多方面的网络性能优化,这样,Oracle管理人员就极少获得影响整个数据库性能(图A)的 网络设置的控制权。
你可以通过使用一些关键设置来提高分布式处理的性能,这篇文章讨论了一些重要的设置。与分布式通讯相关的init.ora参数,比如tcp.nodelay,能够用于改变Oracle数据库中的信息包传输(packet-shipping)的机制。
本文中我也讨论了sqlnet.ora, tnsnames.ora和protocol.ora文件中的参数。你可以使用这些方法来改变TCP信息包的配置和大小,改变之后的信息包能够对网络透明层产生重要影响,以达到提高整个Oracle交流的目的。
Oracle NET不能允许Oracle管理人员优化Oracle网络参数以提高网络性能。事实上,绝大部分网络通讯都无法在Oracle环境中得到优化。Oracle *Net是位于特定网络协议栈的OSI模型中的一个层。
为了响应一个数据请求,Oracle *Net 获得数据并传递到协议栈。协议栈然后从这一数据建立一个信息包并传递到网络。Oracle *Net的作用是将数据传送到协议栈。
然而,DBA能够控制网络信息包的频率和大小。在Oracle中存在着丰富的可以更改信息包频率和大小的工具。一个简单的例子就是以更低的频率改变传送更大数量快照的时间间隔。
可以使用不同参数来优化不同服务器之间的Oracle *Net.请记住,网络优化是Oracle范围之外的操作,一个合格的网络管理人员应该经得起各种询问。使用一些设置可以影响网络信息包传送的频率和大小,这些设置包含在以下的参数文件。
protocol.ora文件—tcp.nodelay
sqlnet.oraserver 文件—automatic_ipc
sqlnet.oraclient 文件—break_poll_skip
tnsnames.ora文件—SDU, TDU
listener.ora文件—SDU, TDU, 以及queuesize
sqlnet.oraserver 文件—automatic_ipc
sqlnet.oraclient 文件—break_poll_skip
tnsnames.ora文件—SDU, TDU
listener.ora文件—SDU, TDU, 以及queuesize
这些优化参数只影响Oracle *Net层的性能。现在让我们仔细地查看这些参数,以及这些参数如何被调整以提高Oracle *Net.
在缺省的情况下,Oracle *Net在传送数据之前一直等待,直到缓冲区填满。所以请求一般不会立即发送它们的目的地。当大量数据从一端流往另一端时候,这种情况很常见。添加一个 protocol.ora文件,然后指定一个tcp.nodelay停止缓冲溢出延迟,都可以解决这一问题。
protocol.ora文件可以被指定以显示所有TCP/IP执行中的数据。这一参数可用于服务端和客户端。protocol.ora声明为:
tcp.nodelay = yes
指定这一参数使得TCP缓冲被跳过,以致可以立即发送每一个请求。然而请注意,网络通讯量会增大,因为更小的,更快的信息包被传递,所以会导致网络速度的减慢。
tcp.nodelay参数只有在TCP超时产生的时候才被使用。设置tcp.nodelay可以提高数据库服务器之间的大量数据通讯的性能。
sqlnet.ora中的automatic_ipc参数
automatic_ipc参数忽略了网络层,所以加快了数据库的逻辑连接。当automatic_ipc=on,Oracle *Net查看当地数据库是否定义以相同的名称,如果是,网络层将被忽略,因为此时的连接被直接转译为当地的IPC连接。这对于数据库服务器是有用的,但对 于Oracle *Net客户端是没有什么用处。
只有当一个Oracle *Net连接于当地数据库的时候,automatic_ipc参数才有可能使用在数据库服务器上。如果不需要当地连接,将这一参数设置为off,由此可以提高所有Oracle *Net客户端的性能。
tnsnames.ora和listener.ora中的SDU和TDU参数
SDU(session data unit)和TDU(transport date unit)都位于tnsnames.ora and listener.ora文件中。SDU指定信息包的大小以传送到网络。在理想情况下,SDU不会超过MTU(maximum transmission unit)的大小。MTU是一个固定值,它取决于使用的实际网络操作。Oracle建议SDU设置相同于MTU.
注意
在7.3.3之前,SDU和TDU都固定于2K而且不能改变。
TDU是使用于Oracle *Net分组数据的缺省信息包。在理想情况下,TDU参数应该是SDU参数的倍数。SDU和TDU的缺省值为2,048,最大值都为32,767字节。
虽然在Oracle的立场上,总是建议客户能够更好地规划自己的应用,在有其它负载平衡方法的时候,尽量不要依赖于Oracle的Load Balance方法,但是往往在给客户配置完Oracle RAC数据库以后,客户都会要求要测试负载平衡(Load Balance)和TAF(Transparent Application Failover),并且将这两个测试作为RAC是否安装成功的标准。
这是一件很无奈的事情,像把旁枝末节看作了主要功能,甚至有些买椟还珠的感觉,但是毕竟这是客户,更了解Oracle Load Balance(后文用LB表示),才可以更好满足客户需求。
本文不牵涉TAF(可以参看老熊关于TAF的系列文章PartI,PartII,PartIII),如何在Oracle10g之后版本中在服务器端service层面设置TAF,可以参看Metalink Note:404644.1。
对于LB,在Oracle10g之前有Client端和Server端两种,在Oracle10g之后又推出了Server端Service层面的LB配置,本文也不涉及Service层面的LB。
在Oracle9i,10g,11g版本中都适用的LB配置分为以下两种。
(1) Client Side Connect Time Load Balance
(2) Server SideListenerConnection Load Balance (此处的Listener用以跟10g之后的Server Side Service Load Balance区分开)
(2) Server SideListenerConnection Load Balance (此处的Listener用以跟10g之后的Server Side Service Load Balance区分开)
1. Client Side Connect Time Load Balance
既然是Client端的LB,那么也就是不需要在数据库服务器端配置任何参数,完全由客户端机器上的tnsnames.ora文件中对于TNS的配置来决定,实际上也就是LOAD_BALANCE参数。
既然是Client端的LB,那么也就是不需要在数据库服务器端配置任何参数,完全由客户端机器上的tnsnames.ora文件中对于TNS的配置来决定,实际上也就是LOAD_BALANCE参数。
看一个例子,下面这样的TNS配置就是启用了客户端的LB。
CLIENT_LOADBALANCE =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = node1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = node2-vip)(PORT = 1521))
(LOAD_BALANCE = yes)
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = rac_lb)
)
)
(LOAD_BALANCE = yes)指示SQLNet随机选择ADDRESS_LIST列表中的任意一个监听,将客户端请求发送到此监听上,通过这种方法来实现负载平衡。如果 (LOAD_BALANCE = no)那么将会按照ADDRESS_LIST列表中的顺序选择监听,只要这个监听能够正常连接那么就使用该监听。
因此在某些负载平衡的解决方案中会使用(LOAD_BALANCE = no)但是在多个客户端或者应用服务器端配置顺序不同的ADDRESS_LIST,以此来实现人为的负载平衡。
如果在TNS配置时使用的是ADDRESS_LIST语法,那么必须显示设置LOAD_BALANCE = yes,默认值LOAD_BALANCE = no。
2. Server Side Listener Connection Load Balance
要 实现server side load balance要求监听能够知道在整个RAC环境中的各节点负载情况,节点负载情况是由PMON进程来定期更新的,而要让PMON进程能够通知其它节点自 己节点的负载情况则需要设置数据库初始化参数REMOTE_LISTENER。
要 实现server side load balance要求监听能够知道在整个RAC环境中的各节点负载情况,节点负载情况是由PMON进程来定期更新的,而要让PMON进程能够通知其它节点自 己节点的负载情况则需要设置数据库初始化参数REMOTE_LISTENER。
在RAC数据库服务器端的每个节点上的tnsnames.ora文件中设置如下的TNS名称。
LISTENERS_RAC =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST=node1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST=node2-vip)(PORT = 1521))
)
)
然后设置REMOTE_LISTENER参数值为LISTENERS_RAC。
sql>ALTERsystemSETREMOTE_LISTENER='LISTENERS_RAC'scope=BOTH;
当某个实例的监听收到客户端连接请求,将会统筹考虑RAC环境中各个节点的负载情况,然后将该连接传递到具有最小负载的节点的最小负载实例上。
在10gR2版本之后,节点和实例的负载计算通过lbscore来完成,而lbscore则由两个动态值决定:”goodness” 和 “delta”,这两个值均由PMON来定期更新,计算公式如下:
Lbscore = Goodness (Received from PMON update)
Delta = New Delta (Received from PMON update)
在PMON定期更新的间隔,如果有新连接进入,那么lbscore的计算公式是:
Lbscore = Lbscore(previous) + Listener Delta
Lbscore = Goodness (Received from PMON update)
Delta = New Delta (Received from PMON update)
在PMON定期更新的间隔,如果有新连接进入,那么lbscore的计算公式是:
Lbscore = Lbscore(previous) + Listener Delta
可以通过添加监听的trace(TRACE_LEVEL_LISTENER = 16)来获取lbscore的产生情况,更详细的文档请参看Metalink Note: 263599.1。
关于Failover,多说一句,其实Failover也有两种,一种是Connect Time Failover,由客户端TNS配置的(failover=on)参数控制,另外一种是TAF,由客户端TNS配置中的failover_mode参数控制。
另外,请参考一位大神的博客,关于oracle专家级别的讲解。很详细
http://blog.csdn.net/leshami/article/details/6791667