同步 SQL 个服务器数据库

Synchronize SQL Server databases

我有一个新的想法和问题想请教您。

我们有一个本地/内部 CRM 应用程序。我们使用那种 24X7 的应用程序。我们还在同一个 CRM 数据库(即 OLTP)和 SSRS 报告上进行计费和工资核算。

看起来每当我们在前端执行同时插入和更新几个实体的操作时,我们的应用程序会冻结,直到该过程完成。 例如为 500 名员工在过去 2 周内的活动提取工资单。基本上,它总结了总工作时间,从数据库中提取数字,并且 writes/updates 记录了提取完成的位置。因此,对于 500 名员工,我们正在查看大约 40K-50K 行的 Insert/Select/Update 语句。

在此进程运行期间,任何人都不能做任何事情!我们正在考虑以下选项来解决此问题。

  1. 运行这个过程在非工作时间
  2. 或者制作 Dyna 数据库的副本。 CRM 并在副本上执行此操作(提取数千条记录和 运行 多个报告)。

我的问题是:

  1. 如何首先创建副本以及在何处创建(最佳做法)?
  2. 如何做到实时同步
  3. 如果我们在副本数据库中执行 select 语句操作就没问题,但是如果我们在副本中执行任何 insert/update 如何在实际的实时数据库中反映出来? ,简而言之如何确保原始数据库和副本数据库彼此实时同步。

我知道我问了太多问题,但是作为 SQL 人,进入 CRM 团队并提供建议,您知道我想说什么。

感谢大家提前提出任何建议。

好吧,为了回答您关于实时 "copy" 数据库的问题,一个好的解决方案是 alwayson 可用性组。

https://blogs.technet.microsoft.com/canitpro/2013/08/19/step-by-step-creating-a-sql-server-2012-alwayson-availability-group/

尽管我认为这不是您在这种情况下想要的。 Alwayson 可用性组通常用于需要极短故障时间范围的数据库实例。例如:如果主数据库服务器在集群中出现故障,它最多会在一两秒内故障转移到辅助数据库,而最终用户只会注意到一秒钟的轻微问题。

我认为您会发现更好的方法是查看那些正在访问您的数据库服务器的插入语句,并了解它们阻止您提取数据的原因。如果他们真的锁定了 table,也许将您的大量读取更改为 "nolock" 读取可能有助于解决您的情况。

了解您分配了何种资源以及您是否在核心 table 上为您的数据库建立了适当的索引也会很有帮助。如果您没有正确的索引,那么很多查询可能会比正常情况下花费更长的时间,从而导致您的视线被锁定。

最后,如果您反对的 table 太大,我会推荐 table 分区。这可能有助于解决许多磁盘速度问题,如果您按时间段分区,也有助于优化您的查询(即每 X 个月创建一个新分区,这样当查询从一个时间段中提取时,它们只从该数据文件中提取) .

https://msdn.microsoft.com/en-us/library/ms190787.aspx

我会说你需要更多地关注效率,而不是 "copy database",因为你的音量不是很高,从它的声音中需要类似的东西。我目前有一个 sql 服务器事务数据库 运行 每天有超过 1000 万次插入,而且我仍然有实时报告反对它。您只需要资源和适当的索引来适应。