我们有一个场景,我们希望将生产数据库(包括列)的排序规则从 SQL_Scandinavian_Pref_CP850_CI_AS 更改为 Finnish_Swedish_CI_AS。我们已经开发了脚本来做到这一点。但是在超过 100GB 的大型数据库中执行这个脚本需要相当长的时间,而且我们不能承受很长的停机时间。所以我们决定使用以下策略来减少停机时间:
- 我们将设置事务复制,并使用数据库备份方法初始化订阅者。
- 发布者数据库将与应用程序一起使用,其事务将通过事务复制传递到订阅者数据库。
- 我们将在订阅者端执行排序规则更改脚本,当发布者和订阅者数据库的 SQL Server 相同时,它确实允许我们执行此脚本。我们最近在 SQL Server 2019 中发现了这一点。
- 现在,痛点是,当 varchar、char 列的数据包含“åÅäÄöÖ”等特殊字符时,它无法正确复制它。在订阅者方面,我们收到了一些奇怪的字符,例如“†„Ž”™'
您能否建议我们如何解决此错误或任何替代架构,以在更改数据库排序规则(包括列)时最大限度地减少生产中的停机时间?
此外,我的排序规则更改脚本正在订阅者数据库上执行以下任务以更改其排序规则:
- 删除外键约束
- 删除索引,包括主键
- 删除检查和默认约束
- 删除用户统计信息
- 删除视图、计算列、SP 以解决对象绑定错误
- 执行上述步骤后,表已准备好进行排序规则更改。因此,该脚本将一一更改每个表的列排序规则。
- 成功执行步骤 6 后重新创建上面列出的约束。
我刚试过这个,它在事务复制中工作:
上述设置将正确的数据从发布方数据库传送到订阅方数据库。它的列级排序规则更改需要时间,这取决于表包含多少数据。只需首先删除依赖项并重新创建它们,就可以在停机时管理数据库级别的排序规则更改。因此,它是导致此数据问题的数据库级别排序规则,当它不同时,而不是列级别排序规则。