Oracle RAC 同時具備HA(High Availiablity) 和LB(LoadBalance). 而其高可用性的基礎(chǔ)就是Failover(故障轉(zhuǎn)移). 它指集群中任何一個節(jié)點的故障都不會影響用戶的使用,連接到故障節(jié)點的用戶會被自動轉(zhuǎn)移到健康節(jié)點,從用戶感受而言, 是感覺不到這種切換。
Oracle 10g RAC 的Failover 可以分為3種:
1. Client-Side Connect time Failover
2. TAF
3. Service-Side TAF
注意事項: 不能在listener.ora 文件中設(shè)置GLOBAL_NAME, 因為這個參數(shù)會禁用Connect-time Failover 和 Transparent Application Failover.
一.Client-Side Connect Time Failover
Client-Side Connect Time Failover的含義:如果用戶端tnsname 中配置了多個地址,用戶發(fā)起連接請求時,會先嘗試連接地址表中的第一個地址,如果這個連接嘗試失敗,則繼續(xù)嘗試使用第二個地址,直至連接成功或者遍歷了所有的地址。
這種Failover的特點: 只在建立連接那一時刻起作用,也就是說,這種Failover方式只在發(fā)起連接時才會去感知節(jié)點故障,如果節(jié)點沒有反應(yīng),則自動嘗試地址列表中的下一個地址。一旦連接建立之后,節(jié)點出現(xiàn)故障都不會做處理,從客戶端的表現(xiàn)就是會話斷開了,用戶程序必須重新建立連接。
啟用這種Failover的方法就是在客戶端的tnsnames.ora中添加FAILOVER=ON 條目,這個參數(shù)默認就是ON,所以即使不添加這個條目,客戶端也會獲得這種Failover能力。
示例:
RAC =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
(LOAD_BALANCE=YES)
(
CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=RAC)
)
)
注:rac1-vip,rac2-vip要添加到hosts 文件中,不然可能解析不了。
二. TAF(Transparent Application Failover)
現(xiàn)在的大部分流行的應(yīng)用系統(tǒng)(如:weblogic, Jboss),都是啟動時就建立若干到數(shù)據(jù)庫的長連接,在應(yīng)用程序整個生命周期內(nèi)重用這些連接。 而Client-Side Connet Time Failover的工作方式是它對應(yīng)用程序的可用性沒有太大幫助。
所以從Oracle 8.1.5 版本只有引入了新的Failover 機制—TAF。 所謂TAF,就是連接建立以后,應(yīng)用系統(tǒng)運行過程中,如果某個實例發(fā)生故障,連接到這個實例上的用戶會被自動遷移到其他的健康實例上。對于應(yīng)用程序而言,這個遷移過程是透明的,不需要用戶的介入,當然,這種透明要是有引導(dǎo)的,因為用戶的未提交事務(wù)會回滾。 相對與Client-Side Connect Time Failover的用戶程序中斷,拋出連接錯誤,用戶必須重啟應(yīng)用程序,TAF 這種方式在提高HA上有了很大的進步。
TAF 的配置也很簡單,只需要在客戶端的tnsnames.ora中添加FAILOVER_MODE配置項。這個條目有4個子項目需要定義。
1. METHOD: 用戶定義何時創(chuàng)建到其實例的連接,有BASIC 和 PRECONNECT 兩種可選值。
BASIC: 是指在感知到節(jié)點故障時才創(chuàng)建到其他實例的連接。
PRECONNECT: 是在最初建立連接時就同時建立到所有實例的連接,當發(fā)生故障時,立刻就可以切換到其他鏈路上。
兩種方法比較: BASIC方式在Failover時會有時間延遲,PRECONNECT方式雖然沒有時間延遲,但是建立多個冗余連接會消耗更多資源,兩者就是是用時間換資源和用資源換時間的區(qū)別。
2. TYPE: 用于定義發(fā)生故障時對完成的SQL 語句如何處理,其中有2種類型:session 和select.
這2種方式對于未提交的事務(wù)都會自動回滾,區(qū)別在于對select 語句的處理,對于select,用戶正在執(zhí)行的select語句會被轉(zhuǎn)移到新的實例上,在新的節(jié)點上繼續(xù)返回后續(xù)結(jié)果集,而已經(jīng)返回的記錄集則拋棄。
假設(shè)用戶正在節(jié)點1上執(zhí)行查詢,整個結(jié)果集共有100條記錄,現(xiàn)在已從節(jié)點1上返回10條記錄,這時節(jié)點1宕機,用戶連接被轉(zhuǎn)移到節(jié)點2上,如果是session模式,則需要重新執(zhí)行查詢語句;如果是select方式,會從節(jié)點2上繼續(xù)返回剩下的90天記錄,而已經(jīng)從節(jié)點1返回的10條記錄不會重復(fù)返回給用戶,對于用戶而言,感受不到這種切換。
顯然為了實現(xiàn)select 方式,Oracle 必須為每個session保存更多的內(nèi)容,包括游標,用戶上下文等,需要更多的資源也是用資源換時間的方案。
3. DELAY 和 RETRIES: 這2個參數(shù)分別代表重試間隔時間和重試次數(shù)。
示例:
RAC =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
(LOAD_BALANCE=YES)
(
CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=RAC)
(
FAILOVER_MODE=
(TYPE=session)
(METHOD=basic)
(RETRIES=180)
(DELAY=5)
)
)
)
三. Service-Side TAF
Service-SideTAF 可以看作是TAF的一種變種,首先Service-SideTAF也是TAF,所有TAF的特點它都有,其次這種TAF是在服務(wù)器上配置的,而不像TAF是在客戶端配置的。
Client-Side TAF 是在客戶端修改tnsnames.ora 文件來配置的,如果有很多客戶端使用這個數(shù)據(jù)庫,那么每次微笑調(diào)整都需要把所有的計算機更改一遍,既低效又容易出錯。而Service-Side TAF 通過結(jié)合Service,在數(shù)據(jù)庫里保存FAIL_MODE的配置,把所有的TAF配置保存在數(shù)據(jù)字典中,從而省去了客戶端的配置工作,現(xiàn)在客戶端的TNS文件就不需要任何TAF的配置選項了。
從配置參數(shù)而言,Service-Side TAF和TAF 相比多了一個Instance Role(實例角色)的概念。 所謂的實例角色,就是當有多個Instance 參與一個Service時,可以配置優(yōu)先使用哪一個Instance為用戶提供服務(wù)。用戶共有兩種可選角色。
PREFERRED:首選實例,會優(yōu)先選擇擁有這個角色的實例提供服務(wù)。
AVAILABLE: 后備實例,用戶連接會優(yōu)先連接PREFFERRED的Instance,當PREFERRED的Instance不可用時,才會被轉(zhuǎn)到AVAILBALE的Instance上。
要使用Server-Side TAF必須配置Service。 Service 可以在創(chuàng)建數(shù)據(jù)庫時創(chuàng)建,也可以在創(chuàng)建數(shù)據(jù)庫之后修改,既可以使用dbca 配置向?qū)В部梢杂妹钚械?方式配置。
3.1 用DBCA 配置Service
1). 運行DBCA,選擇ORACLE RAC Application Clusters database
2). 在第二個界面選擇:Services Management
3). 第三個界面會出現(xiàn)RAC 數(shù)據(jù)庫列表,用戶可以在這個列表中選擇要配置Service 的數(shù)據(jù)庫
4). 在Serice配置界面中,單擊Add 創(chuàng)建新的Service,輸入service名字。在Instance列表框定義實例角色,選擇那個service1 作為 Preferred(首選實例),Service2 作為availiable(后備實例)。 TAF Policy有三個選項: None, Basic,Pre-connect。 我們選Basic。 最后點擊Finish,完成Service 配置。
5)在結(jié)束Service配置后,服務(wù)會自動啟動。
3.2 用srvctl 命令配置Service
用命令行方式配置Service 對遠程維護很有用。 先來看一下相關(guān)命令
1) 創(chuàng)建service
#Srvctl add service -d <database-name> -s <service-name> -r "preferred-instance-list" -a "available-instance-list" -P <TAF-policy>
其中TAF-Policy可選:basic 和 preconnect。 例如:
srvctl add service -d RAC -s Service2 -r "RAC1,RAC2" -a "RAC3,RAC4" -P basic
注意:srvctl add service中,只有perferred才會創(chuàng)建服務(wù)。 即在OCR中注冊一個ora.raw.dmm.Raw1.Srv的服務(wù)。
2) 查看配置信息
#srvctl config service -d database-name [-s service-name] [-a]
如果這里不指定"-s service-name",就會顯示所有Service的配置,這些配置包括preferred 和available instance. 使用-a 選項,還會顯示TAF 相關(guān)信息。
3) 是否自動運行service
數(shù)據(jù)庫啟動時,會自動啟動所有的Service。有時為了為了維護需要,需要禁用這個特性,在維護完成后再啟動這個特性。
#srvctl enable/disable service -d database-name -s service-name -i instance-name
4)啟動service
#srvctl start service -d <database-name> -s <service-name> -i instance-name -o start-option -c connect-string -q
如果不指定service-name, 則所有的service 都會被啟動,可以使用逗號分隔方式,同時啟動多個service。 -i 指定在那個實例上啟動service。
5) 停止service
#srvctl stop service -d <database-name> -s <service-name> -i instance-name -c connect-string -q -f
其中-f 選項可以強制關(guān)閉service,并中斷了其所有用戶的連接。
6) 查看service 狀態(tài)
#srvctl status service -d <database-name> -s service-name -i instance-name -f -v
其中-f 可以顯示被disable的instance 信息,而-v 可以顯示詳細輸出
7) 刪除service
#srvctl remove service -d database-name -s service-name -i instance-name [-f]
注意:在使用srvctl 創(chuàng)建service時,需要注意TAF策略選項必須通過dbms_service包來配置。
示例:
Begin
Dbms_service.modify_service(
Service_name='>Service1',
Failover_method=>dbms_service.failover_method_basic,
Failover_type=>dbms_service.failover_type_select,
Failover_retries=>180,
Failover_delay=>5
);
End;
3.3 配置Service 的注意事項
1). 數(shù)據(jù)庫的服務(wù)名是用service_name 參數(shù)來指定的,一個數(shù)據(jù)庫可以有多個服務(wù)名,但是service_name最長是4kb,不要手工來修改這個參數(shù)
2)最多可以創(chuàng)建64個service,每個數(shù)據(jù)庫有2個隱含的service,因此留給用戶的就只有62個service。不能修改這兩個隱含service的配置,并且也不能手工啟動或停止這2個服務(wù)。 這兩個隱含的service分別是:SYS$BACKGROUND 和 SYS$USERS.
3) 當使用dbca配置Service 時,dbca 會自動更新OCR,啟動Service, 當刪除service時,會停止service,并更新OCR.
4) 使用srvctl 這個工具時,命令只更新OCR中的配置,不會更新data dctionary 和 listener 中的信息,因此還需要使用dbma_servie 包來更新data dictionary,手工更改listener配置文件。 故推薦使用DBCA工具來配置更改service配置
5) 如果客戶端想通過Service 方式連接數(shù)據(jù)庫,需要在tns條目中使用service_name 方式引用數(shù)據(jù)庫。 如:
RAC =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
(LOAD_BALANCE=YES)
(
CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=RAC)
)
)
注意:無論是使用dbca 工具還是使用srvctl 命令來配置service,都無法配置TAF的TYPE,DELAY,RETRIES 三個屬性,必須使用dbms_service包來修改這些屬性。
四. Srvctl 命令測試實例
先查看一下RAC 啟動情況:
[root@raw1 bin]# ./crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora.raw.db application ONLINE ONLINE raw1
ora.raw.raw.cs application ONLINE ONLINE raw1
ora....aw1.srv application ONLINE ONLINE raw1
ora....aw2.srv application ONLINE ONLINE raw2
ora....w1.inst application ONLINE ONLINE raw1
ora....w2.inst application ONLINE ONLINE raw2
ora....SM1.asm application ONLINE ONLINE raw1
ora....W1.lsnr application ONLINE ONLINE raw1
ora.raw1.gsd application ONLINE ONLINE raw1
ora.raw1.ons application ONLINE ONLINE raw1
ora.raw1.vip application ONLINE ONLINE raw1
ora....SM2.asm application ONLINE ONLINE raw2
ora....W2.lsnr application ONLINE ONLINE raw2
ora.raw2.gsd application ONLINE ONLINE raw2
ora.raw2.ons application ONLINE ONLINE raw2
ora.raw2.vip application ONLINE ONLINE raw2
[root@raw1 bin]# ps -ef|grep smon
root 17483 3479 0 07:30 pts/1 00:00:00 grep smon
oracle 26561 1 0 07:06 ? 00:00:01 asm_smon_+ASM1
oracle 27082 1 0 07:06 ? 00:00:05 ora_smon_raw1
一切正常。
1) 查看現(xiàn)有的service
[root@raw1 bin]# su - oracle
[oracle@raw1 ~]$ export ORACLE_SID=raw1
[oracle@raw1 ~]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Wed Mar 3 07:45:36 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn / as sysdba
Connected.
SQL> show parameter service
NAME TYPE VALUE
------------------------------ ----------- ------------------------
service_names string raw
SQL>
2)使用srvctl 命令創(chuàng)建dmm 服務(wù)
[oracle@raw2 bin]$ srvctl add service -d raw -s dmm -r "raw1,raw2" -P basic
[oracle@raw2 bin]$ crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora.raw.db application ONLINE ONLINE raw1
ora.raw.dmm.cs application OFFLINE OFFLINE
ora....aw1.srv application OFFLINE OFFLINE
ora....aw2.srv application OFFLINE OFFLINE
ora....w1.inst application ONLINE ONLINE raw1
ora....w2.inst application ONLINE ONLINE raw2
ora....SM1.asm application ONLINE ONLINE raw1
ora....W1.lsnr application ONLINE ONLINE raw1
ora.raw1.gsd application ONLINE ONLINE raw1
ora.raw1.ons application ONLINE ONLINE raw1
ora.raw1.vip application ONLINE ONLINE raw1
ora....SM2.asm application ONLINE ONLINE raw2
ora....W2.lsnr application ONLINE ONLINE raw2
ora.raw2.gsd application ONLINE ONLINE raw2
ora.raw2.ons application ONLINE ONLINE raw2
ora.raw2.vip application ONLINE ONLINE raw2
[oracle@raw2 bin]$ srvctl add service -d raw -s dmm -r raw1 -a raw2 -P basic
注意:srvctl add service中,只有perferred才會創(chuàng)建服務(wù)。 即在OCR中注冊一個ora.raw.dmm.Raw1.Srv的服務(wù)。
3)確認服務(wù)創(chuàng)建成功,offline 表示還沒有啟動
[oracle@raw2 bin]$ crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora.raw.db application ONLINE ONLINE raw1
ora.raw.dmm.cs application OFFLINE OFFLINE
ora....aw1.srv application OFFLINE OFFLINE
ora.raw.raw.cs application ONLINE ONLINE raw1
ora....aw1.srv application ONLINE ONLINE raw1
ora....w1.inst application ONLINE ONLINE raw1
ora....w2.inst application ONLINE ONLINE raw2
ora....SM1.asm application ONLINE ONLINE raw1
ora....W1.lsnr application ONLINE ONLINE raw1
ora.raw1.gsd application ONLINE ONLINE raw1
ora.raw1.ons application ONLINE ONLINE raw1
ora.raw1.vip application ONLINE ONLINE raw1
ora....SM2.asm application ONLINE ONLINE raw2
ora....W2.lsnr application ONLINE ONLINE raw2
ora.raw2.gsd application ONLINE ONLINE raw2
ora.raw2.ons application ONLINE ONLINE raw2
ora.raw2.vip application ONLINE ONLINE raw2
4)配置這個服務(wù)自啟動
[oracle@raw2 bin]$ srvctl enable service -d raw -s dmm
PRKP-1018 : Service dmm already enabled.
5)啟動服務(wù)
[oracle@raw2 bin]$ srvctl start service -d raw -s dmm
6)確認服務(wù)狀態(tài)。Online 說明已啟動
[oracle@raw2 bin]$ crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora.raw.db application ONLINE ONLINE raw1
ora.raw.dmm.cs application ONLINE ONLINE raw1
ora....aw1.srv application ONLINE ONLINE raw1
ora.raw.raw.cs application ONLINE ONLINE raw1
ora....w1.inst application ONLINE ONLINE raw1
ora....w2.inst application ONLINE ONLINE raw2
ora....SM1.asm application ONLINE ONLINE raw1
ora....W1.lsnr application ONLINE ONLINE raw1
ora.raw1.gsd application ONLINE ONLINE raw1
ora.raw1.ons application ONLINE ONLINE raw1
ora.raw1.vip application ONLINE ONLINE raw1
ora....SM2.asm application ONLINE ONLINE raw2
ora....W2.lsnr application ONLINE ONLINE raw2
ora.raw2.gsd application ONLINE ONLINE raw2
ora.raw2.ons application ONLINE ONLINE raw2
ora.raw2.vip application ONLINE ONLINE raw2
新建的服務(wù)會自動添加到初始話參數(shù)中:
SQL> show parameter service
NAME TYPE VALUE
----------------------------- ----------- --------------------
service_names string raw, dmm
7)用service TAF 修改配置,需要用dbms_service.Modify_service 包。
SQL> Begin
Dbms_service.modify_service(
Service_name=>'dmm',
Failover_method=>dbms_service.failover_method_basic,
Failover_type=>dbms_service.failover_type_select,
Failover_retries=>180,
Failover_delay=>5
);
End;
/
PL/SQL procedure successfully completed.
8) 確認參數(shù)已經(jīng)生效
SQL> select name,failover_method,failover_type,goal,clb_goal from dba_services;
NAME FAILOVER_METHOD FAILOVER_TYPE GOAL CLB_G
------------- ---------- ----------- ------- -------
SYS$BACKGROUND NONE SHORT
SYS$USERS NONE SHORT
seeddataXDB LONG
seeddata.regress.rdb LONG
rawXDB LONG
raw LONG
dmm BASIC SELECT LONG
7 rows selected.
9) 也可以用srvctl 命令查看配置情況
[oracle@raw2 bin]$ srvctl config service -d raw -s dmm -a
dmm PREF: raw1 AVAIL: raw2 TAF: basic
10) 刪除Service
先關(guān)閉service:
[oracle@raw2 bin]$ srvctl stop service -d raw -s dmm
[oracle@raw2 bin]$ srvctl disable service -d raw -s dmm
刪除服務(wù):
[oracle@raw2 bin]$ srvctl remove service -d raw -s dmm
dmm PREF: raw1 AVAIL: raw2
Service dmm is disabled.
Remove service dmm from the database raw? (y/[n]) y
如果該命令清楚不掉,我們可以加上-f 參數(shù)
[oracle@raw2 bin]# ./srvctl remove service -d raw -s dmm -f
OCR中的信息已經(jīng)被刪除了,但是數(shù)據(jù)字典中的還有該service的內(nèi)容,繼續(xù)清除數(shù)據(jù)字典中的內(nèi)容。
先查看數(shù)據(jù)字典內(nèi)容:
SQL> select name,failover_method,failover_type,goal,clb_goal from dba_services;
NAME FAILOVER_METHOD FAILOVER_TYPE GOAL CLB_G
-------------------- --------------- ----------------------- -----
SYS$BACKGROUND NONE SHORT
SYS$USERS NONE SHORT
seeddataXDB LONG
seeddata.regress.rdb LONG
rawXDB LONG
raw LONG
dmm BASIC SELECT LONG
7 rows selected.
清除數(shù)據(jù)字典里的內(nèi)容:
SQL> begin
2 dbms_service.delete_service(service_name=>'dmm');
3 end;
4 /
PL/SQL procedure successfully completed.
再次查詢數(shù)據(jù)字典,沒有了數(shù)據(jù)。清除完成
SQL> select name,failover_method,failover_type,goal,clb_goal from dba_services;
NAME FAILOVER_METHOD FAILOVER_TYPE GOAL CLB_G
-------------------- --------------- ----------------------- -----
SYS$BACKGROUND NONE SHORT
SYS$USERS NONE SHORT
seeddataXDB LONG
seeddata.regress.rdb LONG
rawXDB LONG
raw LONG
6 rows selected.
Oracle 10g RAC 的Failover 可以分為3種:
1. Client-Side Connect time Failover
2. TAF
3. Service-Side TAF
注意事項: 不能在listener.ora 文件中設(shè)置GLOBAL_NAME, 因為這個參數(shù)會禁用Connect-time Failover 和 Transparent Application Failover.
一.Client-Side Connect Time Failover
Client-Side Connect Time Failover的含義:如果用戶端tnsname 中配置了多個地址,用戶發(fā)起連接請求時,會先嘗試連接地址表中的第一個地址,如果這個連接嘗試失敗,則繼續(xù)嘗試使用第二個地址,直至連接成功或者遍歷了所有的地址。
這種Failover的特點: 只在建立連接那一時刻起作用,也就是說,這種Failover方式只在發(fā)起連接時才會去感知節(jié)點故障,如果節(jié)點沒有反應(yīng),則自動嘗試地址列表中的下一個地址。一旦連接建立之后,節(jié)點出現(xiàn)故障都不會做處理,從客戶端的表現(xiàn)就是會話斷開了,用戶程序必須重新建立連接。
啟用這種Failover的方法就是在客戶端的tnsnames.ora中添加FAILOVER=ON 條目,這個參數(shù)默認就是ON,所以即使不添加這個條目,客戶端也會獲得這種Failover能力。
示例:
RAC =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
(LOAD_BALANCE=YES)
(
CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=RAC)
)
)
注:rac1-vip,rac2-vip要添加到hosts 文件中,不然可能解析不了。
二. TAF(Transparent Application Failover)
現(xiàn)在的大部分流行的應(yīng)用系統(tǒng)(如:weblogic, Jboss),都是啟動時就建立若干到數(shù)據(jù)庫的長連接,在應(yīng)用程序整個生命周期內(nèi)重用這些連接。 而Client-Side Connet Time Failover的工作方式是它對應(yīng)用程序的可用性沒有太大幫助。
所以從Oracle 8.1.5 版本只有引入了新的Failover 機制—TAF。 所謂TAF,就是連接建立以后,應(yīng)用系統(tǒng)運行過程中,如果某個實例發(fā)生故障,連接到這個實例上的用戶會被自動遷移到其他的健康實例上。對于應(yīng)用程序而言,這個遷移過程是透明的,不需要用戶的介入,當然,這種透明要是有引導(dǎo)的,因為用戶的未提交事務(wù)會回滾。 相對與Client-Side Connect Time Failover的用戶程序中斷,拋出連接錯誤,用戶必須重啟應(yīng)用程序,TAF 這種方式在提高HA上有了很大的進步。
TAF 的配置也很簡單,只需要在客戶端的tnsnames.ora中添加FAILOVER_MODE配置項。這個條目有4個子項目需要定義。
1. METHOD: 用戶定義何時創(chuàng)建到其實例的連接,有BASIC 和 PRECONNECT 兩種可選值。
BASIC: 是指在感知到節(jié)點故障時才創(chuàng)建到其他實例的連接。
PRECONNECT: 是在最初建立連接時就同時建立到所有實例的連接,當發(fā)生故障時,立刻就可以切換到其他鏈路上。
兩種方法比較: BASIC方式在Failover時會有時間延遲,PRECONNECT方式雖然沒有時間延遲,但是建立多個冗余連接會消耗更多資源,兩者就是是用時間換資源和用資源換時間的區(qū)別。
2. TYPE: 用于定義發(fā)生故障時對完成的SQL 語句如何處理,其中有2種類型:session 和select.
這2種方式對于未提交的事務(wù)都會自動回滾,區(qū)別在于對select 語句的處理,對于select,用戶正在執(zhí)行的select語句會被轉(zhuǎn)移到新的實例上,在新的節(jié)點上繼續(xù)返回后續(xù)結(jié)果集,而已經(jīng)返回的記錄集則拋棄。
假設(shè)用戶正在節(jié)點1上執(zhí)行查詢,整個結(jié)果集共有100條記錄,現(xiàn)在已從節(jié)點1上返回10條記錄,這時節(jié)點1宕機,用戶連接被轉(zhuǎn)移到節(jié)點2上,如果是session模式,則需要重新執(zhí)行查詢語句;如果是select方式,會從節(jié)點2上繼續(xù)返回剩下的90天記錄,而已經(jīng)從節(jié)點1返回的10條記錄不會重復(fù)返回給用戶,對于用戶而言,感受不到這種切換。
顯然為了實現(xiàn)select 方式,Oracle 必須為每個session保存更多的內(nèi)容,包括游標,用戶上下文等,需要更多的資源也是用資源換時間的方案。
3. DELAY 和 RETRIES: 這2個參數(shù)分別代表重試間隔時間和重試次數(shù)。
示例:
RAC =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
(LOAD_BALANCE=YES)
(
CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=RAC)
(
FAILOVER_MODE=
(TYPE=session)
(METHOD=basic)
(RETRIES=180)
(DELAY=5)
)
)
)
三. Service-Side TAF
Service-SideTAF 可以看作是TAF的一種變種,首先Service-SideTAF也是TAF,所有TAF的特點它都有,其次這種TAF是在服務(wù)器上配置的,而不像TAF是在客戶端配置的。
Client-Side TAF 是在客戶端修改tnsnames.ora 文件來配置的,如果有很多客戶端使用這個數(shù)據(jù)庫,那么每次微笑調(diào)整都需要把所有的計算機更改一遍,既低效又容易出錯。而Service-Side TAF 通過結(jié)合Service,在數(shù)據(jù)庫里保存FAIL_MODE的配置,把所有的TAF配置保存在數(shù)據(jù)字典中,從而省去了客戶端的配置工作,現(xiàn)在客戶端的TNS文件就不需要任何TAF的配置選項了。
從配置參數(shù)而言,Service-Side TAF和TAF 相比多了一個Instance Role(實例角色)的概念。 所謂的實例角色,就是當有多個Instance 參與一個Service時,可以配置優(yōu)先使用哪一個Instance為用戶提供服務(wù)。用戶共有兩種可選角色。
PREFERRED:首選實例,會優(yōu)先選擇擁有這個角色的實例提供服務(wù)。
AVAILABLE: 后備實例,用戶連接會優(yōu)先連接PREFFERRED的Instance,當PREFERRED的Instance不可用時,才會被轉(zhuǎn)到AVAILBALE的Instance上。
要使用Server-Side TAF必須配置Service。 Service 可以在創(chuàng)建數(shù)據(jù)庫時創(chuàng)建,也可以在創(chuàng)建數(shù)據(jù)庫之后修改,既可以使用dbca 配置向?qū)В部梢杂妹钚械?方式配置。
3.1 用DBCA 配置Service
1). 運行DBCA,選擇ORACLE RAC Application Clusters database
2). 在第二個界面選擇:Services Management
3). 第三個界面會出現(xiàn)RAC 數(shù)據(jù)庫列表,用戶可以在這個列表中選擇要配置Service 的數(shù)據(jù)庫
4). 在Serice配置界面中,單擊Add 創(chuàng)建新的Service,輸入service名字。在Instance列表框定義實例角色,選擇那個service1 作為 Preferred(首選實例),Service2 作為availiable(后備實例)。 TAF Policy有三個選項: None, Basic,Pre-connect。 我們選Basic。 最后點擊Finish,完成Service 配置。
5)在結(jié)束Service配置后,服務(wù)會自動啟動。
3.2 用srvctl 命令配置Service
用命令行方式配置Service 對遠程維護很有用。 先來看一下相關(guān)命令
1) 創(chuàng)建service
#Srvctl add service -d <database-name> -s <service-name> -r "preferred-instance-list" -a "available-instance-list" -P <TAF-policy>
其中TAF-Policy可選:basic 和 preconnect。 例如:
srvctl add service -d RAC -s Service2 -r "RAC1,RAC2" -a "RAC3,RAC4" -P basic
注意:srvctl add service中,只有perferred才會創(chuàng)建服務(wù)。 即在OCR中注冊一個ora.raw.dmm.Raw1.Srv的服務(wù)。
2) 查看配置信息
#srvctl config service -d database-name [-s service-name] [-a]
如果這里不指定"-s service-name",就會顯示所有Service的配置,這些配置包括preferred 和available instance. 使用-a 選項,還會顯示TAF 相關(guān)信息。
3) 是否自動運行service
數(shù)據(jù)庫啟動時,會自動啟動所有的Service。有時為了為了維護需要,需要禁用這個特性,在維護完成后再啟動這個特性。
#srvctl enable/disable service -d database-name -s service-name -i instance-name
4)啟動service
#srvctl start service -d <database-name> -s <service-name> -i instance-name -o start-option -c connect-string -q
如果不指定service-name, 則所有的service 都會被啟動,可以使用逗號分隔方式,同時啟動多個service。 -i 指定在那個實例上啟動service。
5) 停止service
#srvctl stop service -d <database-name> -s <service-name> -i instance-name -c connect-string -q -f
其中-f 選項可以強制關(guān)閉service,并中斷了其所有用戶的連接。
6) 查看service 狀態(tài)
#srvctl status service -d <database-name> -s service-name -i instance-name -f -v
其中-f 可以顯示被disable的instance 信息,而-v 可以顯示詳細輸出
7) 刪除service
#srvctl remove service -d database-name -s service-name -i instance-name [-f]
注意:在使用srvctl 創(chuàng)建service時,需要注意TAF策略選項必須通過dbms_service包來配置。
示例:
Begin
Dbms_service.modify_service(
Service_name='>Service1',
Failover_method=>dbms_service.failover_method_basic,
Failover_type=>dbms_service.failover_type_select,
Failover_retries=>180,
Failover_delay=>5
);
End;
3.3 配置Service 的注意事項
1). 數(shù)據(jù)庫的服務(wù)名是用service_name 參數(shù)來指定的,一個數(shù)據(jù)庫可以有多個服務(wù)名,但是service_name最長是4kb,不要手工來修改這個參數(shù)
2)最多可以創(chuàng)建64個service,每個數(shù)據(jù)庫有2個隱含的service,因此留給用戶的就只有62個service。不能修改這兩個隱含service的配置,并且也不能手工啟動或停止這2個服務(wù)。 這兩個隱含的service分別是:SYS$BACKGROUND 和 SYS$USERS.
3) 當使用dbca配置Service 時,dbca 會自動更新OCR,啟動Service, 當刪除service時,會停止service,并更新OCR.
4) 使用srvctl 這個工具時,命令只更新OCR中的配置,不會更新data dctionary 和 listener 中的信息,因此還需要使用dbma_servie 包來更新data dictionary,手工更改listener配置文件。 故推薦使用DBCA工具來配置更改service配置
5) 如果客戶端想通過Service 方式連接數(shù)據(jù)庫,需要在tns條目中使用service_name 方式引用數(shù)據(jù)庫。 如:
RAC =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
(LOAD_BALANCE=YES)
(
CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=RAC)
)
)
注意:無論是使用dbca 工具還是使用srvctl 命令來配置service,都無法配置TAF的TYPE,DELAY,RETRIES 三個屬性,必須使用dbms_service包來修改這些屬性。
四. Srvctl 命令測試實例
先查看一下RAC 啟動情況:
[root@raw1 bin]# ./crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora.raw.db application ONLINE ONLINE raw1
ora.raw.raw.cs application ONLINE ONLINE raw1
ora....aw1.srv application ONLINE ONLINE raw1
ora....aw2.srv application ONLINE ONLINE raw2
ora....w1.inst application ONLINE ONLINE raw1
ora....w2.inst application ONLINE ONLINE raw2
ora....SM1.asm application ONLINE ONLINE raw1
ora....W1.lsnr application ONLINE ONLINE raw1
ora.raw1.gsd application ONLINE ONLINE raw1
ora.raw1.ons application ONLINE ONLINE raw1
ora.raw1.vip application ONLINE ONLINE raw1
ora....SM2.asm application ONLINE ONLINE raw2
ora....W2.lsnr application ONLINE ONLINE raw2
ora.raw2.gsd application ONLINE ONLINE raw2
ora.raw2.ons application ONLINE ONLINE raw2
ora.raw2.vip application ONLINE ONLINE raw2
[root@raw1 bin]# ps -ef|grep smon
root 17483 3479 0 07:30 pts/1 00:00:00 grep smon
oracle 26561 1 0 07:06 ? 00:00:01 asm_smon_+ASM1
oracle 27082 1 0 07:06 ? 00:00:05 ora_smon_raw1
一切正常。
1) 查看現(xiàn)有的service
[root@raw1 bin]# su - oracle
[oracle@raw1 ~]$ export ORACLE_SID=raw1
[oracle@raw1 ~]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Wed Mar 3 07:45:36 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn / as sysdba
Connected.
SQL> show parameter service
NAME TYPE VALUE
------------------------------ ----------- ------------------------
service_names string raw
SQL>
2)使用srvctl 命令創(chuàng)建dmm 服務(wù)
[oracle@raw2 bin]$ srvctl add service -d raw -s dmm -r "raw1,raw2" -P basic
[oracle@raw2 bin]$ crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora.raw.db application ONLINE ONLINE raw1
ora.raw.dmm.cs application OFFLINE OFFLINE
ora....aw1.srv application OFFLINE OFFLINE
ora....aw2.srv application OFFLINE OFFLINE
ora....w1.inst application ONLINE ONLINE raw1
ora....w2.inst application ONLINE ONLINE raw2
ora....SM1.asm application ONLINE ONLINE raw1
ora....W1.lsnr application ONLINE ONLINE raw1
ora.raw1.gsd application ONLINE ONLINE raw1
ora.raw1.ons application ONLINE ONLINE raw1
ora.raw1.vip application ONLINE ONLINE raw1
ora....SM2.asm application ONLINE ONLINE raw2
ora....W2.lsnr application ONLINE ONLINE raw2
ora.raw2.gsd application ONLINE ONLINE raw2
ora.raw2.ons application ONLINE ONLINE raw2
ora.raw2.vip application ONLINE ONLINE raw2
[oracle@raw2 bin]$ srvctl add service -d raw -s dmm -r raw1 -a raw2 -P basic
注意:srvctl add service中,只有perferred才會創(chuàng)建服務(wù)。 即在OCR中注冊一個ora.raw.dmm.Raw1.Srv的服務(wù)。
3)確認服務(wù)創(chuàng)建成功,offline 表示還沒有啟動
[oracle@raw2 bin]$ crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora.raw.db application ONLINE ONLINE raw1
ora.raw.dmm.cs application OFFLINE OFFLINE
ora....aw1.srv application OFFLINE OFFLINE
ora.raw.raw.cs application ONLINE ONLINE raw1
ora....aw1.srv application ONLINE ONLINE raw1
ora....w1.inst application ONLINE ONLINE raw1
ora....w2.inst application ONLINE ONLINE raw2
ora....SM1.asm application ONLINE ONLINE raw1
ora....W1.lsnr application ONLINE ONLINE raw1
ora.raw1.gsd application ONLINE ONLINE raw1
ora.raw1.ons application ONLINE ONLINE raw1
ora.raw1.vip application ONLINE ONLINE raw1
ora....SM2.asm application ONLINE ONLINE raw2
ora....W2.lsnr application ONLINE ONLINE raw2
ora.raw2.gsd application ONLINE ONLINE raw2
ora.raw2.ons application ONLINE ONLINE raw2
ora.raw2.vip application ONLINE ONLINE raw2
4)配置這個服務(wù)自啟動
[oracle@raw2 bin]$ srvctl enable service -d raw -s dmm
PRKP-1018 : Service dmm already enabled.
5)啟動服務(wù)
[oracle@raw2 bin]$ srvctl start service -d raw -s dmm
6)確認服務(wù)狀態(tài)。Online 說明已啟動
[oracle@raw2 bin]$ crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora.raw.db application ONLINE ONLINE raw1
ora.raw.dmm.cs application ONLINE ONLINE raw1
ora....aw1.srv application ONLINE ONLINE raw1
ora.raw.raw.cs application ONLINE ONLINE raw1
ora....w1.inst application ONLINE ONLINE raw1
ora....w2.inst application ONLINE ONLINE raw2
ora....SM1.asm application ONLINE ONLINE raw1
ora....W1.lsnr application ONLINE ONLINE raw1
ora.raw1.gsd application ONLINE ONLINE raw1
ora.raw1.ons application ONLINE ONLINE raw1
ora.raw1.vip application ONLINE ONLINE raw1
ora....SM2.asm application ONLINE ONLINE raw2
ora....W2.lsnr application ONLINE ONLINE raw2
ora.raw2.gsd application ONLINE ONLINE raw2
ora.raw2.ons application ONLINE ONLINE raw2
ora.raw2.vip application ONLINE ONLINE raw2
新建的服務(wù)會自動添加到初始話參數(shù)中:
SQL> show parameter service
NAME TYPE VALUE
----------------------------- ----------- --------------------
service_names string raw, dmm
7)用service TAF 修改配置,需要用dbms_service.Modify_service 包。
SQL> Begin
Dbms_service.modify_service(
Service_name=>'dmm',
Failover_method=>dbms_service.failover_method_basic,
Failover_type=>dbms_service.failover_type_select,
Failover_retries=>180,
Failover_delay=>5
);
End;
/
PL/SQL procedure successfully completed.
8) 確認參數(shù)已經(jīng)生效
SQL> select name,failover_method,failover_type,goal,clb_goal from dba_services;
NAME FAILOVER_METHOD FAILOVER_TYPE GOAL CLB_G
------------- ---------- ----------- ------- -------
SYS$BACKGROUND NONE SHORT
SYS$USERS NONE SHORT
seeddataXDB LONG
seeddata.regress.rdb LONG
rawXDB LONG
raw LONG
dmm BASIC SELECT LONG
7 rows selected.
9) 也可以用srvctl 命令查看配置情況
[oracle@raw2 bin]$ srvctl config service -d raw -s dmm -a
dmm PREF: raw1 AVAIL: raw2 TAF: basic
10) 刪除Service
先關(guān)閉service:
[oracle@raw2 bin]$ srvctl stop service -d raw -s dmm
[oracle@raw2 bin]$ srvctl disable service -d raw -s dmm
刪除服務(wù):
[oracle@raw2 bin]$ srvctl remove service -d raw -s dmm
dmm PREF: raw1 AVAIL: raw2
Service dmm is disabled.
Remove service dmm from the database raw? (y/[n]) y
如果該命令清楚不掉,我們可以加上-f 參數(shù)
[oracle@raw2 bin]# ./srvctl remove service -d raw -s dmm -f
OCR中的信息已經(jīng)被刪除了,但是數(shù)據(jù)字典中的還有該service的內(nèi)容,繼續(xù)清除數(shù)據(jù)字典中的內(nèi)容。
先查看數(shù)據(jù)字典內(nèi)容:
SQL> select name,failover_method,failover_type,goal,clb_goal from dba_services;
NAME FAILOVER_METHOD FAILOVER_TYPE GOAL CLB_G
-------------------- --------------- ----------------------- -----
SYS$BACKGROUND NONE SHORT
SYS$USERS NONE SHORT
seeddataXDB LONG
seeddata.regress.rdb LONG
rawXDB LONG
raw LONG
dmm BASIC SELECT LONG
7 rows selected.
清除數(shù)據(jù)字典里的內(nèi)容:
SQL> begin
2 dbms_service.delete_service(service_name=>'dmm');
3 end;
4 /
PL/SQL procedure successfully completed.
再次查詢數(shù)據(jù)字典,沒有了數(shù)據(jù)。清除完成
SQL> select name,failover_method,failover_type,goal,clb_goal from dba_services;
NAME FAILOVER_METHOD FAILOVER_TYPE GOAL CLB_G
-------------------- --------------- ----------------------- -----
SYS$BACKGROUND NONE SHORT
SYS$USERS NONE SHORT
seeddataXDB LONG
seeddata.regress.rdb LONG
rawXDB LONG
raw LONG
6 rows selected.