其实网上已经有很多关于Tuxedo通过XA连接Oracle的文章了,这里参考着前人的文档结合自己的实验整理一下,只是作为记录,怕自己过几天忘了
实验环境:
Windows XP Professional SP2
Tuxedo 8.1 32-bit RP303
Oracle 9i (9.2.0.8) for Windows,Schema:scott
1. 安装Oracle Client
在运行Tuxedo的主机上,至少要安装Oracle Client。如果是开发用,那么在安装的时候还需要选择"Oracle Programmer",该组件包含了Pro*C所需的头文件以及LIB包
2. 配置TNS别名
在运行Tuxedo的主机上,配置TNS别名,连接到Oracle。配置好之后,最好使用sqlplus命令测试一下,配置是否正确。我的实验TNS别名是laborcl
3. 创建XA相关视图
使用system或者其他DBA用户登录到Oracle,运行${ORACLE_HOME}\rdbms\admin\xaview.sql,该SQL脚本创建2个视图:v$pending_xatrans$ 和 v$xatrans$
4. 给XA相关视图授权
使用system或者其他DBA用户登录到Oracle,进行授权
grant select on DBA_PENDING_TRANSACTIONS to public;
grant select on v$pending_xatrans$ to public;
grant select on v$xatrans$ to public;
5. 配置RM文件
编辑文件${TUXDIR}\udataobj\RM。该文件中已经包含了一个For Oracle 7的配置,要使用其他版本的Oracle数据库,则需要自行配置。
Oracle 7 (RM自带):
Oracle_XA:xaosw:-L${ORACLE_HOME}/lib -lxa ${ORACLE_HOME}/lib/libsql.a -lora -lsqlnet -lcore -lnlsrtl -lcore ${ORACLE_HOME}/lib/osntab.o -lsqlnet -lcv6 -lora -lm -lsocket
Oracle 8i for NT:
Oracle_XA;xaosw;%ORACLE_HOME%RDBMSXAORAXA8.LIB %ORACLE_HOME%PRECOMPLIBMSVCORASQL8.LIB %ORACLE_HOME%PRECOMPLIBMSVCORASQX8.LIB %ORACLE_HOME%OCILIBMSVCOCI.LIB %ORACLE_HOME%OCILIBMSVCOCIW32.LIB
Oracle 8i for Unix:
Oracle_XA:xaosw:-L$/lib -lclntsh
Oracle 9i: Oracle_XA;xaosw;%ORACLE_HOME%\rdbms\XA\ORAXA9.LIB
其实RM文件主要是告诉buildtms命令在编译的时候要链接的库以及其他信息。这里需要注意的是在Windows平台上要使用分号(;)分隔,在Unix平台上要使用冒号( : )分隔,如果写错了,可能在buildtms的时候报出错误:
GP_CAT:1102: ERROR: Cannot find RM Oracle_XA in file d:\bea\tux81\tuxedo8.1\udataobj\RM
并且注意环境变量的引用符号,在Windows上是一对%%,在Unix上是$符号。
6. buildtms
使用buildtms命令: buildtms -o TMS_ORA9i -r Oracle_XA
其中-o参数是输出的TMS可执行程序,-r就是在RM文件中的名称,即第一个分号前面的部分。可以将TMS输出文件放到APPDIR的目录下。
7. 编写简单的UBB配置文件
*RESOURCES
IPCKEY 48800
DOMAINID jadedom1
MASTER jade1
MAXACCESSERS 100
MAXSERVERS 50
MAXSERVICES 100
MODEL SHM
LDBAL Y
SCANUNIT 10
SANITYSCAN 6
BLOCKTIME 8
MAXGTT 10
*MACHINES
DEFAULT:
APPDIR="d:\MyCode\ProC\"
TUXCONFIG="d:\MyCode\ProC\tuxconfig"
TUXDIR="d:\bea\tux81\tuxedo8.1"
MAXWSCLIENTS=10
TLOGDEVICE="d:\mycode\ProC\MyTLOGDevice"
TLOGNAME=MYTLOG
TLOGSIZE=200
YYUAN01 LMID=jade1
*GROUPS
GROUP1
LMID=jade1 GRPNO=1
TMSCOUNT=2
TMSNAME="TMS_ORA9i"
OPENINFO="Oracle_XA:Oracle_XA+Acc=P/scott/tiger+SesTm=120+MaxCur=5+LogDir=.+SqlNet=laborcl"
CLOSEINFO="NONE"
*SERVERS
DEFAULT:
CLOPT="-A"
*SERVICES
其中GROUP段最重要的是OPENINFO串,Oracle几个版本的OPENINFO变化不大,其中P/scott/tiger分别是帐号和口令,如果要使用密文口令,则把口令部分填写为五个*,在tmloadcf的时候,要求手工输入:
D:\MyCode\ProC>tmloadcf -y ubbdemo
Password for OPENINFO (SRVGRP=GROUP1):
tmunloadcf出来:
OPENINFO="Oracle_XA:Oracle_XA+Acc=P/scott/@@75980d546f4248f1@@+SesTm=120+MaxCur=5+LogDir=.+SqlNet=laborcl"
这里可以看出OPENINFO中口令已经被加密。
OPENINFO中的SqlNet为你在tuxedo所在主机上配置的连接Oracle的TNS别名
TMSCOUNT参数默认为3,最小2,最大10。
然后使用tmloadcf编译ubb配置文件
8. 创建TLOG Device及TLOG
如果忘了创建TLOGDevice及TLOG,那么在tmboot的时候会出现如下错误:
123357.YYUAN01!tmloadcf.2128.384.-2: 01-03-2008: Tuxedo Version 8.1, 32-bit
123357.YYUAN01!tmloadcf.2128.384.-2: CMDTUX_CAT:872: INFO: TUXCONFIG file d:\MyCode\ProC\tuxconfig has been updated
123906.YYUAN01!BBL.1936.3272.0: 01-03-2008: Tuxedo Version 8.1, 32-bit, Patch Level 303
123906.YYUAN01!BBL.1936.3272.0: LIBTUX_CAT:296: ERROR: _tlog_open: _gp_tblopen: VTOC not initialized
123906.YYUAN01!BBL.1936.3272.0: LIBTUX_CAT:319: ERROR: Log start cannot open tlog
123906.YYUAN01!BBL.1936.3272.0: LIBTUX_CAT:248: ERROR: System init function failed, Uunixerr =
123906.YYUAN01!BBL.1936.3272.0: CMDTUX_CAT:26: INFO: The BBL is exiting system
123906.YYUAN01!tmboot.2460.2916.-2: 01-03-2008: Tuxedo Version 8.1, 32-bit
123906.YYUAN01!tmboot.2460.2916.-2: CMDTUX_CAT:825: ERROR: Process BBL at jade1 failed with /T tperrno (TPESYSTEM - internal system error)
123906.YYUAN01!tmboot.2460.2916.-2: WARN: No BBL available on site jade1.
Will not attempt to boot server processes on that site.
使用tmadmin命令,此时由于Tuxedo尚未启动,所以可以看到No bulletin board exists. Entering boot mode.的信息
> crdl -b 1024 -z d:\mycode\ProC\MyTLOGDevice
创建TLOG Device,这里-z要和UBB文件中的MACHINE段的TLOGDEVICE保持一致。block通常设置为RESOUCE段的MAXGTT+50,并且不小于MACHINE段的TLOGSIZE设置
然后创建TLOG:
>crlog -m jade1
-m参数为主机的逻辑名称,即ubb中的MACHINE段的LMID。
9. 启动Tuxedo
tmboot -y
启动之后就可以在Oracle看到从TMS_ORA9i连接的TMSCOUNT个Session了。