[zt] Oracle RAC的Failover設定與測試

tolywang發表於2009-05-12
 

       Oracle RAC環境下,在配置TAFTransparent Application Failover)之後,如果一個節點上的例項出現了故障,Oracle會自動將會話遷移到另一個例項上。


進行TAF配置,要在客戶端的tnsname.ora中新增如下的關鍵引數:



       ( failover_mode = ( type = select ) ( method = basic ) )


       下面分別對是否在客戶端配置TAF的情況進行測試:

 


一、不配置TAF的情況


1、客戶端的tnsname.ora配置如下:



RACDB =


  (DESCRIPTION =


    (ADDRESS_LIST =


      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.171)(PORT = 1521))


    )


    (CONNECT_DATA =


      (SERVICE_NAME = racdb.chenxu.yo2.cn)


    )


  )


2、連線資料庫,檢查例項資訊



SQL> conn sys/chenxu@racdb as sysdba


已連線。


SQL> show parameter instance_name


 


NAME                                 TYPE        VALUE


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


instance_name                        string      RACDB2


3、關閉例項RACDB2



[root@NODE01 bin]# ./srvctl status database -d racdb


Instance RACDB1 is running on node node01


Instance RACDB2 is running on node node02


[root@NODE01 bin]#


[root@NODE01 bin]# ./srvctl stop instance -d racdb -i racdb2


[root@NODE01 bin]#


[root@NODE01 bin]# ./srvctl status database -d racdb


Instance RACDB1 is running on node node01


Instance RACDB2 is not running on node node02


4、再次檢查剛才連線的會話



SQL> select instance_name from v$instance;


select instance_name from v$instance


*


1 行出現錯誤:


ORA-03113: 通訊通道的檔案結束


 


SQL> select instance_name from v$instance;


ERROR:


ORA-03114: 未連線到 ORALCE


可以看到執行操作後,Oracle會報上面的錯誤。


 


二、配置TAF的情況


1、下面在客戶端的tnsname.ora檔案中配置TAF,內容如下:



RACDB =


  (DESCRIPTION =


    (ADDRESS_LIST =


      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.171)(PORT = 1521))


    )


    (CONNECT_DATA =


      (SERVICE_NAME = racdb.chenxu.yo2.cn)


      ( failover_mode = ( type = select ) ( method = basic ) )


    )


  )


2、重新開啟例項



[root@NODE01 bin]# ./srvctl start instance -d racdb -i racdb2


[root@NODE01 bin]#


[root@NODE01 bin]# ./srvctl status database -d racdb


Instance RACDB1 is running on node node01


Instance RACDB2 is running on node node02


3、重新登陸,檢查例項資訊



SQL> conn sys/chenxu@racdb as sysdba


已連線。


SQL> select instance_name from v$instance;


 


INSTANCE_NAME


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


RACDB2


4、再次關閉例項RACDB2



[root@NODE01 bin]# ./srvctl stop instance -d racdb -i racdb2


[root@NODE01 bin]# ./srvctl status database -d racdb


Instance RACDB1 is running on node node01


Instance RACDB2 is not running on node node02


5、檢查剛才的連線的會話



SQL> select instance_name from v$instance;


 


INSTANCE_NAME


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


RACDB1                  # 可以看到由原來的RACDB2變成RACDB1


可知,在沒有執行事務的操作下,可以無縫地切換到另一個節點上。


 


三、配置TAF後,當執行事務時候,能否進行切換?


       在實際的使用環境中,有些正在進行的事務,如一個節點上正在執行的DML是無法採用以上的方法切換的。下面針對這種情況進行測試:


1、兩個例項都開啟後,客戶端連線,並執行DML語句



SQL> conn sys/chenxu@racdb as sysdba


已連線。


SQL> select instance_name from v$instance;


 


INSTANCE_NAME


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


RACDB2


 


SQL> create table test as select * from dba_objects;


 


表已建立。


 


SQL> insert into test select * from dba_objects;     # 進行DML操作


 


已建立50393行。


2、關閉當前連線的例項RACDB2



[root@NODE01 bin]# ./srvctl stop instance -d racdb -i racdb2


[root@NODE01 bin]# ./srvctl status database -d racdb


Instance RACDB1 is running on node node01


Instance RACDB2 is not running on node node02


3、檢查剛才的連線的會話



SQL> select instance_name from v$instance;


select instance_name from v$instance


*


1 行出現錯誤:


ORA-25402: 事務處理必須重新執行


 


SQL> select count(*) from test;


select count(*) from test


*


1 行出現錯誤:


ORA-25402: 事務處理必須重新執行


 


SQL> commit;


commit


*


1 行出現錯誤:


ORA-25402: 事務處理必須重新執行


 


SQL> rollback;


 


回退已完成。


 


SQL> select instance_name from v$instance;


 


INSTANCE_NAME


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


RACDB1                  # rollback之後,切換到例項RACDB1


 


SQL> select count(*) from test;


 


  COUNT(*)


----------


     50393                # 已經回滾到建表時候的那些資料


所以,該測試說明了Oracle不能切換正在執行DML語句的情況,因為未完成的事務可能需要回滾。也就是隻要沒有獲得的事務存在,就可以動態的切換過去。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-600658/,如需轉載,請註明出處,否則將追究法律責任。

相關文章