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
- /etc/rc.d/init.d/iptables stop ;chkconfig iptables off