排序规则不一致引起代理错误

是否还记得在部署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
HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.SQL08R2\SQLServerAgent\PerformanceSamplingInterval

根据上面的提示,在SQL Server代理下看到一个警报,所以msdb..sp_sqlagent_get_perf_counters过程默认会在后台每20秒执行一次。

直接执行过程,报错

查看过程语句,在红框部分出错,spi1对应 sys.dm_os_performance_counters

至此,配置分发时创建警报,后台触发msdb..sp_sqlagent_get_perf_counters 过程执行。但由于master与msdb库的排序规则不一致,导致关联时报错。
解决方案,保持两个库的排序规则相同。可以用以前的备份文件尝试还原再去查看是否报错。

posted @   Uest  阅读(532)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示