oracle HA 高可用性具體解釋(之中的一個)


oracle HA 高可用性具體解釋(之二,深入解析TAF,以及HA框架) :http://blog.csdn.net/panfelix/article/details/38436197


一、HA

FAILOVER,Oracle RAC的高可用性的技術基礎是Failover,就是指集群中的熱河一個節點的故障都不會影響到用戶的使用,連接到故障節點的用戶會被自己主動轉移到健康節點,從用戶高手而言感覺不到這樣的切換,這個功能在Oracle中被稱作Failover(故障轉移)。

Oracle RAC的Failover能夠細分為3中,各自是:

(1)  Client-Side Connect time Failover;

(2)  TAF;

(3)  Server-side TAF;

注意:

不要再listener.ora中設置GLOBAL_DB_NAME,由於這個參數會禁用Connect-time Failover和TransparentApplication Failover。

 

Client-Side Connect time Failover

Client-Side Connect timeFailover的含義是:假設clienttnsname中配置了多個地址,用戶發起請求時,會先嘗試連接地址表中的第一個地址,假設這個連接嘗試失敗,則會繼續嘗試使用第二個地址,直至連接成功或者遍歷了全部的地址。

這樣的Failover的特點從他的名稱中“connect time”就表達的非常清楚了,僅僅在建立連接的那一時刻起作用。也就是說這樣的Failover方式僅僅在發起連接時採取感知節點故障,假設發現節點沒有響應,則自己主動嘗試地址列表的下一個地址。一旦連接建立以后,節點出現問題都不會做處理,從client的表現來看就是斷開,用戶程序必須又一次建立連接。

啟用這樣的Failover的方法就是在client的tnsnames.ora中加入FAILOVER=ON條目,這個參數默認就是ON,所以即使不加入這個條目,client也會獲得這樣的Failover能力。

 

TAF(Transparent Apllication Failover)

從上文對Client-Side Connecttime Failover特點的分析能夠看出,這樣的failover的意義有限。下載大部分流行的應用系統(比方WebLogic,JBOSS)都是啟動時就建立若干到數據庫的長連接,在應用程序整個生命周期內重用這些連接。Client-Side Connect Time Failover的工作方式是它相應用程序的可用性沒有極大地幫助。

從8.1.5版本號Oracle引入了新的Failover機制TAF.所謂TAF,就是連接建立以后,應用程序執行過程中,假設某個實例發生問題,連接到這個實例上的用戶會被自己主動遷移到其它的健康實例上。對於應用程序而言,這個千億過程透明、不須要用戶的介入,當然這樣的透明也是有引號的,由於用戶的未提交事務會回滾。相對於Client-Side Connect Time Failover的用戶程序被中斷、拋出連接錯誤、用戶必須中期應用程序,TAF這樣的方式在提高應用程序HA能力上無疑是前進了一大步。

TAF的配置也非常easy,僅僅須要在client的tnsnames.ora中加入FAILOVER_MODE配置項,這個條目有4個子項目須要定義。

 

 

FRAC =

 (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = frac1-vip)(PORT = 1521))

    (ADDRESS = (PROTOCOL = TCP)(HOST = frac2-vip)(PORT = 1521))

     (LOAD_BALANCE=YES)

      (

 CONNECT_DATA=

    (SERVER=DEDICATED)

 (SERVICE_NAME=FRAC)

 (

   FAILOVER_MODE=

(TYPE=session)

(METHOD=basic)

(RETRIES=180)

(DELAY=5)

 )

      )

    )

 

(1)  METHOD選項用於定義何時創建到其它實例的連接,有BASIC和PERCONNECT兩個選項值。

a. BASIC是指在感知到節點故障時才創建到其它實例的連接。

b. PERCONNECT是在最初建立連接時就同一時候建立到全部實例的連接,當發生問題時,立馬就能夠切換到其它鏈路上。

兩種方法的不同非常easy比較。BASIC方式在Faiover時會有時間言辭,PERCONNECT方式盡管沒有時間言辭,可是再建立多個冗余兩節會消耗很多其它的資源,兩者就是用時間換資源和資源換時間的差別。

 

(2)  Type選項用於定於發生問題時對完畢的SQL語句怎樣處理,其有兩種類型:session和select。

這兩種方式對於未提交的事務都自己主動回滾。差別在於對於select語句的處理,對於select類型,用戶正在運行的select語句也會被轉移到新的實力上,在新節點上繼續返回興許結果集,而已經返回的記錄結果集拋棄。

假設用戶正在節點1上運行查詢,整個結果集共同擁有100條記錄,如今一從節點1上返回10條記錄,這時節點1宕機,用戶連接被轉移到節點2上,假設是session方式則須要又一次運行查詢語句;假設是select方式會從節點2上繼續返回剩下的90條記錄,二已經從節點1返回的10條記錄不會反復返回給用戶,對於用戶而言感覺不到這樣的切換。

非常顯然為了實現select方式,oracle必須為每一個session保存很多其它的內容,包含游標、用戶、上下文等,須要很多其它的資源也是用資源換時間的方案。

(3)  DELAY和RETRIES這兩個參數和簡單,代表着重試時間間隔和重試次數。

 

 

Failover(TAF)的測試借助於前面監聽和tnsnames的配置,而在11G R2沒有引入之前出現問題用的是直接用集群的vip“漂”進行故障轉移,而在11G R2以后,引入了一個新的ip,即SCAN(SingleClient Access Name)IP,Scan是一個域名,能夠解析1到3個scan ip,client能夠通過SCAN名解析來訪問數據庫,其優點就是加入和刪除節點時不須要再有額外的client維護,大大降低了維護方面的繁瑣工作。

在集群環境中,我們配置的client是以scan ip的方式進行配置的。當我們某個用戶在外面連接進來的時候,集群會自己主動的依據負載把該會話連接到一個特定的實例,假設該會話正在select一個表,還未完畢,該實例宕機了,oracle會自己主動將故障節點的失誤切換到還有一個實例中運行,這種切換對於用戶來說是透明的。用戶不會感覺到異常,所運行操作也將返回正常的結果,這個也是RAC集群的高可用性所在。

下面是在session模式做的網絡failover測試;

首先用戶用client服務進行連接:

[oracle@frac1admin]$ sqlplus scott/oracle@frac

SQL*Plus: Release11.2.0.3.0 Production on Wed Apr 16 01:55:37 2014

Copyright (c) 1982,2011, Oracle.  All rights reserved.

Connected to:

Oracle Database 11gEnterprise Edition Release 11.2.0.3.0 - 64bit Production

With thePartitioning, Real Application Clusters, Automatic Storage Management, OLAP,

Data Mining and RealApplication Testing options

SQL> showparameter instance_name

NAME                                 TYPE                   VALUE

---------------------------------------------------------- ------------------------------

instance_name                        string                 FRAC2

 

 

SQL> create tablebig_a as select * from dba_objects;

 

SQL>insert intobig_a select * from big_a;

 

為了保證數據的充足性,多運行幾次上面insert語句,因為磁盤空間限制,我在此運行了4次,共1203888條記錄。

由以上信息可知用戶連接到frac2實例,此時能夠運行一些DML操作:

SQL> selectOBJECT_TYPE,count(*) from big_a group by object_type;

在查詢未完畢之前,把frac2實例進行宕機,會返回例如以下錯誤:

SQL> shutdownabort;

ORACLE instance shutdown.

 

 

SQL> selectOBJECT_TYPE,count(*) from dba_objects group by object_type;

selectOBJECT_TYPE,count(*) from dba_objects group by object_type

*

ERROR at line 1:

ORA-25408: can notsafely replay call

再次查看的是時候發現已經把會話自己主動切換到frac1實例:

SQL> /

OBJECT_TYPE                              COUNT(*)

------------------------------------------------

EDITION                                         1

INDEX PARTITION                               302

TABLESUBPARTITION                             32

CONSUMER GROUP                                 25

SEQUENCE                                      229

TABLE                                        2936

INDEX                                        5266

SYNONYM                                     28152

VIEW                                         5186

FUNCTION                                      305

JAVA CLASS                                  23165

JAVA SOURCE                                     2

INDEXTYPE                                       9

CLUSTER                                        10

TYPE                                         2913

RESOURCE PLAN                                  10

JOB                                            14

EVALUATIONCONTEXT                             15

45 rows selected.

 

SQL> showparameter instance_name;

NAME                                 TYPE                                     VALUE

---------------------------------------------------------------------------- ------

instance_name                        string                                   FRAC1

SQL> !hostname

frac1

Server-Side TAF

第三種方式是Server-Side TAF,但從名字上就能夠猜出這樣的方式和之前的TAF有一定的關系。其實也是這樣,能夠把Server-Side TAF看做是TAF的一個變種。首先Server-Side TAF也是TAF,全部TAF的特點他都具有;其次,這樣的TAF是在server上配置,而不像TAF是在client配置的。

前面介紹的Client-Side TAF,配置過程須要改動clienttnsnames.ora文件,假設有非常多client使用這個數據庫,那么每次微小的參數調整都要把書友計算機更改一遍,即低效又易出錯。而Server-Side TAF通過結合Service,在數據庫里保存FAIL_MODE的配置,把全部的TAF配置保存在數據字典里,從而省去了client的配置工作,如今client的TNS文件就不須要不論什么TAF的配置選項。

從配置參數而言,Service-Side TAF相比多了一個Instance Role(實力角色)的概念。所謂實力角色,就是當有多個Instance參與一個Service時,能夠配置有限使用哪一個Instance為用戶提供服務。用戶總共同擁有兩種可選角色。

a.    PREFERRED:首選實例,會優先選擇擁有這個角色的實例提供服務。

b.    AVILABLE:后備實例,用戶會優先連接PREFERRD的Instance,當PREFERRED的Instance不可用時,才會被轉移到AVILABLE的實例上。

 

要想使用Server-Side TAF必須配置Server。Server能夠在創建數據庫時創建,也能夠在數據庫創建之后改動;既能夠通過配置向導也能夠通過命令行方式配置。以下分別演示用DBCA和手工兩種方式配置Service的過程。




1.用DBCA配置Service

 



 




 

實例1作為首選實例,TAF police選擇basic,參考上圖;



 

 

查看配置信息:

[root@felix1bin]# ./srvctl config service -d felix -h

Usage:srvctl config service -d <name> [-s <service_name>] [-a] [-S<level>]

    -d <name>           Unique name for the database

    -s <service>        Service name

    -a                  Additional attributes

    -S <level>          Additional information for EM Console

    -h                  Print usage

 

 [root@felix1bin]# ./srvctl config service -d felix

taf_server PREF: felix1 AVAIL: felix2

[root@felix1 bin]#

 

[root@felix1 bin]# ./srvctl config service -dfelix -s taf_server -a

taf_server PREF: felix1 AVAIL: felix2 TAF:basic

[root@felix1 bin]#

 

 

 

2.用srvctl命令配置service

 

除了用DBCA圖形方式,還能夠使用命令方式配置service,這樣的方法對於維護遠程尤事實上用。不管是創建還是維護都是用一個命令srvctl,先看一下srvctl命令和service相關的語法,例如以下:

創建service

[oracle@felix1 ~]$ srvctl add service -h

Usage: srvctl add service -d <name> -s<service_name> -r "<preferred_list>" [-a"<available_list>"] [-P <TAF_policy>]

    -d<name>           Unique name forthe database

    -s<service>        Service name

    -r"<pref_list>"    List ofpreferred instances

    -a"<avail_list>"   List ofavailable instances

    -P<TAF_policy>     TAF policy (NONE,BASIC, or PRECONNECT)

Usage: srvctl add service -d <name> -s<service_name> -u {-r "<new_pref_inst>" | -a"<new_avail_inst>"}

    -d<name>           Unique name forthe database

    -s <service>        Service name

    -u                  Add a new instance to serviceconfiguration

    -r<new_pref_inst>  Name of newpreferred instance

    -a<new_avail_inst> Name of new available instance

    -h                  Print usage

[oracle@felix1 ~]$

示比例如以下:

Felix1,felix2為實例名;Felix是數據庫名;策略是:BASIC

[oracle@felix1~]$ srvctl add service -d felix -s taf_srvctl -r felix2 -a felix1 -P BASIC

[oracle@felix1~]$

 

查看service配置

[oracle@felix1 ~]$ srvctl config service -d felix-a

taf_server PREF: felix1 AVAIL: felix2 TAF: basic

taf_srvctl PREF: felix2 AVAIL: felix1 TAF: BASIC

[oracle@felix1 ~]$

 

[oracle@felix1 ~]$ srvctl config service -d felix-h

Usage: srvctl config service -d <name> [-s<service_name>] [-a] [-S <level>]

    -d<name>           Unique name for the database

    -s<service>        Service name

    -a                  Additional attributes

    -S<level>          Additionalinformation for EM Console

    -h                  Print usage

[oracle@felix1 ~]$

假設不指定“-s service_name”,就會顯示全部的service配置,這些配置僅僅包含preferred和avilable instance。使用-a選項,還會顯示TAF的信息。

 

是否自己主動執行

數據庫啟動時,會自己主動啟動全部的service。有時為了維護的須要,須要禁用這個特性。在維護完畢之后再啟動這個特性。

 

[oracle@felix1 ~]$ srvctl disable service -h

Usage: srvctl disable service -d <name> -s"<service_name_list>" [-i <inst_name>]

    -d<name>           Unique name forthe database

    -s"<serv,...>"     Commaseparated service names

    -i<inst>           Instance name

    -h                  Print usage

[oracle@felix1 ~]$

 

[oracle@felix1 ~]$ srvctl disable service -d felix-s taf_server -i felix1

[oracle@felix1 ~]$ srvctl config service -d felix-a

taf_server PREF: felix1 AVAIL: felix2 TAF: basic

Service taf_server is disabled on instance(s) felix1.

taf_srvctl PREF: felix2 AVAIL: felix1 TAF: BASIC

[oracle@felix1 ~]$

 

[oracle@felix1 ~]$ srvctl disable service -d felix-s taf_server

PRKP-1024 : The service taf_server is stillrunning.

 

關閉服務service並diable:

 

[oracle@felix1 ~]$ srvctl stop service -h

Usage: srvctl stop service -d <name> [-s"<service_name_list>" [-i <inst_name>]] [-f]

    -d<name>           Unique name forthe database

    -s"<serv,...>"     Commaseparated service names

    -i<inst>           Instance name

    -f                  Disconnect all sessionsduring stop or relocate service operations

    -h                  Print usage

[oracle@felix1 ~]$ srvctl stop service  -d felix -staf_server

[oracle@felix1 ~]$ srvctl config service -d felix-a

taf_server PREF: felix1 AVAIL: felix2 TAF: basic

taf_srvctl PREF: felix2 AVAIL: felix1 TAF: BASIC

[oracle@felix1 ~]$ srvctl disable service -d felix-s taf_server

[oracle@felix1 ~]$ srvctl config service -d felix-a

taf_server PREF: felix1 AVAIL: felix2 TAF: basic

Service taf_server is disabled.

taf_srvctl PREF: felix2 AVAIL: felix1 TAF: BASIC

[oracle@felix1 ~]$

啟動service

[oracle@felix1 ~]$ srvctl start service  -h

Usage: srvctl start service -d <name> [-s"<service_name_list>" [-i <inst_name>]] [-o<start_options>]

    -d<name>           Unique name forthe database

    -s"<serv,...>"     Commaseparated service names

    -i<inst>           Instance name

    -o<start_options>  Options to startupcommand (e.g. open, mount, or nomount)

    -h                  Print usage

[oracle@felix1 ~]$

 

[oracle@felix1 ~]$ srvctl start service  -d felix -s taf_server

[oracle@felix1 ~]$

 

查看service狀態。

[oracle@felix1 ~]$ srvctl status  service -h

Usage: srvctl status service -d <name> [-s"<service_name_list>"] [-f] [-v] [-S <level>]

    -d<name>           Unique name forthe database

    -s"<serv,...>"     Comma separatedservice names

    -f                  Include disabled applications

    -v                  Verbose output

    -S<level>          Additionalinformation for EM Console

    -h                  Print usage

[oracle@felix1 ~]$

 

[oracle@felix1 ~]$ srvctl status  service -d felix -s taf_server -f -v

Service taf_server is running on instance(s)felix2

[oracle@felix1 ~]$ srvctl status  service -d felix -s taf_server -f -v -S 3

#@=info: operation={status} config={full}ver={10.2.0.0.0}

#@=service[0]: name={taf_server} enabled={true}pref={felix1} avail={felix2} disabled_insts={felix1} tafpolicy={basic}type={user}

#@=service[1]: name={felix} enabled={true}pref={felix1, felix2} avail={} disabled_insts={} tafpolicy={NONE}type={internal}

Service taf_server is running on instance(s)felix2

#@=result[0]: up={felix2} down={felix1}disabled={felix1} unknown={}

#@=result[1]: up={felix1, felix2} down={}disabled={} unknown={}

#@=done: status={0}

[oracle@felix1 ~]$

 

刪除service。

[oracle@felix1 ~]$ srvctl remove service -h

Usage: srvctl remove service -d <name> -s<service_name> [-i <inst_name>] [-f]

    -d<name>           Unique name forthe database

    -s<service>        Service name

    -i<inst>           Instance name

    -f                  Force remove

    -h                  Print usage

[oracle@felix1 ~]$

 

[oracle@felix1 ~]$ srvctl status service -d felix

Service taf_server is running oninstance(s) felix1

Service taf_srvctl is not running.

[oracle@felix1 ~]$ srvctl remove service -d felix-s taf_server -i felix1

taf_server PREF: felix1 AVAIL: felix2

Remove service taf_server from the instancefelix1? (y/[n]) y

PRKP-1024 : The service taf_server is still running.

[oracle@felix1 ~]$

 

[oracle@felix1 ~]$ srvctl remove service -d felix-s taf_srvctl -i felix1

taf_srvctl PREF: felix2 AVAIL: felix1

Remove service taf_srvctl from the instancefelix1? (y/[n]) y

PRKP-1067 : Instance felix1 is the last availableinstance for service taf_srvctl. Try modify service instead.

[oracle@felix1 ~]$ srvctl config  service -d felix -a

taf_server PREF: felix1 AVAIL: felix2 TAF: basic

taf_srvctl PREF: felix2 AVAIL: felix1 TAF: BASIC

[oracle@felix1 ~]$

 

[oracle@felix1 ~]$ srvctl remove service -d felix -staf_srvctl  -f

[oracle@felix1 ~]$ srvctl config  service -d felix -a

taf_server PREF: felix1 AVAIL: felix2 TAF: basic

[oracle@felix1 ~]$ srvctl remove service -d felix-s taf_server  -f

PRKP-1024: The service taf_server is still running.

[oracle@felix1 ~]$ srvctl stop service -d felix -staf_server 

[oracle@felix1 ~]$ srvctl remove service -d felix-s taf_server  -f

[oracle@felix1 ~]$ srvctl config  service -d felix -a

[oracle@felix1 ~]$

改動服務

[oracle@felix1 ~]$ srvctl modify service -h

Usage: srvctl modify service -d <name> -s<service_name> -i <old_inst_name> -t <new_inst_name> [-f]

    -d<name>           Unique name forthe database

    -s<service>        Service name

    -i<old_inst>       Old instance name

    -t<new_inst>       New instance name

    -f                  Disconnect all sessionsduring stop or relocate service operations

Usage: srvctl modify service -d <name> -s<service_name> -i <avail_inst_name> -r [-f]

    -d<name>           Unique name forthe database

    -s<service>        Service name

    -i<inst>           Instance name

    -r                  Upgrade instance to preferred

    -f                  Disconnect all sessionsduring stop or relocate service operations

Usage: srvctl modify service -d <name> -s<service_name> -n -i <prefered_inst> [-a <available_list>][-f]

    -d<name>           Unique name forthe database

    -s<service>        Service name

    -n                  Modify service configuration

    -r"<pref_list>"    List ofpreferred instances

    -a"<avail_list>"   List ofavailable instances

    -f                  Disconnect all sessions during stopor relocate service operations

Usage: srvctl modify service -d <name> -s<service_name> -P <TAF_policy> [-f]

    -d<name>           Unique name forthe database

    -s<service>        Service name

    -P<TAF_policy>     TAF policy (NONE,BASIC, or PRECONNECT)

    -f                  Disconnect all sessionsduring stop or relocate service operations

    -h                  Print usage

[oracle@felix1 ~]$

 

[oracle@felix2 ~]$ srvctl modify service -d felix-s taf_srvctl -n -i felix1,felix2 -f

[oracle@felix2 ~]$ srvctl config  service -d felix  -a

taf_srvctlPREF: felix1 felix2 AVAIL:  TAF: basic

[oracle@felix2 ~]$

 

 

 

3.Service創建演示樣例:

 

在使用srvctl創建service時,須要注意TAF策略選項必須通過dbms_service包來配置。以下樣例演示了怎樣創建一個服務felix_ora:

1.創建之前查看系統現有的service:

SQL> show parameter service

 

NAME                                 TYPE        VALUE

------------------------------------ -----------------------------------------

service_names                        string      felix

SQL>

2.使用srvctl創建felix_ora服務;

[oracle@felix1 ~]$ srvctl add service -d felix -s felix_ora -r felix1 -a felix2 -P BASIC

[oracle@felix1 ~]$ 

[oracle@felix1 ~]$ srvctl config service -d felix-a

felix_ora PREF: felix1 AVAIL: felix2 TAF: BASIC

[oracle@felix1 ~]$ srvctl status  service -d felix

Service felix_ora is not running.

[oracle@felix1 ~]$

3.確認服務創建成功,下面標紅部分說明服務已經作為一項CRS Resource注冊到CRS中,可是眼下沒有啟動。

[oracle@felix1 ~]$ crs_stat -t  -v

Name          Type           R/RA   F/FT  Target    State     Host       

----------------------------------------------------------------------

ora.felix.db  application    0/0    0/1   ONLINE    ONLINE    felix1     

ora....x1.inst application    0/5   0/0    ONLINE    ONLINE   felix1     

ora....x2.inst application    0/5   0/0    ONLINE    ONLINE   felix2     

ora...._ora.cs application   0/0    0/1    OFFLINE  OFFLINE              

ora....ix1.srv application   0/0    0/0    OFFLINE  OFFLINE               

ora....SM1.asm application    0/5   0/0    ONLINE    ONLINE   felix1     

ora....X1.lsnr application    0/5   0/0    ONLINE    ONLINE   felix1     

ora.felix1.gsd application    0/5   0/0    ONLINE    ONLINE   felix1     

ora.felix1.ons application    0/3   0/0    ONLINE    ONLINE   felix1     

ora.felix1.vip application    0/0   0/0    ONLINE    ONLINE   felix1     

ora....SM2.asm application    0/5   0/0    ONLINE    ONLINE   felix2     

ora....X2.lsnr application    0/5   0/0    ONLINE    ONLINE   felix2     

ora.felix2.gsd application    0/5   0/0    ONLINE    ONLINE   felix2     

ora.felix2.ons application    0/3   0/0    ONLINE    ONLINE   felix2     

ora.felix2.vip application    0/0   0/0    ONLINE    ONLINE   felix2     

[oracle@felix1 ~]$

4.配置服務自己主動啟動

[oracle@felix1 ~]$ srvctl enable service -d felix-s felix_ora

PRKP-1018 : Service felix_ora already enabled.

[oracle@felix1 ~]$

5.啟動這個服務

[oracle@felix1 ~]$ srvctl start  service -d felix -s felix_ora

[oracle@felix1 ~]$

[oracle@felix1 ~]$ srvctl status  service -d felix -s felix_ora

Service felix_ora is running on instance(s) felix1

[oracle@felix1 ~]$

6.確認服務狀態;

[oracle@felix2 ~]$ crs_stat  -t  -v

Name          Type           R/RA   F/FT  Target    State     Host       

----------------------------------------------------------------------

ora.felix.db  application    0/0    0/1   ONLINE    ONLINE    felix1     

ora....x1.inst application    0/5   0/0    ONLINE    ONLINE   felix1     

ora....x2.inst application    0/5   0/0    ONLINE    ONLINE   felix2     

ora...._ora.cs application   0/0    0/1    ONLINE   ONLINE    felix1     

ora....ix1.srv application   0/0    0/0    ONLINE   ONLINE    felix1     

ora....SM1.asm application    0/5   0/0    ONLINE    ONLINE   felix1     

ora....X1.lsnr application    0/5   0/0    ONLINE    ONLINE   felix1     

ora.felix1.gsd application    0/5   0/0    ONLINE    ONLINE   felix1     

ora.felix1.ons application    0/3   0/0    ONLINE    ONLINE   felix1     

ora.felix1.vip application    0/0   0/0    ONLINE    ONLINE   felix1     

ora....SM2.asm application    0/5   0/0    ONLINE    ONLINE   felix2     

ora....X2.lsnr application    0/5   0/0    ONLINE    ONLINE   felix2     

ora.felix2.gsd application    0/5   0/0    ONLINE    ONLINE   felix2     

ora.felix2.ons application    0/3   0/0    ONLINE    ONLINE   felix2     

ora.felix2.vip application    0/0   0/0    ONLINE    ONLINE   felix2     

[oracle@felix2 ~]$

說明已經所有啟動了;

新建的服務會自己主動加入到初始化參數文件里:

SQL> show parameter service

 

NAME                                 TYPE        VALUE

------------------------------------ -----------------------------------------

service_names                        string      felix, felix_ora

SQL>

7.改動service的TAF配置,須要使用dbms_service.modify_service

begin

 dbms_service.modify_service(service_name     =>'felix_ora',

                             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.確認以生效

 

Set lines 1000 pages 1000

col name for a50

col clb_goal for a15

col FAILOVER_METHOD  for a15

col failover_type for a20;

SQL> selectname,failover_method,failover_type,clb_goal from dba_services;

 

NAME                                              FAILOVER_METHOD FAILOVER_TYPE       CLB_GOAL

----------------------------------------------------------------- -------------------- ---------------

SYS$BACKGROUND                                                                         SHORT

SYS$USERS                                                                              SHORT

seeddataXDB                                                                            LONG

seeddata.regress.rdbms.dev.us.oracle.com                                               LONG

felixXDB                                                                                LONG

felix                                                                                  LONG

taf_server                                                                             LONG

taf_srvctl                                                                             LONG

felix_ora                                         BASIC           SELECT               LONG

 

9 rows selected.

 

[oracle@felix1 ~]$ srvctl config  service -d felix -a

felix_ora PREF: felix1 AVAIL: felix2 TAF: BASIC

[oracle@felix1 ~]$

 

4.配置service的注意事項

不管是通過DBCA圖形化工具還是srvctl手工方式創建service,有下面幾點須要注意:

1.       數據庫的服務名是用service_name參數來指定的,一個數據庫能夠有多個服務名,可是service_name最長4KB,不要手工改動這個參數。

2.       最多能夠創建64個service,每一個數據庫有兩個隱含的service,因此留給用戶的就僅僅有62個service。不能改動這兩個隱含service的配置,而且也不能手動啟動或者停止這兩個服務,這兩個隱含service各自是SYS$BACKUPGROUD和SYS$USERS。

3.       當使用DBCA配置service時,DBCA會自己主動更新OCR,啟動service,當刪除service時,會停止service並更新OCR。

4.       使用SRVCTL這個工具時,命令僅僅會更新OCR中的配置不會更細data dictionary和listener中信息;因此須要使用dbms_sercice包來更新datadictionary,手工更改listener配置文件這里推薦使用DBCA工具來配置更改SERVICE配置。

5.       假設client想要通過sercice方式連接數據庫,須要在TNS條目中使用service_name方式引用數據庫,見以下樣例中的粗體部分:

 

TAF_SERVER =

 (DESCRIPTION =

    (ADDRESS= (PROTOCOL = TCP)(HOST = felix1-vip)(PORT = 1521))

    (ADDRESS= (PROTOCOL = TCP)(HOST = felix2-vip)(PORT = 1521))

   (LOAD_BALANCE = yes)

   (CONNECT_DATA =

     (SERVER = DEDICATED)

      (SERVICE_NAME = taf_server)

     (FAILOVER_MODE =

       (TYPE = SELECT)

       (METHOD = BASIC)

       (RETRIES = 180)

       (DELAY = 5)

      )

    )

  )

注意:

不管使用DBCA還是srvctl命令來配置service,都無法配置TAF的type,delay,retries這三個屬性,必須使用dbms_service包來改動這些屬性。

 

 

5.測試Server-Side TAF

在oracle 10g中配置Server-Side TAF之后,client甚至都不須要tnsnames.ora文件而是使用Oracle 10g提供的新連接方法Easy Connect Naming Methods。這一屆就使用這樣的方法來測試Server-SideTAF.測試之前能夠把client的tnsnames.ora文件改名存放,以保證client在沒有TNS的情況下進行這個測試。使用Easy Connecting Methods時的連接串格式例如以下:

 

username/password@[//]host[:port][/service_name]

 

(1) 從一個client連接,而且窗體一直保持打開;

[root@felix1 bin]# cat /etc/hosts

127.0.0.1      localhost

 

192.168.10.101       felix1      

192.168.10.111       felix1-vip  

192.168.20.30        felix1-priv 

 

192.168.10.102       felix2

192.168.10.122       felix2-vip

192.168.20.40        felix2-priv

 

[root@felix1 bin]#

 

 

[oracle@felix1 ~]$sqlplus scott/oracle@felix1-vip/felix_ora

 

SQL*Plus: Release 10.2.0.5.0 - Production on ThuMay 29 23:01:49 2014

 

Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.

 

 

Connected to:

Oracle Database 10g Enterprise Edition Release10.2.0.5.0 - Production

With the Partitioning, Real Application Clusters,OLAP, Data Mining

and Real Application Testing options

 

 

(2) 運行查詢

SQL> select instance_name from v$instance;

 

INSTANCE_NAME

----------------

felix2

 

SQL>

能夠看到連接到實例2上了

SQL> select name,failover_method,failover_type,clb_goal from dba_services;

 

NAME                                              FAILOVER_METHOD FAILOVER_TYPE       CLB_GOAL

----------------------------------------------------------------- -------------------- ---------------

SYS$BACKGROUND                                                                         SHORT

SYS$USERS                                                                              SHORT

seeddataXDB                                                                            LONG

seeddata.regress.rdbms.dev.us.oracle.com                                               LONG

felixXDB                                                                               LONG

felix                                                                                   LONG

taf_server                                                                             LONG

taf_srvctl                                                                             LONG

felix_ora                                          BASIC           SELECT               LONG

 

9    rows selected.

 

(3) 在實例2上,殺掉這個會話相應的server process。

 

SQL> select pid,spid from v$process

     where addr in

     (select paddr from v$session whereusername='SCOTT');

 

       PIDSPID

---------- ------------

        298154

 

SQL>

 

該連接相應的OS進程PID=8154,在OS上殺掉這個進程:

[root@felix2 ~]# ps -ef | grep  8154 |grep -v grep

oracle   8154     1  0 23:01 ?        00:00:00 oraclefelix2 (LOCAL=NO)

[root@felix2 ~]# kill  -9 8154

[root@felix2 ~]#

(4)在會話中運行語句

SQL> select instance_name from v$instance;

select instance_name from v$instance

*

ERROR at line 1:

ORA-03113: end-of-file on communication channel

等一會兒再在會話中運行

 

SQL> /

 

INSTANCE_NAME

----------------

felix2

 

SQL> /

注意:

(感覺這個實驗似乎有些問題,實驗時候還是failover到實例2上了,可是我做了一個把實例2shutdown abort的實驗,結果例如以下:

SQL>/

 

INSTANCE_NAME

----------------

felix1

這次正確failover到了實例2上,kill會話這個實驗有所不當,建議用abort;

 

(5)測試完成,清理環境,刪除service

[oracle@felix1 ~]$ srvctl stop service  -d felix -s felix_ora

[oracle@felix1 ~]$ srvctl status service  -d felix -s felix_ora

Service felix_ora is not running.

[oracle@felix1 ~]$ srvctl remove service  -d felix -s felix_ora

felix_ora PREF: felix1 AVAIL: felix2

Remove service felix_ora from the database felix?(y/[n]) y

[oracle@felix1 ~]$ srvctl config  service -d felix -a

[oracle@felix1 ~]$

注意:OCR中的內容被刪除完了,可是數據字典里還有Service的內容,繼續清除數據字典里的內容。查看數據字典內容:

SQL> selectname,failover_method,failover_type,clb_goal from dba_services;

 

NAME                                               FAILOVER_METHOD FAILOVER_TYPE        CLB_GOAL

----------------------------------------------------------------- -------------------- ---------------

SYS$BACKGROUND                                                                         SHORT

SYS$USERS                                                                              SHORT

seeddataXDB                                                                            LONG

seeddata.regress.rdbms.dev.us.oracle.com                                                LONG

felixXDB                                                                               LONG

felix                                                                                  LONG

taf_server                                                                              LONG

taf_srvctl                                                                             LONG

felix_ora                                         BASIC           SELECT               LONG

 

9 rows selected.

 

SQL>

 

刪除數據字典內容:

 

Begin

    Dbms_service.delete_service(service_name=>’felix_ora’);

End;

SQL>begin

  2 dbms_service.delete_service(service_name=>'felix_ora');

  3  end;

  4  /

 

PL/SQLprocedure successfully completed.

 

SQL>

 

在此查詢數據字典:

SQL> select name,failover_method,failover_type,clb_goalfrom dba_services;

 

NAME                                              FAILOVER_METHOD FAILOVER_TYPE       CLB_GOAL

----------------------------------------------------------------- -------------------- ---------------

SYS$BACKGROUND                                                                         SHORT

SYS$USERS                                                                              SHORT

seeddataXDB                                                                            LONG

seeddata.regress.rdbms.dev.us.oracle.com                                               LONG

felixXDB                                                                               LONG

felix                                                                                   LONG

 

6 rows selected.

 

此時,已經清除干凈!!



















免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM