1.高可用性(HA)
可用性=MTTF/(MTTF+MTTR)
MTTF:平均故障间隔时间
MTTR:平均修复时间
2.Failover(故障转移)
-Client-Side Connect Time Failover:这种Failover方式只在发起连接时才去感知节点故障
-TAF(Transparent Application Failover):连接建立后,应用系统运行过程中,如果某个实例发生故障,连接到这个实例上的用户会被自动迁移到
其他健康实例上。
-体验Clinet-Side Failover和TAF
第一步:启动集群中每个服务器的数据连接监听
第二步:编辑客户端tnsnames.ora,使用Clinet-Side Connect time Failover的TNS配置
DEVDB =
(DESCRIPTION =
(ADDRESS_LIST =
(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 = DEVDB)
)
)
)
使用TAF配置TNS
DEVDB_TAF =
(DESCRIPTION =
(ADDRESS_LIST =
(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 = DEVDB)
(FAILOVER_MODE =(TYPE=session)(METHOD = basic)(METRIES = 100)(DELAY = 5))
)
)
第三步:在窗口一使用Client-Side Failover TNS连接数据库
窗口一>sqlplus test/password@devdb
在窗口二使用TAF TNS配置连接数据
窗口二>sqlplus test2/password@devdb_taf
第四步:连接成功后,在两个窗口中查看用户连接到的实例
窗口一>
SQL> select instance_name from v$instance;
INSTANCE_NAME
--------------------------------
devdb1
查看用户连接TAF配置
SQL> select username,failover_type,failover_method from v$session where username
in ('TEST');
USERNAME
------------------------------------------------------------
FAILOVER_TYPE FAILOVER_METHOD
-------------------------- --------------------
TEST
NONE NONE
窗口二>
SQL> select instance_name from v$instance;
INSTANCE_NAME
--------------------------------
devdb1
查看用户连接TAF配置
SQL> select username,failover_type,failover_method from v$session where username
in ('TEST2');
USERNAME
------------------------------------------------------------
FAILOVER_TYPE FAILOVER_METHOD
-------------------------- --------------------
TEST2
SESSION BASIC
第五步:查看服务端杀掉两个连接对应的Server Process
SQL> select pid,spid from v$process where addr in (select paddr from v$session w
here username in ('TEST','TEST2'));
PID SPID
---------- ------------------------
34 27256
37 27756
使用ps -ef命令查看进程
oracle 27256 1 0 21:43 ? 00:00:00 oracledevdb1 (LOCAL=NO)
oracle 27756 1 0 21:43 ? 00:00:00 oracledevdb1 (LOCAL=NO)
使用kill命令查看进程
rac1-> kill -9 27256
rac1-> kill -9 27756
第六步:在两个窗口,执行SQL语句,两个连接都抛出相同的错误
窗口一显示>
SQL> select instance_name from v$instance;
select instance_name from v$instance
*
第 1 行出现错误:
ORA-03113: 通信通道的文件结束
窗口二显示>
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
窗口二>
SQL> select instance_name from v$instance;
INSTANCE_NAME
--------------------------------
devdb1
使用TAF的窗口,用户查询正常执行,说明用户连接已经被Failover,因为模拟过程不是重启动实例或节点,而只是杀掉Server Process,所以用户
并没有迁移到新的实例,仍是连接到原实例。
-HA的第三种方式:Server-Side TAF
从配置参数角度看,Server-Side TAF和TAF相比多一个Instance Role的概念,所谓实例角色,就是当有多个Instance参与一个Service时,可能配
置优先使用哪一个Instance为用户提供服务,用户共有两种选角色:
--PREFERRED:道选实例
--AVAILABLE:后备实例
-使用srvctl命令配置Service
第一:创建service
rac1-> srvctl add service -d devdb -s testservice -r "devdb1" -a "devdb2" -P "BASIC"
第二:查看配置
rac1-> srvctl config service -d devdb -s testservice -a
testservice PREF: devdb1 AVAIL: devdb2 TAF: BASIC
第三:是否自动运行service
srvctl enable/disable service -d devdb -s testservice -i devdb1
第四:启动service
rac1-> srvctl start service -d devdb -s testservice -i devdb1
第五:停止service
rac1-> srvctl stop service -d devdb -s testservice -i devdb1 -c -q -f
-f选项可以强制关闭service
第六:查看service状态
rac1-> srvctl status service -d devdb -s testservice -f -v
Service testservice is running on instance(s) devdb1
第七:删除service
rac1-> srvctl remove service -d devdb -s testservice -i devdb1 -f
-创建一个名为OLTP的service
第一步:查看系统现有的service
SQL> show parameter service
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string devdb, wxxrdb
第二步:使用srvctl命令创建OLTP服务
rac1-> srvctl add service -d devdb -s test -r devdb1 -a devdb2 -P basic
第三步:确认服务创建成功
rac1-> crs_stat -t -v
第四步:配置这个服务自动启动
rac1-> srvctl enable service -d devdb -s oltp
PRKP-1018 : Service oltp already enabled.
第五步:启动这个服务
rac1-> srvctl start service -d devdb -s oltp
第六步:使用dbms_service.modify_service包,修改Service的TAF配置
SQL> begin
2 dbms_service.modify_service(
3 service_name=>'oltp',
4 failover_method=>dbms_service.failover_method_basic,
5 failover_type=>dbms_service.failover_type_select,
6 failover_retries=>180,
7 failover_delay=>5);
8 end;
9 /
PL/SQL procedure successfully completed.
第七步:确认修改已经生效
select name,failover_method,failover_type,goal,clb_goal from dba_services
1 SYS$BACKGROUND NONE SHORT
2 SYS$USERS NONE SHORT
3 devdbXDB LONG
4 devdb LONG
5 CRM LONG
6 wxxrdb LONG
7 testservice LONG
8 oltp BASIC SELECT LONG
第八步:使用srvctl命令查看配置
rac1-> srvctl config service -d devdb -s oltp -a
oltp PREF: devdb1 AVAIL: devdb2 TAF: basic
第九步:测试Service-Sides TAF,使用Easy Connect Naming Methods方式直接连接
C:/Documents and Settings/guhui>sqlplus test/password@rac1-vip/oltp
第十步:执行查询,确认连接至哪一个实例
SQL> select instance_name from v$instance;
INSTANCE_NAME
--------------------------------
devdb1
第十一步:在实例1上,杀掉这个会话对应的Server Process
SQL> select pid,spid from v$process where addr in (select paddr from v$session w
here username='TEST');
PID SPID
---------- ------------------------
33 14337
rac1-> kill -9 14337 //杀掉这个进程
第十二步:在会话中执行语句
SQL> select instance_name from v$instance;
select instance_name from v$instance
*
第 1 行出现错误:
ORA-03113: 通信通道的文件结束
SQL> select instance_name from v$instance
2 ;
INSTANCE_NAME
--------------------------------
devdb1
第十三步:测试完毕,清理环境,删除Service
srvctl stop service -d devdb -s oltp 先停止服务
srvctl disable service -d devdb -s oltp
删除服务
rac1-> srvctl remove service -d devdb -s oltp
oltp PREF: devdb1 AVAIL: devdb2
Service oltp is disabled.
Remove service oltp from the database devdb? (y/[n]) y
OCR中的内容被删除了,但是数据字典里还有该Service的内容,继续清除数据字典里的内容
select name,failover_method,failover_type,goal,clb_goal from dba_services where name ='oltp'
删除数据字典内容
SQL> begin
2 dbms_service.DELETE_SERVICE(service_name=>'oltp');
3 end;
4 /
PL/SQL 过程已成功完成。
再次确认数据字典
select name,failover_method,failover_type,goal,clb_goal from dba_services where name ='oltp'//未查询到数据,说明已经被删除