如何在 oracle 集群环境下修改私网信息
文档内容
适用于:
Oracle Database - Enterprise Edition - 版本 10.1.0.2 到 12.2.0.1 [发行版 10.1 到 12.2] 本文档所含信息适用于所有平台
目标
本文的目的是描述如何在 oracle 集群环境中更改或更新私有网络(cluster_interconnect)信息。 有时我们需要更改或更新网卡的名字,或者更改网卡的子网掩码,再或者更改当时原始安装时就输入了不正确的信息,也许还有其它的原因,oifcfg 工具当时没有成功的安装。 请参考文档:Note 276434.1 for modifying public network and VIP associated information 和文档: Note 1386709.1 for basics of IPv4 subnet and Oracle Clusterware。
提示:对于 oracle Engineered system(Exadata)和 oracle Applicance(ODA)不适用本文档。
解决方案
Oracle 集群中的网络信息(接口,子网及每个网卡的角色)都可以被’oifcfg’ 命令管理, 但是没有网卡的IP地址除外,oifcfg 命令不能修改IP地址信息. ‘oifcfg getif’ 命令可以用来显示OCR中当前网卡的配置信息:
% $CRS_HOME/bin/oifcfg getif eth0 10.2.156.0 global public eth1 192.168.0.0 global cluster_interconnect
在 Unix/Linux 系统中,网卡名字是被系统自动分配的,依据系统平台的不同而不同。对于 windows 系统,请参考下面的附带的文档. 上面的例子显示当前网卡 eth0 被用作公网并且子网为 10.2.156.0 eth1 被用作集群私网,子网为192.168.0.0。 ‘公有’ 网络是服务器与客户端之间的通信(与 VIP 使用相同的网段并以不同的记录存储在 OCR 中),与之对应的’cluster_interconnect’网络是用来在 RDBMS/ASM 节点间缓存融合。从 11gR2 开始,cluster_interconnect 同时被用作集群间的心跳,相对于 11gR2 以前的版本,当配置集群心跳信息时指定主机名而言,这是一个标志性的改变。 如果私有网卡的子网或接口名字配置不正确,我们需要使用 crs/grid 用户来更改。
例1: 更改私有主机名
在 11.2 oracle clusterware 之前的版本,私有主机名被记录在 OCR 中, 它不能被更改,一般情况下私有主机名是不需要改变的,它附属的 ip 可以被更改,只有使用删除/添加节点或重新安装 oracle clusterware 来更改私有主机名。
在 11.2 Grid 结构中,私有主机名不在记录在 OCR 中,并且不存在依赖关系,所以它可以在 /etc/hosts 文件中任意更改。
例2:只更改私有 ip 地址不更改网卡、子网及子网掩码信息
举例,私有 ip 地址从 192.168.1.10 更改至 192.168.1.21,网卡名字及子网保持不变。或者只改变MAC地址,保持private IP address/interface name/subnet/network不变
只要关闭需要更改主机上的 oracle clusterware 软件,在操作系统层,根据需求更改私有 ip 地址或者MAC地址(如:/etc/hosts,OS network config 等等), 再重启启动 oracle clusterware 软件即可。
例3:只改变私有网络的 MTU 值
举例, 将私有网络 MTU 值从1500更改至9000(激活 jumbo frame),网卡名字保持不变。
1. 关闭集群中的所有节点。 2. 在操作系统层更改 MTU 需要设定的值,确保更改后 MTU 值的私有网卡可用并且可以 ping 通集群中的所有节点。 3. 重启所有节点的集群管理软件。
例4:更改私有网卡名字,子网及掩码
提示:当子网掩码被更改,但是子网标识没有改变时,如: 子网掩码从 255.255.0.0 更改至 255.255.255.0,私网 ip 为 192.168.0.x,子网标识保持不变 192.168.0.0,网卡名字没有改变.关闭所有需要更改的主机 oracle clusterware,在操作系统层修改私有网络IP地址(如:操作系统 网络配置等等)。并重启集群中所有节点,请注意,这种更改是不能采用轮转方式(rolling manaer)完成的。
当子网掩码被改变,附属的子网标识也经常会被改变,oracle 在 OCR 中只存储网卡名字及子网标识的信息,而不存储子网掩码。可以使用 oifcfg 命令完成这样的变更,oifcfg 命令只需在集群中的一个节点执行,而不是所有节点。
A. 对于 11gR2 以前的集群管理软件
1. 使用 oifcfg 命令添加新的私有网络信息,删除旧的私有网络信息:
% $ORA_CRS_HOME/bin/oifcfg/oifcfg setif -global <if_name>/<subnet>:cluster_interconnect % $ORA_CRS_HOME/bin/oifcfg/oifcfg delif -global <if_name>[/<subnet>]] 举例: % $ORA_CRS_HOME/bin/oifcfg setif -global eth3/192.168.2.0:cluster_interconnect % $ORA_CRS_HOME/bin/oifcfg delif -global eth1/192.168.1.0 校验结果 % $ORA_CRS_HOME/bin/oifcfg getif eth0 10.2.166.0 global public eth3 192.168.2.0 global cluster_interconnect
2. 关闭 Oracle Clusterware
使用 root 用户执行: # crsctl stop crs
3. 在操作系统层面更改网络配置,修改集群内所有节点的 /etc/hosts 文件,确保集群内所有节点新的网络设置都已生效:
% ping <private hostname/IP> % ifconfig -a on Unix/Linux 或 % ipconfig /all on windows
4. 重新启动 Oracle Clusterware
以 root 用户:# crsctl start crs
提示:如果在 linux 系统上正在运行 OCFS2,则可能还需要更改 OCFS2 运行在其它节点的私有 ip 地址. 更多详细的信息,请参考: Note 604958.1。
B. 对于 11gR2 和 12c 上没有使用 flex ASM 的版本
针对于 11.2 的结构,私有网络配置信息不但保存在 OCR 中,而且还保存在 gpnp 属性文件中。如果私有网络不可用或定义错误,则 CRSD 进程将无法启动,任何随后对于 OCR 的改变都是不可能完成的,因此需要注意当对私有网络的配置信息进行修改,正确的改变顺序是非常重要的。同时请注意,手动修改 gpnp 属性文件是不支持的。
在对集群中所有节点操作之前,请先备份 profile.xml 配置文件。作为 grid 用户执行: $ cd $GRID_HOME/gpnp/<hostname>/profiles/peer/ $ cp -p profile.xml profile.xml.bk
1. 确保集群中的所有节点都已启动并正常运行 2. 使用 grid 用户:
获取下面信息, 例如:
$ oifcfg getif eth1 100.17.10.0 global public eth0 192.168.0.0 global cluster_interconnect
加入新的集群私网通讯信息:
$ oifcfg setif -global <interface>/<subnet>:cluster_interconnect 例如: a. 加入新的并有相同子网的接口卡 bond0 $ oifcfg setif -global bond0/192.168.0.0:cluster_interconnect b. add a new subnet with the same interface name but different subnet or new interface name $ 添加一个新的子网具有相同网卡的名称但不同的子网或新的网卡名 或 $ oifcfg setif -global eth3/192.168.1.96:cluster_interconnect
1. 如果网卡不可用,需要使用 –global 选项来完成,而不能使用 –node 选项,它将导致节点被驱逐。 2. 如果网卡在服务器上可用,则可以使用下面命令识别子网地址: $ oifcfg iflist 它列出了网卡及子网地址,即使 oracle 集群没有启动,此命令也可以被执行。请注意,子网掩码有可能不是 x.y.z.0 的格式,它可以是 x.y.z.24,x.y.z.64 或 x.y.z.128 等格式。如: $ oifcfg iflist lan1 18.1.2.0 lan2 10.2.3.64 << 这是一个私有网络子网地址附属的私有网络 ip 地址为 10.2.3.86 3. 如果需要添加第二个私有网络,而不是替换现有的私有网络,则需要保证两个网卡的 MTU 值相同,否则实例将无法启动并报如下错误信息: ORA-27504: IPC error creating OSD context ORA-27300: OS system dependent operation:if MTU failed with status: 0 ORA-27301: OS failure message: Error 0 ORA-27302: failure occurred at: skgxpcini2 ORA-27303: additional information: requested interface lan1:801 has a different MTU (1500) than lan3:801 (9000), which is not supported. Check output from ifconfig command 4. 对于 11gR2 或更高版本, 不建议在 ASM 或 database 的 spfile 或 pfile 中设置 cluster interconnects 参数。无论什么原因如果设置了该参数,则需要在集群关闭之前需将新的私网 ip 地址设置在 spfile 或 pfile 中,否则它会由于私网信息不匹配而导致重启失败。
校验更改后的值:
$ oifcfg getif
3. 使用 root 用户关闭集群中所有的节点并禁用集群:
# crsctl stop crs # crsctl disable crs
4. 使网络配置信息都已在 OS 层更改完成,确保更改完成后新的接口在所有的节点都可用有效:
$ ifconfig -a $ ping <private hostname>
5. 使用 root 用户激活 oracle 集群并重新启动集群中的所有节点:
# crsctl enable crs # crsctl start crs
6. 如果需要去除旧接口卡信息:
$ oifcfg delif -global <if_name>[/<subnet>] 例如: $ oifcfg delif -global eth0/192.168.0.0
C. 对于 12C flex ASM 结构
请检查上面部分B,并关注提示部分,按下面命令做备份:
在对集群中所有节点操作之前,请先备份 profile.xml 配置文件。 作为 grid 用户执行: $ cd $GRID_HOME/gpnp/<hostname>/profiles/peer/ $ cp -p profile.xml profile.xml.bk
1. 确保 oracle 集群中的所有节点都已正常运行。
2. 使用 grid 用户:
得到现有信息,如下:
$ oifcfg getif eth1 100.17.10.0 global public eth0 192.168.0.0 global cluster_interconnect,asm
上面例子显示网卡 ech0 被用作集群私网和 ASM 网络。
加入新的集群私网信息:
$ oifcfg setif -global <interface>/<subnet>:cluster_interconnect[,asm]
如: a. 加入一个新的具有相同子网网卡 bond0 $ oifcfg setif -global bond0/192.168.0.0:cluster_interconnect,asm
b. 加入一个新的并具有相同网卡名字的子网,或不同子网和具有新的接口名字 $ oifcfg setif -global eth0/192.68.10.0:cluster_interconnect,asm 或 $ oifcfg setif -global eth3/192.168.1.96:cluster_interconnect,asm
如果有不同的网络用于私有网络和 ASM 网络,则可以对其进行相应的调整。
3. 当 ASMLISTENER 正被用作私有网络,如果对其修改则会影响 ASMLISTENER。需要添加一个新的 ASMLISTENER 及新的网络配置。如果 ASM 的子网网络没有改变则跳过这一步。
3.1. 加入一个新的 ASMLISTENE(例:ASMNEWLISNR_ASM)及新的子网,使用 grid 用户:
$ srvctl add listener -asmlistener -l <new ASM LISTENER NAME> -subnet <new subnet>
如: $ srvctl add listener -asmlistener -l ASMNEWLSNR_ASM -subnet 192.168.10.0
3.2. 删除现有的 ASMLISTENER(这个例子中 ASMLSNR_ASM)并去除依赖关系,使用 grid 用户:
$ srvctl update listener -listener ASMLSNR_ASM -asm -remove -force $ lsnrctl stop ASMLSNR_ASM
注意. 需要使用 –force 选项,否则会出现下面错误:
$ srvctl update listener -listener ASMLSNR_ASM -asm -remove PRCR-1025 : Resource ora.ASMLSNR_ASM.lsnr is still running $ srvctl stop listener -l ASMLSNR_ASM PRCR-1065 : Failed to stop resource ora.ASMLSNR_ASM.lsnr CRS-2529: Unable to act on 'ora.ASMLSNR_ASM.lsnr' because that would require stopping or relocating 'ora.asm', but the force option was not specified
3.3 校验配置信息:
$ srvctl config listener -asmlistener $ srvctl config asm
4. 使用 root 用户关闭集群中的所有节点并禁用集群:
# crsctl stop crs # crsctl disable crs
5. 在操作系统层面更改网络配置,更改之后,确保所有节点上的新网卡生效:
$ ifconfig -a $ ping <private hostname>
6. 使用 root 用户激活 oracle 集群并重新启动集群中的所有节点:
# crsctl enable crs # crsctl start crs
7. 删除旧的网卡信息:
$ oifcfg delif -global <if_name>[/<subnet>] 如: $ oifcfg delif -global eth0/192.168.0.0
关于 11gR2 的一些注意事项
1. 如果底层网络配置已经更改, 但是 oifcfg 尚未执行同样的变更,则重启 oracle 集群会导致 crsd 进程不能启动。 crsd.log 日志将会显示如下:
2010-01-30 09:22:47.234: [ default][2926461424] CRS Daemon Starting .. 2010-01-30 09:22:47.273: [ GPnP][2926461424]clsgpnp_Init: [at clsgpnp0.c:837] GPnP client pid=7153, tl=3, f=0 2010-01-30 09:22:47.282: [ OCRAPI][2926461424]clsu_get_private_ip_addresses: no ip addresses found. 2010-01-30 09:22:47.282: [GIPCXCPT][2926461424] gipcShutdownF: skipping shutdown, count 2, from [ clsinet.c : 1732], ret gipcretSuccess (0) 2010-01-30 09:22:47.283: [GIPCXCPT][2926461424] gipcShutdownF: skipping shutdown, count 1, from [ clsgpnp0.c : 1021], ret gipcretSuccess (0) [ OCRAPI][2926461424]a_init_clsss: failed to call clsu_get_private_ip_addr (7) 2010-01-30 09:22:47.285: [ OCRAPI][2926461424]a_init:13!: Clusterware init unsuccessful : [44] 2010-01-30 09:22:47.285: [ CRSOCR][2926461424] OCR context init failure. Error: PROC-44: Error in network address and interface operations Network address and interface operations error [7] 2010-01-30 09:22:47.285: [ CRSD][2926461424][PANIC] CRSD exiting: Could not init OCR, code: 44 2010-01-30 09:22:47.285: [ CRSD][2926461424] Done.
以上错误显示操作系统层面的设置(oifcfg iflist)与 gpnp profile.xml 配置文件设置不匹配。 解决方法:恢复操作系统网络配置到最初的状态,启动 oracle 集群,然后再按照上面的步骤重新更改。 如果底层的网络并没有改变,但 oifcfg 已经被设置了一个错误的子网地址或接口名字,则会发生同样的问题。 2. 如果集群中的任何一个节点关闭,oifcfg 命令将会失败并显示错误:
$ oifcfg setif -global bond0/192.168.0.0:cluster_interconnect PRIF-26: Error in update the profiles in the cluster
解决方案:启动 oracle 集群中没有运行的节点,确保集群中所有的节点都已启动,如果由于操作系统原因不能启动的节点,请先将此节点从集群中删除在执行私网网络变更。 3. 如果执行上面命令的的用户非 GI 的拥有者,则会出现相同的错误:
$ oifcfg setif -global bond0/192.168.0.0:cluster_interconnect PRIF-26: Error in update the profiles in the cluster
解决方案:确保使用 GI 的拥有者登录并执行上面命令。 4. 从 11.2.0.2 开始,如果在没有加入一个新私有网卡,就试图删除最后一个私有网卡(集群私网)则会发生下面错误:
PRIF-31: Failed to delete the specified network interface because it is the last private interface
解决方案:在删除旧的私有网卡之前,先加入新的私有网卡。 5. 如果主机节点的 oracle 集群关闭在关闭状态,则会报下面错误:
$ oifcfg getif PRIF-10: failed to initialize the cluster registry
解决方案:启动该主机节点上的 oracle 集群软件。
关于 Windows 系统注意事项
更改网卡的语法在 windows/RAC 和Unix/Linux 集群是一样的,但是网卡名称会略有不同,在 windows 系统上,默认分配给接口通常的名称为:
Local Area Connection Local Area Connection 1 Local Area Connection 2
如果使用一个网卡名称含有空格,则名称必须使用引号括起来,同时,请注意这是区分大小写的。例如,在 windows上,设置集群私网链接:
C:oracleproduct10.2.0crsbinoifcfg setif -global "Local Area Connection 1"/192.168.1.0:cluster_interconnect
然而,在 windows 上重新命名网卡按最佳实践更有意义,如重命名为”ocwpublic” 和”ocwprivate”。如果 oracle 集群安装完成后需要更改网卡名字,则需要运行”oifcfg”命令来添加新的网卡并删除旧的。综上所述。
您可以运行下面命令查看每个节点上可用的网卡名字。
oifcfg iflist -p -n
必须在每个节点上运行这个命令来验证网卡名称相同的定义。
使用 oifcfg 命令更改网卡名字的影响
对于私网网卡,数据库将使用存储在 OCR 中定义为集群互联的网卡作为节点间缓存融合通信。在告警日志开始的时候,就会显示集群互联有效的信息。在参数清单。例如:
For pre 11.2.0.2: Cluster communication is configured to use the following interface(s) for this instance 192.168.1.1 For 11.2.0.2 : (HAIP address will show in alert log instead of private IP) Cluster communication is configured to use the following interface(s) for this instance 169.254.86.97
如果上面信息不正确,则实例需要重启以便 OCR 条目修正,这同样适用于 ASM 实例和数据库实例。在 windows 系统上,实例被关闭后,在 OCR 将被重读之前,还需要停止/启动 OracleService < SID >(或 OracleASMService < ASMSID > 。
Oifcfg 命令用法
查看 oifcfg 命令的全部选项,只需输入:
$ <CRS_HOME>/bin/oifcfg
例5 对于 11gR2 或以上版本的 HAIP 添加或删除集群私网
1. 添加另外的私有网络到现有的使用 HAIP 的集群中,作为 grid 用户执行:
$ oifcfg setif -global <interface>/<subnet>:cluster_interconnect
例如:
$ oifcfg setif -global enp0s8/192.168.57.0:cluster_interconnect
关闭 CRS 中的所有节点,通过重新启动 crs 中的所有节点,来使 HAIP 读入新的接口,不能使用滚动方式重启。
2. 在使用 HAIP 的集群中删除私有网络,作为 grid 用户执行:
$ oifcfg delif -global <if_name>
例如: $ oifcfg delif -global enp0s8
HAIP 将切换至其它可用接口,在接口被删除后,集群/数据库会继续采用此方式运行。
删除多余的 HAIP 接口,应关闭 CRS 所有节点,然后重启 CRS 所有节点。不能采用以滚动的方式重新启动 CRS。
注意:本文内容太多,公众号有字数限制,全文可点击文末的阅读原文,谢谢大家的理解。Oracle培训和认证记得找小麦苗哟。
About Me:小麦苗
● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用
● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/
● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解
● 版权所有,欢迎分享本文,转载请保留出处
● 题目解答若有不当之处,还望各位朋友批评指正,共同进步