更改生产环境中 SQL 数据库的排序规则以最大程度地减少停机时间

Mur*_*han 8 sql-server collation transactional-replication

我们有一个场景,我们希望将生产数据库(包括列)的排序规则从 SQL_Scandinavian_Pref_CP850_CI_AS 更改为 Finnish_Swedish_CI_AS。我们已经开发了脚本来做到这一点。但是在超过 100GB 的大型数据库中执行此脚本将需要相当长的时间,而且我们不能承受很长时间的停机时间。因此,我们决定使用以下策略来减少停机时间:

  1. 我们将设置事务复制,我们将使用数据库备份方法初始化订阅者。
  2. 发布者数据库将与应用程序一起使用,其事务将通过事务复制传递到订阅者数据库。
  3. 我们将在订阅者端执行排序规则更改脚本,当 SQL Server 对发布者和订阅者数据库相同时,它确实允许我们执行此脚本。我们最近在 SQL Server 2019 中发现了这一点。
  4. 现在,痛点是,当 varchar、char 列的数据包含诸如“åÅääÄöÖ”之类的特殊字符时,它无法正确复制。在订阅者方面,我们收到了像“†„Ž”™“这样的奇怪字符

您能否建议我们如何解决此错误或任何替代架构,以在更改数据库排序规则(包括列)时最大限度地减少生产停机时间?

此外,我的排序规则更改脚本正在订阅者数据库上执行以下任务以更改其排序规则:

  1. 删除外键约束
  2. 删除包括主键在内的索引
  3. 删除检查和默认约束
  4. 删除用户统计
  5. 删除视图、计算列、SP 以解决对象绑定错误
  6. 执行上述步骤后,表已准备好进行整理更改。因此,脚本将一一更改每个表的列的排序规则。
  7. 成功执行第 6 步后,重新创建上面列出的约束。

Mur*_*han 5

我刚试过这个,它在事务复制中工作:

  1. 服务器级排序规则是 Finnish_Swedish_CI_AS
  2. 数据库两侧的数据库级别排序规则相同,即 SQL_Scandinavian_Pref_CP850_CI_AS
  3. 发布方数据库的列级排序规则为 SQL_Scandinavian_Pref_CP850_CI_AS,订阅方数据库为 Finnish_Swedish_CI_AS

上述设置将正确的数据从发布方数据库传送到订阅方数据库。它的列级排序规则更改需要时间,这取决于表包含的数据量。只需先删除依赖项并重新创建它们,就可以在停机期间管理数据库级别的整理更改。因此,它是导致此数据问题的数据库级排序规则,当它不同时,而不是列级排序规则。