在不同的数据源里同步SQL Server数据库

场景

旅游销售代表 或其他领域的工作者- 送货司机, 来访护士等都会使用应用程序。程序被设计来从远处收集数据然后把数据发送到数据中心。同样,数据中心的数据也会偶尔需要发回
到远处,使这些数据保持最新。

例如,无论护士什么时候去探望病人,她们都可以将探望信息输入到移动终端的数据库中。到这一天即将结束的时候,所有这些在当天产生的数据都会被发送到医院的数据中心。
然后,护士们可以使用移动设备与医院的数据中心做数据同步,所以他们可以获取到她们的病人的信息,包括第二天她们需要去探望的病人的信息。

就好像上面这样的场景,会有不断的从移动设备同步数据到数据中心的需求

解决方案

1. 使用SQL Server复制。这会通过在两个不同的数据库中,从一个数据库到另一个数据库复制和分发数据库记录以同步数据

使用SQL Server复制的时候会有一些限制,下面这些限制是不能使用的

  • 只有标准版或企业版SQL Server 可以作为发布者,所以如果你正在使用免费的 SQL Express,你需要升级SQL Server
  • SQL 2005 作为发布者和SQL 2008作为订阅者这样的配置是不支持web 复制
  • 分发数据库版本一定要大于发布数据库的版本或等于发布数据库的版本
  • 在事务复制里订阅数据库的版本必须不能比发布数据库超出2个版本,例如,SQL Server2000 作为发布数据库不能使用SQL Server2012作为订阅数据库
  • 在合并复制里订阅数据库的版本必须等于或小于发布数据库的版本,例如 SQL Server2012作为订阅数据库不能使用SQL Server2008作为发布数据库

2. 使用同步框架,同步框架的API允许你构建应用程序并且在数据库间同步数据。它提供了很多灵活性,不过同步框架需要开发,这会增加开发成本和实现的时间

3. 使用 ApexSQL Data Diff, a 一个SQL Server数据比较和同步工具, 工具能检测数据差异并平滑解决这些差异数据。它能比较和同步在线数据和本地的或本地已压缩数据库备份的数据 并对于检测到的差异能够生成清晰的报表,产生一个同步文件并执行这个文件。

如何去做

想象一下你有一个中央数据库在医院的数据中心,还有探望数据库在护士们的移动设备里。医院添加探望记录到探望表,护士在每天早上利用他们的移动设备获取最新记录,
并找出她们当天的安排。在一天工作里面,护士会对移动设备插入一些记录,这些记录会存储在VisitReports 表

  1. 启动 ApexSQL Data Diff
  2. 对于源,选择数据库作为类型,你的数据中心作为服务器,你的中央数据库作为数据库
  3. 对于目标,选择数据库作为类型,一个远程设备作为服务器(护士们的移动设备),最后数据库会被同步

    Datasources type and details selection in ApexSQL Data Diff

  4. 点击比较按钮

    在数据库里的所有表将会被比较并展示在主窗格里

    Main grid after SQL Server database comparison

    在医院里的Visits 表被插入的记录会被显示在 Missing tab窗口

  5. 检查你想进行同步的表

    Checking the tables for database synchronization

  6. 点击在Home tab窗口里的同步按钮

    Synchronize button in ApexSQL Data Diff

  7. 在同步向导里的同步方向步骤点击“下一步”
  8. 在同步向导里的输出选项,选择同步一个数据库作为输出选项

    Choosing output action in Synchronization wizard

  9. 点击“下一步”
  10. 最后检查将要执行的所有动作的概括和显示的警告内容

    Summary of the actions and warnings preview

  11. 点击 Home tab窗口中的“同步按钮”
  12. 在通知对话框中点击“OK”

    SQL Server database change notification dialogue

    当目标数据库同步完成,将会显示下面的消息

    Script execution results message

  13. 在项目的Home tab 窗口点击“保存”按钮,保存对于这个项目的同步设置,以便下次执行同步的时候更方便和更快

如果在晚上,你需要同步护士在白天在她们数据库中添加的记录,到中央数据库,步骤也是类似的

  1. 将移动设备上的数据库设置为源,中央数据库设置为目标

    Selecting the SQL Server database Source and Destination

  2. 点击“比较”
  3. 在表里面选择在白天的时候被添加的记录,这些记录会被显示在 Missing tab窗口

    Comparison and synchronization of the Source and Destination databases

  4. 在菜单里点击“同步”按钮
  5. 直接进入同步向导并添加缺失的记录到中央数据库
  6. 在项目的 Home tab 窗口点击“保存”,在项目里保存同步配置以便下次更快更容易地执行同步

现在你已经保存了项目,你可以自动同步下面过程

    1. 保存下面的命令到 E:\Test\Morning.bat batch文件 ,这个批处理文件会执行已创建的 Morning_Central_Nurse.axdd 项目:

      "C:\Program files 
      (x86)\ApexSQL\ApexSQLDataDiff2014\ApexSQLDataDiff.com" /
      pf:D: \Test\Morning_Central_Nurse.axdd /
      of:D: \Test\MorningSync.sql / sync / bu:D: \Test / v / f
      

      这会在D:\Test 目录下创建MorningSync.sql 文件并添加从中央数据库到护士数据库的数据,在D:\Test目录下创建一个护士数据库完整备份,并将缺失记录插入到护士数据库

    2. 启动SQL Server Management Studio
    3. 在对象资源管理器里展开SQL Server 代理,右键点击 Jobs 并选择 New job

    4. 指定job的名字

    5. 在Steps 的窗口里,点击 “新建”去创建一个新的step
    6. 对step指定一个”Operating system (CmdExec)” 类型,添加一个step名字,再点击 open
    7. 选择已经保存了的批处理文件 D:\Test\MorningSync.bat

      SQL Server job steps

    8. 点击“OK”按钮
    9. 打开Schedules tab窗口,然后指定数据库同步作业的运行时间

      Scheduling a SQL Server job

重复步骤3到步骤9 去计划一个SQL Server 作业对于夜晚的同步

使用 ApexSQL Data Diff, 在数据中心里的一个数据库去比较和同步远程位置的SQL Server 数据库,这样的工作能够轻松完成不管远程和中央数据库位置的SQL Servers 版本是多少。
不需要编程知识并在你完全掌控之下,一直到行级别

翻译者: 林勇桦

July 2, 2015