SSMS 2017仅在单台DR服务器启动报错无法使用问题求助
根因说明
启动报错的核心原因是DR服务器上的System.Data.SqlClient组件缺失set_AccessToken方法实现:SSMS 2017的数据层应用向导(DacWizard)从17.x版本开始默认依赖.NET Framework 4.6.1及以上版本提供的SqlClient AccessToken属性支持扩展认证逻辑,DR服务器上的系统组件版本未达到依赖要求,就会抛出方法找不到的异常。同环境下SSMS 2012、2016版本未调用该方法,因此可以正常运行。
排查步骤
- 对比主、DR两台服务器的.NET Framework版本:在DR服务器上打开注册表编辑器,定位到
HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full路径,查看Release项的值,4.6.1对应Release值为394254,低于该值则说明.NET版本不满足要求;同时和主DB服务器的同路径值做对比,确认版本差异 - 检查全局程序集缓存(GAC)中的SqlClient版本:以管理员身份打开命令提示符,执行
gacutil /l System.Data.SqlClient,查看已注册的程序集版本,确认是否存在被SQL Server 2012安装时注册的旧版本SqlClient覆盖了高版本程序集的情况 - 核对两台服务器的系统补丁列表:因为环境为隔离网络,DR服务器镜像还原后可能缺失.NET Framework相关累积更新,逐一对比两台服务器已安装的KB补丁,重点筛选.NET 4.x相关的更新项
- 校验SSMS 2017安装包完整性:离线拷贝的安装包可能在传输过程中损坏,对比安装包的哈希值和官方发布值是否一致,避免因安装包缺件导致组件注册失败
修复方案
- 优先离线安装.NET Framework 4.7.2(SSMS 2017官方推荐的稳定依赖版本),安装完成后强制重启服务器,再启动SSMS 2017验证,该方案可以解决90%以上的同类报错
- 如果升级.NET后仍存在报错,以管理员身份执行命令重新注册GAC中的SqlClient组件:
gacutil /i "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Data.SqlClient.dll",执行前先确认对应路径下的dll文件版本和已安装的.NET版本匹配 - 重新安装SSMS 2017:先卸载当前已安装的SSMS 2017实例,手动删除
%ProgramFiles(x86)%\Microsoft SQL Server Management Studio 17路径下的所有残留文件,右键点击安装包选择「以管理员身份运行」重新完成安装 - 临时规避方案:如果暂时无法调整DR服务器的系统组件版本,可以继续使用已验证正常的SSMS 2016完成Log shipping配置、实例管理等操作,该版本不存在相关依赖,不会触发该报错
内容的提问来源于stack exchange,提问作者h20vrrq
相关产品推荐
相关产品推荐

