在 Oracle 真正应用集群中使用透明应用程序故障切换

本教程旨在向您介绍如何在 Oracle 数据库 10g 真正应用集群中使用透明应用程序故障切换。

大约 30 分钟

本教程包括下列主题:

将鼠标置于此图标上可以加载和查看本教程的所有屏幕截图。(警告:因为此操作会同时加载所有屏幕截图,所以网速较慢时,响应时间可能会比较长。)

注意:此外,您还可以在下列步骤中将光标放在每个单独的图标上,从而仅加载和查看与该步骤相关的屏幕截图。可以通过单击各个屏幕截图来将其隐藏。

透明应用程序故障切换 (TAF) 特性是一个用于高可用性环境(如 Oracle 真正应用集群)的运行时故障切换。 TAF 故障切换并重新建立应用程序到服务连接。 它使客户端应用程序能够在连接失败时自动重新连接到数据库,还可以重新开始过去正在执行的 SELECT 语句。 重新连接在 Oracle 调用接口 (OCI) 库内部自动进行。

有了 Oracle 数据库 10g 第 2 版,您不必在 tnsnames.ora 文件中指定 TAF 选项。 该操作可以直接在数据库内部执行,从而不必更改客户端上的所有 tnsnames.ora 文件。 TAF 能够捕获 Oracle 集群件发送的快速应用程序通知事件。

您将首先设置环境。执行以下步骤:

1.

需要确保 RACDB1 和 RACDB2 实例正在运行。打开一个终端窗口并执行以下命令

如果这两个数据库有一个处于脱机状态,请根据情况执行以下任一命令:

srvctl start instance -d RACDB -i RACDB1
srvctl start instance -d RACDB -i RACDB2

2.

从终端窗口中,执行以下命令:

cd /home/oracle/wkdir
sqlplus /nolog
@rac_setup

该脚本连接到数据库,将 DBA 角色授予 HR,然后创建 HR.EMP 表作为 HR.EMPLOYEES 表的副本。

connect / as sysdba
grant connect, resource, dba to hr;
connect hr/hr
drop table emp purge;
create table emp as select * from employees;

要使用 TAF,需要使用 Enterprise Manager 创建一个应用程序服务。 您将使用 PL/SQL 修改此服务以便 TAF 可以使用它。执行以下步骤:

1.

打开一个浏览器窗口,并输入以下 URL:

http://raclinux1.us.oracle.com:1158/em

在 Enterprise Manager Login 页面的 User Name 域中输入 SYS,在 Password 域中输入 oracle,然后从 Connect As 下拉列表中选择 SYSDBA。 完成以上操作后,单击 Login 按钮。

2.

在 Cluster Database 主页上,单击 Maintenance 链接。

3.

在 Maintenance 页面上,单击 Services 部分下的 Cluster Managed Database Services 链接。

4.

在 Cluster and Database Login 页面上,为 Cluster Credentials 输入 oracle/oracle,并为 Database Credentials 输入 sys/oracle。 完成以上操作后,单击 Continue

5.

Cluster Managed Database Services 页面上,单击 Create Service 按钮。

6.

在 Create Service 页面上的 Service Name 域中输入 SERV1,确保选中 Start service after creation 框,并确保选择 RACDB1RACDB2 作为该服务的 Preferred 实例。

7.

向下滚动到 Create Service 页面的底部,然后单击 OK

8.

服务已经创建完毕,您可以看到 SERV1 现在已经在这两个实例上启动。

9.

您现在将使用 PL/SQL 修改 SERV1,以便 TAF 可以使用它。 在本教程中,您将使用 BASIC 方法。从终端会话中,执行以下命令:

@rac_modserv
connect / as sysdba
execute dbms_service.modify_service(          -
service_name => 'SERV1' -
, aq_ha_notifications => true -
, failover_method => dbms_service.failover_method_basic -
, failover_type => dbms_service.failover_type_select -
, failover_retries => 180 -
, failover_delay => 5 -
, clb_goal => dbms_service.clb_goal_long);
exit;

10.

要开始使用该服务,您需要在 tnsnames.ora 文件中添加一个相应的条目。 为此,请执行以下命令:

cd $ORACLE_HOME/network/admin
gedit tnsnames.ora

将以下条目添加到该文件的末尾:

您可以看到,您不必在 tnsnames.ora 文件中指定 TAF 选项。 该操作现在直接从服务器中执行(参见上一步骤)。

现在,您可以使用 SERV1 连接到数据库,并查看在模拟连接崩溃时发生的情况。 注意,您将在本教程的此部分中使用两个终端会话。

1.

首先,您需要以 HR 的身份使用 SERV1 服务进行连接。 它将确定您连接了哪个实例并确定一些重要的 TAF 特征。从现有的终端窗口中,执行以下命令:

cd /home/oracle/wkdir
sqlplus hr/hr@SERV1
@rac_query

rac_query.sql 脚本包含以下内容

select instance_name from v$instance;
col service_name format a10
+select failover_type,failover_method,failed_over
from v$session where username='HR';

注意,该连接正在使用方法为 BASIC TAF。 到目前为止,该连接未被故障切换。

2.

您现在将向 EMP 表中插入一行。 注意,您仍使用在上一步骤中创建的同一会话。执行以下脚本:

@rac_insert1

rac_insert1.sql 脚本包含以下内容

insert into emp select * from employees where rownum<2;
commit;

3.

打开第二个终端窗口。 从现在开始,该会话将称作第二个会话,而另一个会话则称作第一个会话。

您将删除在第一步中建立的前台进程以模拟数据库崩溃。 从第二个会话中,执行以下 shell 脚本:

./rac_kill_sessions.sh

rac_kill_sessions.sh shell 脚本包含以下内容

ps -ef | grep "(LOCAL=NO)" | awk '{print "kill -9 " $2 }' > y.sh
. ./y.sh

4.

现在,您可以再次尝试将一个新行插入到 EMP 表中。 切换到第一个会话并执行以下脚本:

@rac_insert2 

rac_insert2.sql 脚本包含以下内容: 

insert into emp select * from employees where rownum<2;

.

由于您刚刚终止了会话的服务器进程,因此无法再插入行。

5.

稍候片刻,然后从第一个会话中执行以下脚本:

@rac_insert1

rac_insert1.sql 脚本包含以下内容:

insert into emp select * from employees where rownum<2;
commit;

请再次尝试向 EMP 表中插入一行。 由于 TAF 自动重新建立了连接,因此此次插入成功。

6.

现在再次执行以下脚本:

@rac_query

rac_query.sql 脚本包含以下内容:

select instance_name from v$instance;
col service_name format a10 
select failover_type,failover_method,failed_over 
  from v$session where username='HR';

TAF 自动对会话进行了故障切换。

执行以下操作以清理环境:

要清理 environment,请执行以下脚本:

./rac_cleanup.sh
srvctl stop service -d RACDB -s SERV1 -f
srvctl disable service -d RACDB -s SERV1
srvctl remove service -d RACDB -s SERV1
sqlplus /nolog @rac_cleanup connect / as sysdba revoke dba from hr; connect hr/hr drop table emp purge; exit;

注意: 您将需要输入 Y 以删除该服务。

在本教程中,您学习了如何执行下列任务:

使用 Enterprise Manager 和 PL/SQL 在 RAC 环境中设置 TAF
模拟连接崩溃并查看 TAF 如何处理它。

返回主题列表