11.2.0.4rac service_name引數修改
環境介紹
1)客戶環境11.2.0.4 兩節點 rac,叢集重啟後,叢集資源一切正常,應用cs架構,連線資料庫報錯,提示連線物件不存在 2)分析報錯原因,連線資料庫方式:ip:Port/service_name方式連線資料庫 IP地址是scan_ip(客戶未使用dns伺服器,scan ip正常在節點一,實際情況在節點二,這個不影響scan的使用,本地節點二,使用scan ip可以連線) 埠號是預設1521,且測試本地可以連線 service_name,節點一 xx,節點二xx2,不一致,存在問題(預設rac搭建後,service_name引數兩節點儲存一致,人為調整可能不一致)3)分析結論,應用連線只連線service_name=xx,只連線rac節點一,客戶通過service_name實現,業務分割。
(當節點一主機 or 例項一 shutdown後,scan ip and service_name均飄逸至節點二,可以繼續為應用提供服務)
本次叢集重啟後,優先啟動節點二,scan ip掛載在節點二,然而節點一未shutdown,service_name 節點一服務名未飄逸,造成應用無法連線。 4)恢復操作,節點二,關閉scan ip服務,使其資源飄逸至節點一,至此操作結束
一、案例環境構建
1.1 環境介紹,linux5.6,database 11.2.0.3 release 1.2 測試流程
rac安裝初始化後,service_name名稱,及每個節點監聽的service_name名稱
資料庫引數修改service_name,造成節點1,2使用不同的service_name進行監聽,讓scan ip依附在節點二的Public Network card
模擬應用連線報錯,使用scan_ip + port+ service_name_node1 進行連線
1.3 rac安裝初始化後,service_name
1)資料庫引數,兩個例項引數均為jx
SQL> show parameter "service_names"
NAME TYPE VALUE
------------------------------------
service_names string jx
2)節點監聽的service_name
節點一:jx1:/u01/app/oracle$ lsnrctl status
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.60.100)(PORT=1521))) --public ip
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.60.152)(PORT=1521))) --vip
Service "jx" has 1 instance(s).
Instance "jx1", status READY
節點二:jx2:/u01/app/oracle$ lsnrctl status
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.60.101)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.60.153)(PORT=1521)))
Service "jx" has 1 instance(s).
Instance "jx2", status READY
1.4 資料庫引數修改service_name
1)節點一,資料庫引數service_name=jx不改變
2)如果使用一個錯誤的sid進行修改引數會如何?
引數提示修改成功,但其實並未生效,rac sid=instance_name,如下錯誤操作
SQL> alter system set service_names='jx2' sid='2';
System altered.
3)節點二,資料庫引數service_name=jx2
SQL> show parameter instance_name
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
instance_name string jx2
SQL> alter system set service_names='jx2' sid='jx2';
System altered.
再次查詢驗證
SQL> show parameter service_name
NAME TYPE VALUE
------------------------------------ ----------------------
service_names string jx2
4)service_name修改後,什麼時候生效
jx2:/u01/app/oracle$ lsnrctl status
Service "jx" has 1 instance(s).
Instance "jx2", status READY, has 1 handler(s) for this service...
Service "jx2" has 1 instance(s).
Instance "jx2", status READY, has 1 handler(s) for this service...
立即生效,並且歷史的service_name服務還可以使用jx,不符合本次測試場景,節點二,關閉service_name=jx
5)叢集命令,關閉監聽註冊監聽的service資源,failed測試環境無法操作
由於叢集資源歷史原因未註冊,因此無法通過叢集命令關閉節點二中的,service "jx"資源
jx2:/u01/app/grid$ srvctl status service -d jx -s jx
PRCR-1001 : 資源 ora.jx.jx.svc 不存在
手工重新rac叢集層面註冊service name
srvctl add service
-d <db_unique_name> 資料庫的唯一名稱
-s <service> 服務名
-r "<preferred_list>" 逗號分隔的首選例項列表
-a "<available_list>" 逗號分隔的備用例項列表
-P {NONE | BASIC | PRECONNECT} TAF 策略規範
BASIC: 是指在感知到節點故障時才建立到其他例項的連線。
PRECONNECT:是在最初建立連線時就同時建立到所有例項的連線,當發生故障時,立刻就可以切換到其他鏈路上。
jx2:/u01/app/oracle$ srvctl add service -d jx -s jx -r "jx1,jx2" -P BASIC
PRCD-1210 : 服務名jx不能與資料庫預設服務名jx相同
6)節點2監聽資源重啟
#錯誤示範,如下命令關閉叢集所有監聽資源
jx2:/u01/app/grid$ srvctl stop listener
jx2:/u01/app/grid$ srvctl status listener
監聽程式 LISTENER 已啟用
監聽程式 LISTENER 未執行
jx2:/u01/app/grid$ srvctl start listener
jx2:/u01/app/grid$ crsctl stat res -t
ora.LISTENER.lsnr
ONLINE ONLINE jx1
ONLINE ONLINE jx2
#正確方式,關閉一個節點監聽資源
jx2:/u01/app/grid$ srvctl stop listener -help ,只關閉一個節點
jx2:/u01/app/grid$ srvctl stop listener -n jx2
jx2:/u01/app/grid$ crsctl stat res -t
ora.LISTENER.lsnr
ONLINE ONLINE jx1
OFFLINE OFFLINE jx2
再次啟動節點2 監聽資源
jx2:/u01/app/grid$ srvctl start listener -n jx2
jx2:/u01/app/grid$ srvctl status listener
監聽程式 LISTENER 已啟用
監聽程式 LISTENER 正在節點上執行: jx1,jx2
監聽節點2,重啟監聽程式,本以為節點2 service_name=jx2,節點2的監聽程式無法監聽jx服務名稱
Service "jx" has 1 instance(s).
Instance "jx2", status READY, has 1 handler(s) for this service...
Service "jx2" has 1 instance(s).
Instance "jx2", status READY, has 1 handler(s) for this service...
7)修改預設的jx這服務名,讓其不在節點2出現呢?
修改jx服務名,配置主備模式,平時只在節點一註冊,失敗,原因資源不存在
jx2:/u01/app/grid$ srvctl modify service -d jx -s jx -i jx1 -a jx2 -P basic
PRCR-1001 : 資源 ora.jx.jx.svc 不存在
jx2:/u01/app/grid$ srvctl remove service -d jx -s jx
PRCR-1001 : 資源 ora.jx.jx.svc 不存在
將節點一,也修改service_name,使用節點一的service_name 測試模擬實際報錯,不使用資料庫預設的Jx進行測試
8)通過叢集命令增加一個service
讓jx這個服務名,正常情況下只在節點1,節點一shutdown,飄逸至備用節點2,實現實驗環境
jx2:/u01/app/oracle$ srvctl add service -d jx -s jx1 -r jx1 -a jx2 -P BASIC
jx2:/u01/app/oracle$ srvctl start service -d jx -s jx1
node1: listener status 資源狀態
Service "jx1" has 1 instance(s).
Instance "jx1", status READY, has 1 handler(s) for this service...
實驗環境確認
service_name node1=jx1 node2=jx2
監聽服務名 node1=jx,jx1 node2=jx,jx2
9)確認scan ip 在節點呢2上
jx2:/u01/app/11.2.0/grid/network/admin$ cat /etc/hosts
192.168.60.154 jx-scan
jx2:/u01/app/oracle$ /sbin/ifconfig -a
eth0:1 Link encap:Ethernet HWaddr 00:0C:29:8F:B5:EA
inet addr:192.168.60.154 Bcast:192.168.60.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
應用測試連線:無報錯,本次實驗還原失敗
jx2:/u01/app/oracle$ sqlplus sys/[email protected]:1521/jx1 as sysdba
jx1:/u01/app/oracle$ ps -ef|grep LOCAL
oracle 24139 1 0 17:55 ? 00:00:00 oraclejx1 (LOCAL=NO)
jx2:/u01/app/11.2.0/grid/network/admin$ ps -ef|grep LOCAL
失敗原因,猜測一,資料庫版本問題11.2.0.3 與11.2.0.4 版本存在差異
猜測二,service_name配置問題,本次測試使用的service_name是手工新增,與客戶生產環境service_name存在差異
10)叢集關閉scan資源,啟動scan 資源再節點一提供服務
jx1:/u01/app/grid$ srvctl status scan
SCAN VIP scan1 已啟用
SCAN VIP scan1 正在節點 jx2 上執行
jx1:/u01/app/grid$ srvctl status scan_listener
SCAN 監聽程式 LISTENER_SCAN1 已啟用
SCAN 監聽程式 LISTENER_SCAN1 正在節點 jx2 上執行
jx1:/u01/app/grid$ crsctl stat res -t
ora.LISTENER_SCAN1.lsnr
1 ONLINE ONLINE jx2
jx1:/u01/app/grid$ srvctl relocate scan -i 1 -n jx1
jx1:/u01/app/grid$ srvctl status scan
SCAN VIP scan1 已啟用
SCAN VIP scan1 正在節點 jx1 上執行
jx1:/u01/app/grid$ srvctl status scan_listener
SCAN 監聽程式 LISTENER_SCAN1 已啟用
SCAN 監聽程式 LISTENER_SCAN1 正在節點 jx1 上執行
二、測試service_name 飄逸
資料庫預設service_name
測試db層,修改引數 sid 一個例項,資料庫shutdown,能否自動漂移
測試db層,修改所有例項都註冊相同service_name
修改叢集service,主某個節點,主節點shutdown,service_name自動飄逸備用節點
1)資料庫預設service_name jx2:/u01/app/oracle$ sqlplus sys/[email protected]192.168.60.154:1521/jx as sysdba SQL> 2)測試db層,修改引數 sid 一個例項,資料庫shutdown,能否自動漂移 測試jx2,使用的是資料庫引數修改命令,測試資料庫shutdown,節點一能否監聽註冊這個資源 節點2::關閉資料庫 測試連線節點2,失敗 jx2:/u01/app/oracle$ sqlplus sys/[email protected]192.168.60.154:1521/jx2 as sysdba 服務名並沒有飄逸至節點一,因此節點一監聽程式無法註冊這個服務,帶來應用無法通過這個服務名稱進行訪問 3)測試db層,修改整個叢集都存在service_name,則均被註冊,與資料庫預設service_name,同理無需註冊 4)測試叢集編輯的service,能否切換 節點2:啟動資料庫 節點1:關閉資料庫
節點2叢集alert日誌記錄如下 2018-12-23 18:23:33.714: [crsd(2638)]CRS-2767:Resource state recovery not attempted for 'ora.jx.db' as its target state is OFFLINE 2018-12-23 19:06:19.865: [crsd(2638)]CRS-2765:Resource 'ora.jx.jx1.svc' has failed on server 'jx1'. 2018-12-23 19:06:19.865: [crsd(2638)]CRS-2771:Maximum restart attempts reached for resource 'ora.jx.jx1.svc'; will not restart. jx2:/u01/app/oracle$ lsnrctl status Service "jx1" has 1 instance(s). Instance "jx2", status READY, has 1 handler(s) for this service... jx2:/u01/app/oracle$ sqlplus sys/[email protected]192.168.60.154:1521/jx1 as sysdba SQL> select spid from v$process where addr=(select paddr from v$session where sid=(select sid from v$mystat group by sid)
and username='SYS' and STATUS='ACTIVE'); SPID ------------------------------------------------ 28081 SQL> host ps -ef|grep 28081 oracle 28081 1 0 19:07 ? 00:00:00 oraclejx2 (LOCAL=NO)
三、測試叢集管理service部分用法
查詢資源狀態
jx1:/u01/app/oracle$ srvctl status service -d jx -s jx1
服務 jx1 正在例項 jx1 上執行
新增service資源 手工重新rac叢集層面註冊service name srvctl add service -d <db_unique_name> 資料庫的唯一名稱 -s <service> 服務名 -r "<preferred_list>" 逗號分隔的首選例項列表 -a "<available_list>" 逗號分隔的備用例項列表 -P {NONE | BASIC | PRECONNECT} TAF 策略規範 BASIC: 是指在感知到節點故障時才建立到其他例項的連線。 PRECONNECT:是在最初建立連線時就同時建立到所有例項的連線,當發生故障時,立刻就可以切換到其他鏈路上。 jx2:/u01/app/oracle$ srvctl add service -d jx -s jx3 -r "jx1,jx2" -P BASIC 啟動新增的叢集服務
srvctl start service -d jx -s jx3
--對應資料庫alert,最終還是修改service_name引數,但是叢集層面可以實現,主備模式,手工修改資料庫引數無法實現主備
Sun Dec 23 19:27:52 2018
ALTER SYSTEM SET service_names='jx1','jx3' SCOPE=MEMORY SID='jx1';
關閉服務
jx1:/u01/app/oracle$ srvctl stop service -d jx -s jx3 -i jx1
jx1:/u01/app/oracle$ srvctl stop service -d jx -s jx3 -i jx2
刪除服務
jx1:/u01/app/oracle$ srvctl remove service -d jx -s jx3
讓jx這個服務名,正常情況下只在節點1,節點一shutdown,飄逸至備用節點2,實現實驗環境
jx2:/u01/app/oracle$ srvctl add service -d jx -s jx4 -r jx1 -a jx2 -P BASIC
jx2:/u01/app/oracle$ srvctl start service -d jx -s jx4
資源回切
jx1:/u01/app/oracle$ srvctl relocate service -d jx -s jx4 -i jx1 -t jx2
jx1:/u01/app/oracle$ srvctl relocate service -d jx -s jx4 -i jx2 -t jx1