同一服务器启用SQL Server 2012 CLR致2008实例备份故障求助
咱们先把场景理清楚:同一台服务器上跑着SQL Server 2008和2012 Express两个实例,给2012执行sp_configure 'clr enabled', 1启用CLR之后,第三方ERP备份2008数据库就开始挂起,一关CLR就恢复正常。你要保持CLR启用,那问题十有八九出在ERP备份工具的实现逻辑上,我给你梳理几个最可能的方向:
备份工具没做好实例资源隔离,误碰CLR资源
有些第三方备份工具为了节省资源或者实现跨实例功能,会在不同SQL实例之间共享底层系统组件。2012启用CLR后,CLR运行时会占用一部分系统级资源——比如内存、线程池,甚至某些系统锁。如果备份工具没做严格的实例隔离,备份2008的时候可能会错误地去访问2012的CLR资源,或者因为CLR占用了关键资源,备份进程拿不到足够的系统资源,直接就挂住了。备份工具依赖的组件和CLR运行时冲突
ERP备份工具大概率依赖了.NET Framework组件或者系统级API,而SQL Server的CLR启用后会加载自己的.NET运行时环境(SQL Server自带的CLR宿主和系统原生.NET可能存在版本或资源竞争)。要是备份工具的组件和2012的CLR运行时在系统层面撞车了——比如DLL版本不兼容、线程同步出问题——备份进程直接就卡壳了。备份工具错把服务器级状态当实例级,逻辑走偏
得强调一下:SQL Server的CLR是实例级配置,每个实例独立控制是否启用。但有些偷懒的工具实现,不针对目标实例(也就是2008)查询sp_configure的结果,反而去检测服务器级的注册表项或者系统服务状态。2012一开CLR,工具就误以为整个服务器的CLR都开了,跑去执行针对CLR实例的特殊备份逻辑——比如尝试备份CLR程序集,但2008根本没这类对象,或者逻辑和2008不兼容,直接就导致备份挂起。CLR占用内存导致备份进程资源等待
2012启用CLR后,CLR运行时肯定会占用内存,要是还有CLR程序在运行,内存占用会更高。如果服务器本身内存资源紧张,备份2008的时候,备份进程需要的内存被2012的CLR抢了,就会进入资源等待状态,表现为备份挂起。这种情况你可以看看服务器内存使用情况,还有2012实例的max server memory是不是设得太高,把内存都占满了。备份工具的账号权限被CLR配置影响
启用CLR之后,SQL Server实例的权限模型会有一些变化——比如CLR程序集可能需要特定的权限。如果ERP备份工具使用的账号同时访问2008和2012实例,2012开CLR后,账号的权限可能被CLR相关配置间接影响,导致备份2008的时候拿不到所需的权限,直接卡住。
内容的提问来源于stack exchange,提问作者dpaladin

