1. 程式人生 > >11.2.0.4rac service_name引數修改

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