其实网上已经有很多关于Tuxedo通过XA连接Oracle的文章了,这里参考着前人的文档结合自己的实验整理一下,只是作为记录,怕自己过几天忘了 :P
实验环境:
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,进行授权,(一定要用internat 账户登陆才能建立视图)
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了。
proc db_server.pc include=$TUXDIR/include
buildserver -o db_server -f db_server.c -r Oracle_XA -f "-L$ORACLE_HOME/lib -lclntsh" -s TEST
10重命名下列文件,因为下列文件名与ORACLE带的文件名有冲突,所以要改名。
1.TUXEDO安装路径include目录下的下面文件
把sqlca.h 改名为 sqlca.h.bbb
把sqlcode.h 改名为 sqlcode.h.bbb
把sqlda.h 改名为 sqlda.h.bbb
2.重命名TUXEDO安装路径lib目录下的下面文件
把libsql.lib 改名为 libsql.lib.bbb
buildserver -o db_server -f db_server.c -r Oracle_XA -s TEST
附加一份ubbsimple文件
#cmfubb
*RESOURCES
IPCKEY 124888
#IPCKEY的值必须在32,768到262,143之间
DOMAINID FUNDDOMAIN
# DOMAINID指明TUXEDO的服务域名
MASTER SITE
# MASTER命名当前运行TUXEDO的服务主机的名称
MAXACCESSERS 100
MAXSERVERS 30
MAXSERVICES 40
MODEL SHM
*MACHINES
DEFAULT:
TUXDIR= "C:\bea\tuxedo8.0 "
APPDIR= "D:\oaking\app1\bin "
TUXCONFIG= "D:\oaking\app1\bin\tuxconfig "
ULOGPFX= "D:\oaking\app1\logs\ulog "
TLOGDEVICE= "D:\oaking\app1\logs\tlog "
TLOGNAME=tlog
TLOGSIZE=200
ZHANGLEI LMID=SITE
MAXWSCLIENTS=20
#HOUGANG为机器名,必须为大写字母(因为WINDOWS环境下只认大写的主机名)
#LMID为前面命名的MASTER主机名
#MAXWSCLIENTS为可以连接的最多客户端数
*GROUPS
GROUP1
LMID=SITE GRPNO=1 #命名服务程序组名
TMSNAME=TMS_ORA #命名本地主机标识 组号
TMSCOUNT=2
OPENINFO= "Oracle_XA:Oracle_XA+Acc=P/swbl_ds/swbl_ds+SesTm=600+MaxCur=200+LogDir=.+SqlNet=fund "
#ZFSALES为Oracle数据库用户名,swds为用户口令,FUNDDEV为Oracle本地命名服务名
CLOSEINFO= " "
GROUP2
LMID=SITE
GRPNO=2 TMSNAME=TMS_ORA
TMSCOUNT=2
OPENINFO= "Oracle_XA:Oracle_XA+Acc=P/swbl_ta/swbl_ta+SesTm=600+MaxCur=200+LogDir=.+SqlNet=fund "
CLOSEINFO= " "
JOLTGRP LMID=SITE GRPNO=3 OPENINFO=NONE
JREPGRP LMID=SITE GRPNO=4
RDMGRP
LMID=SITE GRPNO=5
RGWGRP
LMID=SITE GRPNO=6
*SERVERS
DEFAULT:
CLOPT= "-A "
DMADM SRVGRP=RDMGRP SRVID=1000
GWADM SRVGRP=RGWGRP SRVID=1000
GWTDOMAIN SRVGRP=RGWGRP SRVID=1500 REPLYQ=Y
WSL SRVGRP=GROUP1 SRVID=1
CLOPT= "-A -- -c 4096 -N 60 -n //ZHANGLEI:4000 "
ts_business SRVGRP=GROUP1 SRVID=100 MIN=1
ts_query SRVGRP=GROUP1 SRVID=200 MIN=1
ts_lquery SRVGRP=GROUP1 SRVID=300 MIN=1
ts_lfetch SRVGRP=GROUP1 SRVID=400 MIN=1
ts_tabusiness SRVGRP=GROUP2 SRVID=500 MIN=1
ts_taquery SRVGRP=GROUP2 SRVID=600 MIN=1
JSL SRVGRP=JOLTGRP SRVID=900
CLOPT= "-A -- -n //172.16.4.177:2777 C:\bea\tuxedo8.0\udataobj\jolt\repository\jrepository "
JREPSVR SRVGRP=JOLTGRP SRVID=1000
CLOPT= "-A -- -W -P C:\bea\tuxedo8.0\udataobj\jolt\repository\jrepository "
#服务程序名 服务程序所属组 服务程序标识号
*SERVICES