资源描述
栢图教育 Oracle 高级课程案例实操部分 栢图 Oracle 研究室 Oracle 高级课程实操案例高级课程实操案例 透明应用切换场景应用透明应用切换场景应用 透明应用故障转移(Transport Application Failover,TAF)是oracle数据提供的一项,普遍应用于RAC环境中,当然也可以用于Data Guard和传统的HA实现的主从热备的环境中。TAF中的Transparent和Failover,点出了这个高可用特性的两大特点:TAF是用于故障转移的,也就是切换。当Oracle连接的会话由于数据库发生故障不可用时,会话能够自动切换到RAC中的其他可用的节点上,或者切换到Standby上面,或者切换到HA方式中的另一个可用的节点上面。TAF的故障转移,对应用来说是透明的,应用系统不需要进行特别的处理就能够自动进行故障转移。但是,TAF是完美的吗?是不是使用了TAF,应用就能真的无缝地进行切换呢?对应用和数据库有没有其他什么要求?要回答这些问题,我们需要全面地了解、掌握TAF。我始终认为,要用好一个东西,首先得掌握这个东西背后的工作原理与机制。首先来看看Failover。failover的含义是当用户连接到RAC环境时,用户实际上是连接到RAC中的一个实例,用户的查询等操作也是由该实例完成的,但是如果该实例宕机,那么用户连接会被转移到其他的健康的实例,而这种转换对于用户是透明的,用户的select语句仍然继续返回结果集,感觉不到异常。Failover有两种,一种是连接时Failover,另一种则是运行时Failover。前者的作用在于,应用(客户端)在连接数据库时,如果由于网络、实例故障等原因,连接不上时,能够连接数据库中的其他实例。后者的作用在于,对于一个已经在工作的会话(也就是连接已经建立),如果这个会话的实例异常中止等,应用(客户端)能够连接到数据库的其他实例(或备用库)。首先,TAF是ORACLE客户端提供的一项特性。使用TAF,对客户端的环境有一定的要求。比如JAVA的JDBC驱动、Oracle客户端的版本等(8i开始支持TAF)。RAC与oracle thin Java驱动程序兼容,但并非所有的驱动程序都支持所有的服务。9.2.0.4 thin驱动程序不支持负载平衡,而9.2.0.5或者10g驱动程序则支持。例如客户端是weblogic应用,要将Weblogic Server与Oralce RAC一起使用,WebLogical JDBC数据源必须使用Oracle JDBC Thin驱动程序10g来创建数据库连接。1 案例案例配置配置 TAF 体验体验 failover(TYPE=session)下面模拟failover的透明切换,用户连接到RAC环境之后,先确定用户是连接到哪一个实例,执行一些查询操作,然后关闭用户连接的这个实例,或者干脆把这个节点关机来模拟故障场景。如果用户的连接能被自动转移到另一个节点上,并且查询不受影响就代表failover成功了。(一一)检查检查tnsnamestnsnames文件。文件。ORCL=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=class1-vip)(PORT=1521)(ADDRESS=(PROTOCOL=TCP)(HOST=class2-vip)(PORT=1521)(LOAD_BALANCE=yes)(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)(FAILOVER_MODE=(TYPE=session)(METHOD=basic)栢图教育 Oracle 高级课程案例实操部分 栢图 Oracle 研究室 )(二二)连接到连接到RACRAC SQL conn system/oracleORCL -连接的实例是配置了failover的实例 Connected.(三三)确认用户当前连接的实例确认用户当前连接的实例 SQL select instance_name from v$instance;INSTANCE_NAME-ORCL1(四四)另外一个另外一个sessionsession关闭实例关闭实例ORCL1ORCL1 oracleclass1$srvctl stop nodeapps-n class1 oracleclass1$crs_stat-t-v Name Type R/RA F/FT Target State Host-ora.L1.inst application 0/5 0/0 OFFLINE OFFLINE ora.L2.inst application 0/5 0/0 ONLINE ONLINE class2 ora.ORCL.db application 0/1 0/1 ONLINE ONLINE class1 ora.SM1.asm application 0/5 0/0 OFFLINE OFFLINE ora.C1.lsnr application 0/5 0/0 OFFLINE OFFLINE ora.class1.gsd application 0/5 0/0 OFFLINE OFFLINE ora.class1.ons application 0/3 0/0 OFFLINE OFFLINE ora.class1.vip application 0/0 0/0 OFFLINE OFFLINE ora.SM2.asm application 0/5 0/0 ONLINE ONLINE class2 ora.C2.lsnr application 0/5 0/0 ONLINE ONLINE class2 ora.class2.gsd application 0/5 0/0 ONLINE ONLINE class2 ora.class2.ons application 0/3 0/0 ONLINE ONLINE class2 ora.class2.vip application 0/0 0/0 ONLINE ONLINE class2(五五)回到第一个会话回到第一个会话 SQL select instance_name from v$instance;select instance_name from v$instance;*第一行出现错误:ORA-25408:无法安全重放调用 SQL select instance_name from v$instance;INSTANCE_NAME-ORCL2 虽然报了一个错误,但是再次执行的时候,Oralce已经自动切换到实例2上了。2 案例案例配置配置 TAF 体验体验 failover(type=select)如果将type类型改为select模式,则不会出现错误ORA-25408。(一一)修改修改tnsnamestnsnames文件:两个节点都改文件:两个节点都改 ORCL=栢图教育 Oracle 高级课程案例实操部分 栢图 Oracle 研究室 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=class1-vip)(PORT=1521)(ADDRESS=(PROTOCOL=TCP)(HOST=class2-vip)(PORT=1521)(LOAD_BALANCE=yes)(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)(FAILOVER_MODE=(TYPE=SELECT)(METHOD=basic)(二二)连接到实例,用上面配置的服务名连接到实例,用上面配置的服务名 SQL conn system/oracleORCL Connected.SQL select instance_name from v$instance;INSTANCE_NAME-ORCL2 -连接了实例2(三三)关闭实例关闭实例ORCL2ORCL2 oracleclass2$srvctl stop instance-d ORCL-i ORCL2(四四)切换回刚才的会话切换回刚才的会话 SQL select instance_name from v$instance;INSTANCE_NAME-ORCL1 此时没有ORA-25408的错误出现,select情况下,在failover数据库实例失败的时候,会将会话切换到另外一个实例,且将实例失败时候运行的select语句继续执行,并返回正确的结果。而session不具备这个功能。3 案例案例 3type=session 模式对查询模式对查询结果结果的影响的影响 下面再切换回session状态:SQL conn system/oracleORCL Connected.SQL select instance_name from v$instance;INSTANCE_NAME-ORCL2 SQL set pause on SQL select trigger_name from dba_triggers;挂起 回车 TRIGGER_NAME-栢图教育 Oracle 高级课程案例实操部分 栢图 Oracle 研究室 DEF$_PROPAGATOR_TRIG REPCATLOGTRIG XDB_RV_TRIG XDB$ACL$xd xdb-log9_TAB$xd SERVLET$xd ftp-log14_TAB$xd http-log20_TAB$xd Folder23_TAB$xd 关闭当前实例:oracleclass2 admin$srvctl stop instance-d ORCL-i ORCL2 -利用pause的暂停功能,然后在另一个会话中关闭当前的连接实例。回到刚才的会话按回车键 TRIGGER_NAME-XDB_PV_TRIG XDB$STATS$xd XDB$CONFIG$xd XDBCONFIG_VALIDATE OGIS_CRS_INSERT_TRIGGER OGIS_CRS_DELETE_TRIGGER ERROR:ORA-25401:can not continue fetches -虽然select操作失败了,但是再次执行SQL时成功了,而且会话已经切换到了另外一个实例上 15 rows selected.SQL select instance_name from v$instance;INSTANCE_NAME-ORCL1 pause起作用在执行后和每一页的结束后,而pause和SQL结果的提取是没有关系的,这也是为什么在pause继续执行之后,仍然得到一些记录的原因。最终获取105条记录可以看出oracle的fetch操作是通过数组进行的,在pause的时候,这次数组提取已经完成,而pause结束后,本次获取的数据可以显示,再次提取的时候出现了错误。SQL show array arraysize 15 15*7=105 可见Oracle实际执行了7次提取操作。4 案例案例 4type=select 模式对查询模式对查询结果结果的影响的影响 再看select的表现,将两个节点的tns文件修改为select选项后。SQL conn system/oracleORCL Connected.栢图教育 Oracle 高级课程案例实操部分 栢图 Oracle 研究室 SQL select instance_name from v$instance;INSTANCE_NAME-ORCL2 SQL set pause on SQL select trigger_name from dba_triggers;TRIGGER_NAME-DEF$_PROPAGATOR_TRIG REPCATLOGTRIG XDB_RV_TRIG XDB$ACL$xd xdb-log9_TAB$xd SERVLET$xd ftp-log14_TAB$xd http-log20_TAB$xd Folder23_TAB$xd XDB_PV_TRIG XDB$STATS$xd 挂起 关闭实例ORCL2 oracleclass2 admin$srvctl stop instance-d ORCL-i ORCL2 切换回刚才的会话:回车,发现继续执行而且数据显示完全。没有故障错误。而且也顺利切换了实例:SQL select instance_name from v$instance;INSTANCE_NAME-ORCL1 5 案例案例 5type=session 模式模式对事务对事务的影响的影响 改为session SQL conn system/oracleORCL Connected.SQL select instance_name from v$instance;INSTANCE_NAME-ORCL2 SQL create table t(id number);Table created.SQL insert into t values(1);1 row created.栢图教育 Oracle 高级课程案例实操部分 栢图 Oracle 研究室 oracleclass2 admin$srvctl stop instance-d ORCL-i ORCL2 切换回原来的session执行任意SQL:SQL select instance_name from v$instance;select instance_name from v$instance*ERROR at line 1:ORA-25402:transaction must roll back SQL select*from t;select*from t*ERROR at line 1:ORA-25402:transaction must roll back SQL delete from t;delete from t*ERROR at line 1:ORA-25402:transaction must roll back SQL commit;commit*ERROR at line 1:ORA-25402:transaction must roll back SQL rollback;Rollback complete.SQL select instance_name from v$instance;INSTANCE_NAME-ORCL1 切换虽然成功了,但是执行任何操作都报错误ORA-25402,除非rollback。6 案例案例 6type=select 模式模式对事务对事务的影响的影响 将session改为select后再做这个实验:SQL conn system/oracleORCL Connected.SQL select instance_name from v$instance;INSTANCE_NAME-ORCL2 SQL insert into t values(1);1 row created.SQL set pause on SQL select trigger_name from dba_triggers;TRIGGER_NAME 栢图教育 Oracle 高级课程案例实操部分 栢图 Oracle 研究室 -DEF$_PROPAGATOR_TRIG REPCATLOGTRIG XDB_RV_TRIG XDB$ACL$xd xdb-log9_TAB$xd SERVLET$xd ftp-log14_TAB$xd http-log20_TAB$xd Folder23_TAB$xd XDB_PV_TRIG XDB$STATS$xd 挂起 oracleclass2 admin$srvctl stop instance-d ORCL-i ORCL2 回到刚才的session继续回车:TRIGGER_NAME-XDB$CONFIG$xd XDBCONFIG_VALIDATE OGIS_CRS_INSERT_TRIGGER OGIS_CRS_DELETE_TRIGGER ERROR:ORA-25402:transaction must roll back 15 rows selected.得到了和上次完全不同的结果。7 总结:总结:(一)首先TAF是针对session和select的,它不支持事务的切换,当连接的实例发生了故障,客户端的连接发生了切换之后,session信息、instance信息以及其他很多事务依赖的东西都不存在了,oracle为了保证事务的完整性和一致性,必须要求用户回滚事务。(二)select模式的TAF只对不包含任何事务处理的查询有效,一旦用户执行了修改操作,select模式也无法在TAF之后将进行一半的查询完成。(三)如果启用了TAF功能,那么程序必须要添加处理ORA-25402错误的能力,否则一旦发生TAF切换,程序将一直报错,而无法再进行任何操作。8 TAF 的的 preconnect 方式方式 TAF有两种切换方式:TAF的basic方式和preconnect方式。BASIC方式-所有设置了TAF的会话在当前实例失败后,会连接到另外一个实例上,而对于preconnect方式,每个连接的会话在主实例和备份实例上各连接一个会话,一旦主实例失败,可以迅速的切换到备份实例。basic方式前面已有。下面看看preconnect方式的tns配置:ORCL_PRE1=(DESCRIPTION=栢图教育 Oracle 高级课程案例实操部分 栢图 Oracle 研究室 (ADDRESS=(PROTOCOL=TCP)(HOST=class1-vip)(PORT=1521)(ADDRESS=(PROTOCOL=TCP)(HOST=class2-vip)(PORT=1521)(LOAD_BALANCE=yes)(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)(FAILOVER_MODE=(TYPE=select)(METHOD=preconnect)(BACKUP=ORCL_PRE2)ORCL_PRE2=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=class1-vip)(PORT=1521)(ADDRESS=(PROTOCOL=TCP)(HOST=class2-vip)(PORT=1521)(LOAD_BALANCE=yes)(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)(FAILOVER_MODE=(TYPE=select)(METHOD=preconnect)(BACKUP=ORCL_PRE1)8.1 对于对于 basic 方式的方式的 TAF 切换时间测试切换时间测试 SQL conn system/oracleORCL Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 Connected as system SQL select sid,failover_type,failover_method,failed_over from v$session where sid in(select sid from v$mystat where rownum=1);SID FAILOVER_TYPE FAILOVER_METHOD FAILED_OVER-128 SESSION BASIC NO SQL select instance_name from v$instance;INSTANCE_NAME-栢图教育 Oracle 高级课程案例实操部分 栢图 Oracle 研究室 ORCL1 通过set timing on来检查观察切换时间:SQL set timing on SQL select instance_name from v$instance;INSTANCE_NAME-ORCL1 Executed in 0.047 seconds SQL select instance_name from v$instance;INSTANCE_NAME-ORCL1 Executed in 0.047 seconds oracleclass2 admin$srvctl stop instance-d ORCL-i ORCL1 -在另外的窗口关闭实例1 在原来的会话 SQL select instance_name from v$instance;INSTANCE_NAME-ORCL2 Executed in 0.031 seconds SQL select instance_name from v$instance;INSTANCE_NAME-ORCL2 Executed in 0.031 seconds 8.2 对于对于 preconnect 方式的方式的 TAF 切切换时间测试换时间测试 再改为PRECONNECT方式:用ORCL_PRE1连接数据库。SQL set timing off SQL conn system/oracleORCL_PRE1 Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 Connected as system SQL select sid,failover_type,failover_method,failed_over from v$session where sid in(select sid from v$mystat where rownum=1);SID FAILOVER_TYPE FAILOVER_METHOD FAILED_OVER-129 SELECT PRECONNECT NO SQL select instance_name from v$instance;INSTANCE_NAME-栢图教育 Oracle 高级课程案例实操部分 栢图 Oracle 研究室 ORCL2 SQL set timing on SQL select instance_name from v$instance;INSTANCE_NAME-ORCL2 Executed in 0.015 seconds SQL select instance_name from v$instance;INSTANCE_NAME-ORCL2 Executed in 0.016 seconds SQL select instance_name from v$instance;INSTANCE_NAME-ORCL2 Executed in 0.016 seconds oracleclass2 admin$srvctl stop instance-d ORCL-i ORCL2 切换回去:SQL select instance_name from v$instance;INSTANCE_NAME-ORCL1 Executed in 0.046 seconds SQL select instance_name from v$instance;INSTANCE_NAME-ORCL1 Executed in 0.016 seconds SQL select instance_name from v$instance;INSTANCE_NAME-ORCL1 Executed in 0.032 seconds 数据库负载很小,而且会话需要恢复的操作不多,所以切换时所需的时间不长,不过即使是这样,通过对比basic和所需的切换时间,可以看到明显的区别。8.3 TAF 服务器端的服务器端的 PRECONNECT 设置设置 启动dbca选择ORAC数据库-服务管理-选择数据库next-添加要启动的服务:PRE_ORCL-策略修改为pre-connect-OK 此时服务器端的tnsnames文件中出现了:两个节点都有 PRE_ORCL_PRECONNECT=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=class1-vip)(PORT=1521)栢图教育 Oracle 高级课程案例实操部分 栢图 Oracle 研究室 (ADDRESS=(PROTOCOL=TCP)(HOST=class2-vip)(PORT=1521)(LOAD_BALANCE=yes)(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=PRE_ORCL_PRECONNECT)(FAILOVER_MODE=(BACKUP=PRE_ORCL)(TYPE=SELECT)(METHOD=BASIC)(RETRIES=180)(DELAY=5)PRE_ORCL=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=class1-vip)(PORT=1521)(ADDRESS=(PROTOCOL=TCP)(HOST=class2-vip)(PORT=1521)(LOAD_BALANCE=yes)(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=PRE_ORCL)(FAILOVER_MODE=(BACKUP=PRE_ORCL_PRECONNECT)(TYPE=SELECT)(METHOD=PRECONNECT)(RETRIES=180)(DELAY=5)通过srvctl可以监控、管理建立的PRE_ORCL服务:oracleclass2 admin$srvctl status service-d ORCL 服务 PRE_ORCL 正在实例 ORCL2,ORCL1 上运行 建立了服务之后,客户端可以直接配置PRE_ORCL这个服务,比如客户端tns配置为:PRE_ORCL_SERVICE=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=class1-vip)(PORT=1521)(ADDRESS=(PROTOCOL=TCP)(HOST=class2-vip)(PORT=1521)(LOAD_BALANCE=yes)(CONNECT_DATA=(SERVER=DEDICATED)栢图教育 Oracle 高级课程案例实操部分 栢图 Oracle 研究室 (SERVICE_NAME=PRE_ORCL)(FAILOVER_MODE=(BACKUP=PRE_ORCL_PRECONNECT)(TYPE=SELECT)(METHOD=PRECONNECT)(RETRIES=180)(DELAY=5)可以直接连接这个服务:sys/oraclePRE_ORCL_SERVICE as sysdba SQL select sid,failover_type,failover_method,failed_over from v$session where sid in(select sid from v$mystat where rownum=1);SID FAILOVER_TYPE FAILOVER_METHOD FAILED_OVER-129 SELECT PRECONNECT NO
展开阅读全文