是否还记得在部署DBA常规作业文章中,第4步所报的错误:
无法解决 equal to 运算中 "SQL_Latin1_General_CP1_CI_AS" 和 "Chinese_PRC_CI_AS" 之间的排序规则冲突。
当时针对那个作业对涉及的存储过程进行相应的修改是没有问题的,并且解决了那个错误。
今天将SQLServer代理服务启动,发现代理日志中很多类似上次的错误,把所有作业禁用后,错误依然存在:
知道是msdb库的排序规则导致的,打算用以前的一个备份文件尝试还原再去查看是否报错。
想起之前有对本地的两个数据库实例配置复制,于是想先把复制禁用,再还原msdb数据库。在按步骤禁用发布和分发后,发现代理日志中不再出现错误。怀疑是复制导致。于是重新配置复制,每操作一步查看代理日志信息。
发布与分发在不同的实例。发布服务器上的msdb库排序规则为SQL_Latin1_General_CP1_CI_AS,其他库(发布、分发)的排序规则都是Chinese_PRC_CI_AS。在发布服务器上配置分发(发布服务器上注册分发服务器)后,发布服务器上的sql server代理错误日志就会出现:
[298] SQLServer 错误: 468,无法解决 equal to 运算中 "Chinese_PRC_CI_AS" 和 "SQL_Latin1_General_CP1_CI_AS" 之间的排序规则冲突。 [SQLSTATE 42000]
我把分发上的数据库代理服务停止后,错误还是会出现。基本上每20秒出现一次,猜测应该是发布服务器上定时在执行某个语句。原本想问群里的大菠萝,后来想想可以先开启sql profiler跟踪,不出所料,发现一个可疑过程:
为什么会执行这个过程,这个过程的用途是什么?
msdb..sp_sqlagent_get_perf_counters is used to fire the the sqlagent alerts.
Whenever there is alert set,this procedure is executed in background to determine the threshold limits, be it an alert for any performance condition.
You mention that it runs frequently,but by default its 20 seconds.Theres a registry key to change the interval
HKLMSOFTWAREMicrosoftMicrosoft SQL ServerMSSQL10_50.SQL08R2SQLServerAgentPerformanceSamplingInterval
根据上面的提示,在SQL Server代理下看到一个警报,所以msdb..sp_sqlagent_get_perf_counters过程默认会在后台每20秒执行一次。
直接执行过程,报错
查看过程语句,在红框部分出错,spi1对应 sys.dm_os_performance_counters
至此,配置分发时创建警报,后台触发msdb..sp_sqlagent_get_perf_counters 过程执行。但由于master与msdb库的排序规则不一致,导致关联时报错。
解决方案,保持两个库的排序规则相同。可以用以前的备份文件尝试还原再去查看是否报错。