如何解决在Win2003的Oracle链接服务器上MSDTC事务失败问题
在企业环境中,客户有时需要设置MSDTC事务来与远程Oracle目标服务器协同工作。由于跨产品的设置十分复杂,有时我们在更新一个已链接的Oracle数据库中的数据时可能会面临事务失败,例如:
服务器:消息 7391 ,级别16 ,状态1 ,行1
该操作无法执行,因为OLE DB Provider 'MSDAORA' 无法启动分布式事务。
OLE DB错误跟踪 [OLE / DB Provider 'MSDAORA' ITransactionJoin ::JoinTransaction返回0x8000d048] 。
下面是帮助我们缩小和解决类似的问题的一般的步骤(开始操作之前,先尝试使用SQL的普通的select语句查询Oracle,确保服务器名称解析和它们之间的网络正常):
1。在Windows Server 2003中,选择"添加/删除程序程序"控制台,Windows组件中的"启用网络DTC访问"必须启用。可以在Windows组件\应用程序服务器\启用网络DTC访问下启用它。请参考:
817064如何在Windows Server 2003启用网络DTC访问
https://support.microsoft.com/default.aspx?scid=kb;EN-US;817064
2。打开DCOMCNFG,确保MSDTC选项卡下的安全配置的设置是正确的:
3。打开注册表,在Security键中,确保注册表值和UI设置相匹配:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\Security
4。 注册表中Oracle模块的配置是正确的:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\MTxOCI
OracleXaLib=oraclient9.dll
OracleSqlLib=orasql9.dll
OracleOciLib=oci.dll
尽管在这里我们使用Oracle 9i客户端作为举例,我们应该知道,在Microsoft数据访问组件(MDAC)2.5版本之后,微软的ODBC驱动和OLE DB Provider都只支持Oracle7和Oracle 8i:https://support.microsoft.com/Default.aspx?id=244661
一个新的支持Oracle 9i客户端的Microsoft.NET Managed Oracle Provider现已推出。请访问以下Microsoft网站来下载这个Provider:https://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=4F55D429-17DC-45EA-BFB3-076D1C052524
对于其他版本的Oracle客户端(7 / 8)注册表键值设置,请参考:
193893 有关Oracle与Microsoft Transaction Server和COM +组件协同使用的信息
https://support.microsoft.com/default.aspx?scid=kb;EN-US;193893
5。从SQL服务器管理控制台中找到已连接的Oracle服务器名称。如果你不清楚如何找到Oracle服务器名称,请与当地的Oracle管理团队联系。
6。创建一个指向您的Oracle数据库的ODBC数据源名称(DSN)。请确保您的DSN使用的是Microsoft Oracle ODBC驱动程序。
a. 从管理工具中打开数据源对话框:
b. 单击用户 DSN选项卡上的添加按钮,选择Microsoft ODBC for Oracle,然后完成向导:
运行此命令,我们应该得到正确的结果,这说明纯Oracle事务工作正常:
Msdtcora.exe -U<oracle用户名> -P<oracle密码> -S<我们在第五步中找到的服务名 >
该Msdtcora.exe可以从如下地址得到:
https://download.microsoft.com/download/transaction/Utility/1/NT5/EN-US/DTCOra.exe
这个工具将跳过MSDTC并直接使用Oracle事务。如果Oracle测试程序可以连接到Oracle数据库服务器且不报错,很可能COM + / MTS也可以与Oracle正常工作。如果这一步失败,您应该联系Oracle支持团队以获取更多信息。
7。确保网络服务帐户(这是在Win2003中为MSDTC建立的新帐户)已被添加在c:\program files\oracle和c:\oracle(如果您设置了不同的Oracle根文件夹,需要做同样的工作),强制所有子对象继承父文件夹相同的设置。否则,MSDTC服务可能无法跟Oracle库进行交流。
如果Oracle事务仍然失败,即使在第6步中Msdtcora返回成功的信息,我们应该检查一下纯MSDTC服务是否工作正常。
你可以对其他已连接的SQL服务器发起MSDTC分布式事务处理(SQL服务器的链接也应该遵循的步骤1,2,3)来查看事务的进展。如果发生任何困难,联系 MSDTC的支持小组以获得进一步的故障排除思路。
更多信息
==============
280106如何在 SQL 服务器中设置到 Oracle 的链接服务器并进行故障排除
https://support.microsoft.com/default.aspx?scid=kb;EN-US;280106
微软Internet开发者支持小组