欢迎投稿

今日深度:

应用服务器名称过长导致使用MSDTC报错,其中有个较老的系统使

应用服务器名称过长导致使用MSDTC报错,其中有个较老的系统使


项目背景

因机房迁移,部分系统需要从A机房迁移至B机房,迁移的方式是申请资源从新部署 应用和 DB 。其中有个较老的系统使用的SQL Server的MSDTC功能。大家知道,MSDTC(分布式交易协调器),协调跨多个数据库、消息队列、文件系统等资源管理器的事务,该服务用于管理多个主机。

报错

迁移后, 应用报错:

Communication with the underlying transaction manager has failed。

分析

根据网上同行的分享,大体为以下几类:

(1)检查 "Distributed Transaction Coordinator" 服务是否正常;

检查方式:在windows控制面版-->管理工具-->服务-->Distributed Transaction Coordinator 

(2)查看 MSDTC设置是否正确

 (3)检查防火墙和网络端口

可以通过telnet 命令查看数据库端口、查看135端口.(MSDTC依赖于RPC,RPC使用的端口是135)

设置开通web服务器和数据库服务器间的135端口。

(4)web 和 db 服务器中在host文件中都要添加机器名解析

位置 C:/WINDOWS/system32/drivers/etc/hosts

例如开发环境 DB 上添加   
#注释  对方ip地址     对方机器名 
192.168.0.138 vip5-PC   
192.168.0.96  Withjunc 
开发环境Web上 添加 
192.168.0.218    Server218 

ping 检查维护的是否争取,注意,此时应该ping 机器名,不是ping serverip。 

 

但是可惜,通过以上的操作和检查还是应用报错,没有发现问题所在。

继续调试--神来之笔

调试、调整、再调试,反复多次,都没有发现问题。后来只有打开  【SQL Profiler 跟踪器】尝试。经过多次、反复查看抓到的数据,偶然发现 【hostname】列的数据不是真正应用所在server的机器名,而是被截断后的。只保留了15位。当时怀疑,可能是这个问题。

为了验证这个假设,下面我们有两个继续方案:(1)修改应用Server的机器名称,将其长度降到15位以内;(2)修改hosts文件。

前者方案,修改成本相对大写,抱着试一试的心态,我们去修改hosts文件【C:/WINDOWS/system32/drivers/etc/hosts】,把其中 应用server的机器名,维护成被截断后的,即hosts维护的名字和SQL Profiler 跟踪器抓到的hostname一致。

结果,报错消失,好了。

小结

(1)问题持续时间相对较长,有一个原因或者心态,总是仍为迁移后,设置一样,DB方面出问题是不可能。经验可以利用,但不应该成为不积极面对问题的挡箭牌,而是‘stay hungry stay foolish’。切记!切记!切记!

(2)必要的时候,通过【SQL Profiler 跟踪器】发现问题,还是推荐的,不要太排斥【SQL Profiler 跟踪器】。

(3)当然,发现 应用机器名称,还可以通过  【SQL Server活动监视器】 或者是 动态管理视图【sys.dm_exec_sessions】来实现。

(4)为什么hostnam只保留15位,本身尚未找到说明文档。

有一个分享是 DB Server hostname 长度超过15位,导致 SQLServerAgent启动失败的解释。 原因:sqlserver代理会截取你的hostname,如果hostname超过15位,则代理的登录名与你的hostname不相同

解决方法:修改你的hostname

https://www.jianshu.com/p/50d5df083df7

参考

1.《SQL Server活动监视器》

https://www.rstk.cn/news/213061.html?action=onClick

2.开启MSDTC的方法

http://runxinzhi.com/f2flow-p-2437748.html

3.MSDTC分布式事务协调器跨域设置

https://www.cnblogs.com/tom-lau/p/11983262.html

www.htsjk.Com true http://www.htsjk.com/Sql_Server/47301.html NewsArticle 应用服务器名称过长导致使用MSDTC报错,其中有个较老的系统使 项目背景 因机房迁移,部分系统需要从A机房迁移至B机房,迁移的方式是申请资源从新部署 应用和 DB 。其中有个较老的...
评论暂时关闭