Oracle实例的私有网络

Oracle实例的心跳网络使用方式的优先级从高到低如下:

(1) 如果使用了第三方集群的IPC,替换了对应$ORACLE_HOME/lib/libskgxnX.so文件,那么数据库实例的cache fusion会使用对应的网络协议,而忽略ocr中和数据库初始化参数中cluster_interconnects的配置,下面的例子当中就使用了 VCSIPC,可以从对应的alert log中验证:

 

 
  
  1. db_name = r10g  
  2. open_cursors = 300  
  3. pga_aggregate_target = 1237319680  
  4. Fri Mar 13 14:00:35 2009  
  5. Oracle instance running with ODM: Veritas 6.0 ODM Library, Version 1.1  
  6. cluster interconnect IPC version:  
  7. VERITAS IPC 5.1.0.0 15:16:24 Feb 12 2009  
  8. IPC Vendor 86 proto 76  
  9. Version 1.0  
  10. PMON started with pid=2, OS id=4399196  
  11. DIAG started with pid=3, OS id=3936288 

 

(2) 如果没有使用第三方IPC,则优先使用数据库初始化参数的cluster_interconnects配置,这个参数的格式为if1:if2:...:ifn,可以不同于crs的私有网络,需要注意的是,该参数不支持多个网卡的故障切换;

(3) 没有上面两个配置,数据库会使用oifcfg列出的心跳的网络,在对应的告警日志中可以得到:

 

 
  
  1. Interface type 1 en6 192.168.61.0 configured from OCR for use as a cluster interconnect  
  2. Interface type 1 en0 10.182.0.0 configured from OCR for use as a public interface  
  3. . . . .  
  4. Cluster communication is configured to use the following interface(s) for this instance  
  5. 192.168.61.0 

(4) 没有1和2的配置,并且oifcfg也没有配置cluster_interconnect,则数据库会使用共有网络进行心跳信息的传输,这种配置其实是配置失败的情况,数据库虽然能够启动,但急需DBA修正,在告警日志中可以看到:

 

 
  
  1. WARNING: No cluster interconnect has been specified. Depending on  
  2. the communication driver configured Oracle cluster traffic  
  3. may be directed to the public interface of this machine.  
  4. Oracle recommends that RAC clustered databases be configured  
  5. with a private interconnect for enhanced security and  
  6. performance. 

 

对于一个已经有的系统,可以用下面几种方法确认数据库实例的心跳配置,包括网卡名称,IP地址,使用的网络协议:

(1) 最简单的方法:可以在数据库的后台报警日志中得到。具体参见上面列出的告警日志;

(2) 使用oradebug ;

 

 
  
  1. SQL> oradebug setmypid  
  2. SQL> oradebug ipc  
  3. SQL> oradebug tracefile_name 

 

找到对应trace文件的这一行:socket no 10 IP 10.0.0.1 UDP 49197

(3) 从数据字典中得到(V$CLUSTER_INTERCONNECTS 和 V$CONFIGURED_INTERCONNECTS),或查询x$ksxpia

 

 
  
  1. SQL> SELECT * FROM V$CLUSTER_INTERCONNECTS; ----Oracle 11g 开始支持此试图  
  2. NAME IP_ADDRESS IS_ SOURCE  
  3. ------------------------------ ---------------- --- -------------------------------  
  4. en3 192.168.2.31 NO Oracle Cluster Repository  
  5. en5 192.168.3.231 NO Oracle Cluster Repository  
  6. SQL> SELECT * FROM V$CONFIGURED_INTERCONNECTS;  
  7. NAME IP_ADDRESS IS_ SOURCE  
  8. ------------------------------ ---------------- --- -------------------------------  
  9. en3 192.168.2.31 NO Oracle Cluster Repository  
  10. en5 192.168.3.231 NO Oracle Cluster Repository  
  11. en0 10.200.59.231 YES Oracle Cluster Repository  
  12. SQL> select * from x$ksxpia ;  
  13. ADDR INDX INST_ID PUB_KSXPIA PICKED_KSXPIA NAME_KSXPIA IP_KSXPIA  
  14. ---------------- ---------- ---------- ---------- --------------- --------------- ----------------  
  15. 00000001104AAF28 0 1 N OCR en6 192.168.61.121  
  16. 00000001104AAF28 1 1 Y OCR en0 10.182.6.211 

 

为了避免心跳网络成为系统的单一故障点,简单地我们可以使用操作系统绑定的网卡来作为Oracle的心跳网络,以AIX为例,我们可以使用etherchannel技术,假设系统中有ent0/1/2/3四块网卡,我们绑定2和3作为心跳:

 

 
  
  1. #mkdev -c adapter -s pseudo -t ibm_ech -a adapter_names='ent2,ent3' ## 将生成网卡设备ent4  
  2. #/usr/lib/methods/defif  
  3. #lsdev -Cc adapter | grep ent  
  4. #lsattr -El ent4  
  5. #ifconfig en4 inet 192.168.3.231 netmask 255.255.255.0 up  
  6. 在Solaris上可以使用dladm来创建链路聚合:  
  7. # dladm create-aggr -d bge2 -d bge3 1  
  8. # ifconfig aggr1 plumb 192.168.3.231 netmask 255.255.255.0 up  
  9. # dladm show-aggr  
  10. # 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 查看

 
  
  1. ndd /dev/udp udp_xmit_hiwat udp_recv_hiwat udp_max_buf ;  
  2. 修改 ndd -set /dev/udp udp_xmit_hiwat 262144  
  3. ndd -set /dev/udp udp_recv_hiwat 262144  
  4. ndd -set /dev/udp udp_max_buf 2621440 

 

AIX 查看

 
  
  1. no -a |egrep “udp_|tcp_|sb_max”  
  2. 修改 no -p -o udp_sendspace=262144 
  3. no -p -o udp_recvspace=1310720 
  4. no -p -o tcp_sendspace=262144 
  5. no -p -o tcp_recvspace=262144 
  6. no -p -o sb_max=2621440 

 

Linux 查看

 
  
  1. 文件/etc/sysctl.conf  
  2. 修改 sysctl -w net.core.rmem_max=2621440 
  3. sysctl -w net.core.wmem_max=2621440 
  4. sysctl -w net.core.rmem_default=262144 
  5. 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 ;

 

 
  
  1. # 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配置文件

 

 
  
  1. rm -rf /usr/tmp/.oracle /var/tmp/.oracle /tmp/.oracle /etc/oracle/* /var/opt/oracle/*  
  2. rm -rf /etc/init.cssd /etc/init.crs* /etc/init.evmd /etc/init.d/init.cssd /etc/init.d/init.crs  
  3. rm -rf /etc/init.d/init.crsd /etc/init.d/init.evmd /etc/rc3.d/K96init.crs /etc/rc3.d/S96init.crs  
  4. 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 ,内容模板如下:

 

 
  
  1. MyCluster  
  2. rac01 rac01-priv rac01-vip  
  3. rac02 rac02-priv rac02-vip  
  4. rac03 rac03-priv rac03-vip  
  5. rac04 rac04-priv rac04-vip 

 

4. AIX上数据库启动报错

 

 
  
  1. ora-27504 IPC error creating OSD context  
  2. ora-27300 OS system dependent operation:sendmsg failed with status:59  
  3. ora-27301 OS failure message:Message too long  
  4. 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”

 

 
  
  1. /etc/rc.d/init.d/iptables stop ;chkconfig iptables off