Oracle实例的私有网络
Oracle实例的心跳网络使用方式的优先级从高到低如下:
(1) 如果使用了第三方集群的IPC,替换了对应$ORACLE_HOME/lib/libskgxnX.so文件,那么数据库实例的cache fusion会使用对应的网络协议,而忽略ocr中和数据库初始化参数中cluster_interconnects的配置,下面的例子当中就使用了 VCSIPC,可以从对应的alert log中验证:
- db_name = r10g
- open_cursors = 300
- pga_aggregate_target = 1237319680
- Fri Mar 13 14:00:35 2009
- Oracle instance running with ODM: Veritas 6.0 ODM Library, Version 1.1
- cluster interconnect IPC version:
- VERITAS IPC 5.1.0.0 15:16:24 Feb 12 2009
- IPC Vendor 86 proto 76
- Version 1.0
- PMON started with pid=2, OS id=4399196
- DIAG started with pid=3, OS id=3936288
(2) 如果没有使用第三方IPC,则优先使用数据库初始化参数的cluster_interconnects配置,这个参数的格式为if1:if2:...:ifn,可以不同于crs的私有网络,需要注意的是,该参数不支持多个网卡的故障切换;
(3) 没有上面两个配置,数据库会使用oifcfg列出的心跳的网络,在对应的告警日志中可以得到:
- Interface type 1 en6 192.168.61.0 configured from OCR for use as a cluster interconnect
- Interface type 1 en0 10.182.0.0 configured from OCR for use as a public interface
- . . . .
- Cluster communication is configured to use the following interface(s) for this instance
- 192.168.61.0
(4) 没有1和2的配置,并且oifcfg也没有配置cluster_interconnect,则数据库会使用共有网络进行心跳信息的传输,这种配置其实是配置失败的情况,数据库虽然能够启动,但急需DBA修正,在告警日志中可以看到:
- WARNING: No cluster interconnect has been specified. Depending on
- the communication driver configured Oracle cluster traffic
- may be directed to the public interface of this machine.
- Oracle recommends that RAC clustered databases be configured
- with a private interconnect for enhanced security and
- performance.
对于一个已经有的系统,可以用下面几种方法确认数据库实例的心跳配置,包括网卡名称,IP地址,使用的网络协议:
(1) 最简单的方法:可以在数据库的后台报警日志中得到。具体参见上面列出的告警日志;
(2) 使用oradebug ;
- SQL> oradebug setmypid
- SQL> oradebug ipc
- SQL> oradebug tracefile_name
找到对应trace文件的这一行:socket no 10 IP 10.0.0.1 UDP 49197
(3) 从数据字典中得到(V$CLUSTER_INTERCONNECTS 和 V$CONFIGURED_INTERCONNECTS),或查询x$ksxpia
- SQL> SELECT * FROM V$CLUSTER_INTERCONNECTS; ----Oracle 11g 开始支持此试图
- NAME IP_ADDRESS IS_ SOURCE
- ------------------------------ ---------------- --- -------------------------------
- en3 192.168.2.31 NO Oracle Cluster Repository
- en5 192.168.3.231 NO Oracle Cluster Repository
- SQL> SELECT * FROM V$CONFIGURED_INTERCONNECTS;
- NAME IP_ADDRESS IS_ SOURCE
- ------------------------------ ---------------- --- -------------------------------
- en3 192.168.2.31 NO Oracle Cluster Repository
- en5 192.168.3.231 NO Oracle Cluster Repository
- en0 10.200.59.231 YES Oracle Cluster Repository
- SQL> select * from x$ksxpia ;
- ADDR INDX INST_ID PUB_KSXPIA PICKED_KSXPIA NAME_KSXPIA IP_KSXPIA
- ---------------- ---------- ---------- ---------- --------------- --------------- ----------------
- 00000001104AAF28 0 1 N OCR en6 192.168.61.121
- 00000001104AAF28 1 1 Y OCR en0 10.182.6.211
为了避免心跳网络成为系统的单一故障点,简单地我们可以使用操作系统绑定的网卡来作为Oracle的心跳网络,以AIX为例,我们可以使用etherchannel技术,假设系统中有ent0/1/2/3四块网卡,我们绑定2和3作为心跳:
- #mkdev -c adapter -s pseudo -t ibm_ech -a adapter_names='ent2,ent3' ## 将生成网卡设备ent4
- #/usr/lib/methods/defif
- #lsdev -Cc adapter | grep ent
- #lsattr -El ent4
- #ifconfig en4 inet 192.168.3.231 netmask 255.255.255.0 up
- 在Solaris上可以使用dladm来创建链路聚合:
- # dladm create-aggr -d bge2 -d bge3 1
- # ifconfig aggr1 plumb 192.168.3.231 netmask 255.255.255.0 up
- # dladm show-aggr
- # ifconfig -a
同样在HPUX和Linux对应的技术分别叫APA和bonding。
UDP私有网络的调优
当使用UDP作为数据库实例间cashe fusion的通信协议时,在操作系统上需要调整相关参数,以提高UDP传输效率,并在较大数据时避免出现超出OS限制的错误:
(1) UDP数据包发送缓冲区:大小通常设置要大于(db_block_size * db_multiblock_read_count )+4k,
(2) UDP数据包接收缓冲区:大小通常设置10倍发送缓冲区;
(3) UDP缓冲区最大值:设置尽量大(通常大于2M)并一定要大于前两个值;
各个平台对应查看和修改命令如下:
Solaris 查看
- ndd /dev/udp udp_xmit_hiwat udp_recv_hiwat udp_max_buf ;
- 修改 ndd -set /dev/udp udp_xmit_hiwat 262144
- ndd -set /dev/udp udp_recv_hiwat 262144
- ndd -set /dev/udp udp_max_buf 2621440
AIX 查看
- no -a |egrep “udp_|tcp_|sb_max”
- 修改 no -p -o udp_sendspace=262144
- no -p -o udp_recvspace=1310720
- no -p -o tcp_sendspace=262144
- no -p -o tcp_recvspace=262144
- no -p -o sb_max=2621440
Linux 查看
- 文件/etc/sysctl.conf
- 修改 sysctl -w net.core.rmem_max=2621440
- sysctl -w net.core.wmem_max=2621440
- sysctl -w net.core.rmem_default=262144
- sysctl -w net.core.wmem_default=262144
HP-UX 不需要
HP TRU64 查看 /sbin/sysconfig -q udp
修改: 编辑文件/etc/sysconfigtab
inet: udp_recvspace = 65536
udp_sendspace = 65536
Windows 不需要
常见安装、管理错误
1. 安装CRS失败,或执行root.sh报错,可能原因:
(1) 节点间的时间不同步,解决方法:使用ntp服务
(2) Linux下启用了默认的防火墙,导致执行root.sh报错:
Failure at final check of Oracle CRS stack.
10
解决方法:禁用iptables ,注释/etc/pam.d/other ;
- # service iptables stop; # chkconfig iptables off.
(3) 裸设备的权限问题,可能因为操作系统重新启动后权限发生变化。(RHEL4)
解决方法: 把 chown oracle:dba /dev/raw/raw* 命令加入到/etc/rc.local中,每次开机自动执行
或者修改文件/etc/udev/permissions.d/50-udev.permissions
第113行raw/*:root:disk:0660 改成 raw/*:oracle:dba:0660
(4) Solaris使用了包括cylinder 0的磁盘分区来存储OCR或者vote disk。
解决办法:相关分区不应该包括cylinder 0,可以从1开始。
(5) 使用的公网IP地址不可路由,
解决方法:添加相关网关
(6) 在/etc/hosts 中没有loopback地址,即127.0.0.1 localhost
(7) 主机名含有大些字母、减号或者下划线等特殊字符;
(8) HPUX中oracle不要使用gnu的bash,修改使用默认shell;
(9) 检查操作系统、第三方集群是否是oracle官方支持的,是否需要补丁,比如在AIX5.3+HACMP上安装
Oracle 10g/11g RAC,oslevel就需要06及以上;
(10) AIX平台,需要将共享设备的reserve_policy (reserve_lock) 属性修改为no_reserve(no);
(11) 所有节点看到的OCR和vote设备的路径名应该一致,如果不一致,可以用软连接解决;
(12) 心跳设备问题或者ocr/votedisk 访问问题,unix/linux查看有无/tmp/crsctl.*文件,得到错误信息;
(13) 在CRS旧的安装的环境中重新安装失败
解决方法: dd清除ocr和vote disk,并使用下面语句清理旧的crs配置文件
- rm -rf /usr/tmp/.oracle /var/tmp/.oracle /tmp/.oracle /etc/oracle/* /var/opt/oracle/*
- rm -rf /etc/init.cssd /etc/init.crs* /etc/init.evmd /etc/init.d/init.cssd /etc/init.d/init.crs
- rm -rf /etc/init.d/init.crsd /etc/init.d/init.evmd /etc/rc3.d/K96init.crs /etc/rc3.d/S96init.crs
- rm -rf /etc/rc.d/rc2.d/K96init.crs /etc/rc.d/rc2.d/S96init.crs
2 客户端有时候报错:
ORA-12545: Connect failed because target host or object does not exist
ORA-12545: 因目标主机或对象不存在, 连接失败
解决方法:设置local_listener初始化参数
3 如果选择节点界面出不来。
(1)HACMP环境中需要检查oracle 用户必须在 hagsuser组里.
(2)如果是hacmp5.4,需要打Oracle补丁6718715;
(3)可以使用集群配置文件cluster CONFIGURATION FILE ,内容模板如下:
- MyCluster
- rac01 rac01-priv rac01-vip
- rac02 rac02-priv rac02-vip
- rac03 rac03-priv rac03-vip
- rac04 rac04-priv rac04-vip
4. AIX上数据库启动报错
- ora-27504 IPC error creating OSD context
- ora-27300 OS system dependent operation:sendmsg failed with status:59
- ora-27301 OS failure message:Message too long
- ora-27302 failure occurred at:sskgxpsnd1
原因:没有设置网络参数udp_recvspace/udp_sendspace
5. Windows平台,ORA-600 [kccsbck_first]
解决方法:关闭Media Sense(媒体感知)
6. 系统循环重启:
可能是CRS导致,如果因为crs,首先设置 crsctl disable crs 来禁止oracle crs的自动启动。
查看OS、crsd和cssd的对应日志,看/tmp/下是否有crs文件 (ls -lrt /tmp/crsctl*),确定crs失败原因。
7. 第二个节点的数据实例无法mount,挂起或者报错,
原因1:使用了vendor clusterware ,libskgxn2.so文件链接错误,
解决方法:比较两个节点的ORACLE_HOME/lib/libskgxn2和CRS_HOME/lib/libskgxn2*都是否相同,
如果不同需要重新link
原因2:任何平台Oracle 9i,没有设置网络参数udp参数
导致udp_sendspace或者udp_recvspace小于 db_block_size * db_file_multiblock_read_count
解决方法:设置对应参数,如AIX上设置udp_recvspace = 65536 udp_sendspace = 65536
原因3:AIX/HACMP/Oracle9i,在hacmp中定义了service IP
解决方法:在初始化参数中定义cluster_interconnects
原因4:任何平台,设置了错误的cluster_interconnects
解决方法:检查并纠正此参数,
8. 建库时不能识别裸设备;
原因1:Oracle,10.2.0.3 ,很多平台(比如aix和linux)有rawutl相关bug,
解决办法:还原10.2.0.1中的rawutl工具,该程序在 $ORACLE_HOME/bin目录中。
原因2:Oracle9i,AIX平台,需要设置环境变量export PGSD_SUBSYS=grpsvcs
9. evm资源自动报错oac_init:2: Could not connect to server, clsc retcode = 9
解决方法:关闭 “UDP ICMP rejections”
- /etc/rc.d/init.d/iptables stop ;chkconfig iptables off
转载于:https://blog.51cto.com/ccchencheng/740558