00600 ora 关闭oracle_Oracle集群高可用故障切换
原文鏈接
[WK-T]ORACLE 10G 配置故障轉移(Failover)?blog.itpub.net文章參考:《大話 Oracle RAC 集群 高可用性 備份與恢復》 張曉明 編著
Oracle RAC 同時具備HA(High Availiablity) 和LB(LoadBalance). 而其高可用性的基礎就是Failover(故障轉移). 它指集群中任何一個節點的故障都不會影響用戶的使用,連接到故障節點的用戶會被自動轉移到健康節點,從用戶感受而言, 是感覺不到這種切換。
Oracle 10g RAC 的Failover 可以分為3種:
1. Client-Side Connect time Failover
2. TAF
3. Service-Side TAF
注意事項: 不能在listener.ora 文件中設置GLOBAL_NAME, 因為這個參數會禁用Connect-time Failover 和 Transparent Application Failover.
一.Client-Side Connect Time Failover
Client-Side Connect Time Failover的含義:如果用戶端tnsname 中配置了多個地址,用戶發起連接請求時,會先嘗試連接地址表中的第一個地址,如果這個連接嘗試失敗,則繼續嘗試使用第二個地址,直至連接成功或者遍歷了所有的地址。
這種Failover的特點:只在建立連接那一時刻起作用,也就是說,這種Failover方式只在發起連接時才會去感知節點故障,如果節點沒有反應,則自動嘗試地址列表中的下一個地址。一旦連接建立之后,節點出現故障都不會做處理,從客戶端的表現就是會話斷開了,用戶程序必須重新建立連接。
啟用這種Failover的方法就是在客戶端的tnsnames.ora中添加FAILOVER=ON 條目,這個參數默認就是ON,所以即使不添加這個條目,客戶端也會獲得這種Failover能力。
示例:
在客戶端的tnsnames.ora 配置如下:
批注:SERVER = DEDICATED 表示專用服務器模式設置,數據庫將為每一個客戶機連接分配專用資源。當預期客戶機連接總數較小,或客戶機向數據庫發出的請求持續時間較長,使用該模式;SERVER = SHARED 表示共享服務器模式,多個客戶端連接共享一個數據庫分配的資源池,當大量用戶需要同時連接數據庫并且有效地利用系統資源時,使用此模式。
客戶端連接測試:
1)會優先從節點rac1連接數據庫
2)如果節點rac1出現故障,客戶端的會話就會斷開,不會自動連接到其他正常節點,需要重啟會話建立連接
[oracle@rac1 ~]$ srvctl status instance -d orcl -i orcl1
Instance orcl1 is running on node rac1
[oracle@rac1 ~]$ srvctl stop instance -d orcl -i orcl1
[oracle@rac1 ~]$ srvctl status instance -d orcl -i orcl1
Instance orcl1 is not running on node rac1
3)當rac1實例恢復正常之后,新的會話還會優先通過該節點連接數據庫
[oracle@rac1 ~]$ srvctl status instance -d orcl -i orcl1
Instance orcl1 is not running on node rac1
[oracle@rac1 ~]$ srvctl start instance -d orcl -i orcl1
[oracle@rac1 ~]$ srvctl status instance -d orcl -i orcl1
Instance orcl1 is running on node rac1
二. TAF(Transparent Application Failover)
客戶端連接故障切換最大的問題是,建立連接后如果節點發生故障,是不能做到故障轉移的,這樣數據庫的可用性就會大打折扣,所以oracle又提供了TAF的方法來解決連接時的故障切換,所謂TAF,就是連接建立以后,應用系統運行過程中,如果某個實例發生故障,連接到這個實例上的用戶會被自動遷移到其他的健康實例上。對于應用程序而言,這個遷移過程是透明的,不需要用戶的介入,當然,這種透明要是有引導的,因為用戶的未提交事務會回滾。 相對與Client-Side Connect Time Failover的用戶程序中斷,拋出連接錯誤,用戶必須重啟應用程序,TAF 這種方式在提高HA上有了很大的進步。
TAF 的配置也很簡單,只需要在客戶端的tnsnames.ora中添加FAILOVER_MODE配置項。這個條目有4個子項目需要定義。
1.METHOD: 用戶定義何時創建到其實例的連接,有BASIC和PRECONNECT兩種可選值。
BASIC: 是指在感知到節點故障時才創建到其他實例的連接。
PRECONNECT: 是在最初建立連接時就同時建立到所有實例的連接,當發生故障時,立刻就可以切換到其他鏈路上。
兩種方法比較: BASIC方式在Failover時會有時間延遲,PRECONNECT方式雖然沒有時間延遲,但是建立多個冗余連接會消耗更多資源。
2.TYPE:用于定義發生故障時對完成的SQL 語句如何處理,其中有2種類型:session和select.
這兩種方式對于未提交的事務都會自動回滾,區別在于對select 語句的處理,對于select,用戶正在執行的select語句會被轉移到新的實例上,在新的節點上繼續返回后續結果集,而已經返回的記錄集則拋棄。
假設用戶正在節點1上執行查詢,整個結果集共有100條記錄,現在已從節點1上返回10條記錄,這時節點1宕機,用戶連接被轉移到節點2上,如果是session模式,則需要重新執行查詢語句;如果是select方式,會從節點2上繼續返回剩下的90天記錄,而已經從節點1返回的10條記錄不會重復返回給用戶,對于用戶而言,感受不到這種切換。
顯然為了實現select 方式,Oracle 必須為每個session保存更多的內容,包括游標,用戶上下文等,需要更多的資源也是用資源換時間的方案。
3.DELAY和RETRIES 這兩個參數代表重試間隔時間和重試次數。
示例:
在客戶端的tnsnames.ora 配置如下:
客戶端連接測試:
1)因為節點rac1是正常的,所以會從該節點連接到數據庫
2)關閉節點rac1,當前會話會自動切換到正常節點連接數據庫
補充:查看用戶連接的TAF配置,如下
批注:查詢結果中如果是NONE,說明這個連接沒有使用TAF;如果和客戶端tnsnames.ora配置中的相同,說明使用了TAF。
三.Service-Side TAF
Service-Side TAF,服務器透明故障轉移可以看作是TAF的一個變種。首先Service-Side TAF也是TAF,所有TAF的特點它都具有;其次,這種TAF是在服務器
上配置的,而不像TAF在客戶端配置的。
Client-Side TAF 配置過程需要修改客戶端的tnsnames.ora文件,如果有很多客戶端使用這個數據庫,那么每次微小的參數調整都要把所有客戶端的
tnsnames.ora都調整一遍,既低效又易出錯。而Service-Side TAF通過結合Service,在數據庫里保存FAIL-MODE的配置,把所有的TAF配置保存在數據字典
中,從而省去了客戶端的配置工作。
從配置參數而言,Service-Side TAF和TAF相比多了一個Instance Role 的概念。所謂實例Instance Role就是當多個Instance參與一個Service時,可以配置優化
使用哪一個Instance為用戶提供服務。用戶共享兩種可選角色。
PREFERRED:首選實例,會優先選擇擁有這個角色的實例提供服務。
AVAILABLE:后備實例,用戶連接會優先選擇PREFERRED的Instance,當PREFERRED的Instance不可用時,才會轉到AVAILABLE的Instance上。
要使用Service-Side TAF必須配置Service。Service 可以在創建數據庫時創建,也可以在數據庫創建之后修改;既可以通過配置向導也可以通過命令方式進行
配置。
下面分別演示采用DBCA和手工兩種方式配置Service的過程。
方式一:使用DBCA配置Service
1)oracle用戶下運行DBCA出現歡迎界面
2)在已有的RAC數據庫上創建新的Service,此處選擇"Service Management"
3)選擇要配置Service的數據庫
4)添加Service名字以及定義實例角色
5)查看配置的Service是否創建成功
[oracle@rac1 ~]$ crs_stat -t -v
Name Type R/RA F/FT Target State Host
----------------------------------------------------------------------
ora.HHPEN1.db application 0/1 0/1 OFFLINE OFFLINE
ora.orcl.db application 0/1 0/1 ONLINE ONLINE rac2
ora....l1.inst application 0/5 0/0 ONLINE ONLINE rac1
ora....l2.inst application 0/5 0/0 ONLINE ONLINE rac2
ora...._TAF.cs application 0/0 0/1 ONLINE ONLINE rac1
ora....cl1.srv application 0/0 0/0 ONLINE ONLINE rac1
ora....SM1.asm application 0/5 0/0 ONLINE ONLINE rac1
ora....C1.lsnr application 0/5 0/0 ONLINE ONLINE rac1
ora.rac1.gsd application 0/5 0/0 ONLINE ONLINE rac1
ora.rac1.ons application 0/3 0/0 ONLINE ONLINE rac1
ora.rac1.vip application 0/0 0/0 ONLINE ONLINE rac1
ora....SM2.asm application 0/5 0/0 ONLINE ONLINE rac2
ora....C2.lsnr application 0/5 0/0 ONLINE ONLINE rac2
ora.rac2.gsd application 0/5 0/0 ONLINE ONLINE rac2
ora.rac2.ons application 0/3 0/0 ONLINE ONLINE rac2
ora.rac2.vip application 0/0 0/0 ONLINE ONLINE rac2
SQL> show parameter service;
NAME TYPE VALUE
------------------------------------ -------- ------------------------------
service_names string orcl, orcl_TAF6)如果客戶端想要通過service方式連接數據庫,需要在TNS條目中使用service_name方式引用數據庫。
7)修改Service的TAF配置,需要使用dbms_service.modify_service
批注:無論使用DBCA還是srvctl命令來配置Service,都無法配置TAF的type、delay、retries這三個屬性。必須使用dbms_service包來修改這些屬性。
8)確認修改已經生效
方式二:使用命令配置Service
1)創建Service語法如下:
srvctl add service -d -s -r "preferred-instance-list" -a "avaiable-instance-list" -p
批注:其中TAF-policy選項可以是BASIC或PRECONNECT
2)查看配置
srvctl config service -d database-name [-s service-name] [-a]
客戶端連接測試:
在ORACLE 10G中配置了Service-Side TAF之后,客戶端甚至不需要tnsnames.ora文件,而是使用ORACLE 10G提供的新連接方法Easy Connect Naming
Methods。為了展示這一特性,測試之前先把客戶端的tnsnames.ora文件改名存放,以保證客戶端在沒有TNS的情況下進行這個測試。使用Easy Connect
Naming Methods時的連接串格式如下:
username/password@[//]host[:port][/service_name]
客戶端連接操作如下:
批注:該連接對應的server process的OS PID是14469,在操作系統上殺掉這個進程。
[oracle@rac1 ~]$ ps -ef|grep 14469
oracle 14469 1 0 19:47 ? 00:00:00 oracleorcl1 (LOCAL=NO)
oracle 18000 17607 0 19:50 pts/3 00:00:00 grep 14469
[oracle@rac1 ~]$ kill -9 14469當前會話查詢實例名和運行狀態,此時會話已斷開如下:
批注:按理說應該會跳轉到rac2節點上,肯定哪個地方配置錯了,稍后重新再看看。
上述方法沒奏效,我選擇關閉節點rac1的實例,驗證結果。
補充:相同環境進行測試failover
1.客戶端連接并查詢會話ID
2.通過session ID在服務器端操作系統中刪除該會話連接
3.會話并沒有斷開,服務器為其分配一個新的session ID
批注:當客戶端連接集群數據庫時,由于某些原因session ID被異常終端,已經配置了服務器端的故障轉移,該會話并不會終端,而是服務器為其分配一個
新的session ID,繼續通過當前會話為用戶提供對數據庫的操作。如果當前會話連接的實例宕掉,會自動去尋找備用實例。
總結
以上是生活随笔為你收集整理的00600 ora 关闭oracle_Oracle集群高可用故障切换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python小孩的报酬_孩子做了家务,家
- 下一篇: 怎么把文件放到docker容器里