本教程旨在向您介绍如何在 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
|
|
要使用 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 框,并确保选择 RACDB1 和 RACDB2 作为该服务的 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 将以下条目添加到该文件的末尾: SERV1 = 您可以看到,您不必在 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;
|
|
| 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;
请再次尝试向 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 注意: 您将需要输入 Y 以删除该服务。 |
||
在本教程中,您学习了如何执行下列任务:
| 使用 Enterprise Manager 和 PL/SQL 在 RAC 环境中设置 TAF | ||
| 模拟连接崩溃并查看 TAF 如何处理它。 | ||