作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
在孤立的系统之间共享相关信息对组织来说变得越来越重要, 因为它允许他们提高数据的质量和可用性. 在许多情况下,在多个目录服务器中拥有可用且一致的数据集是很有用的. 这就是为什么要知道表演的常用方法 SQL Server 数据同步很重要.
数据的可用性和一致性可以通过数据复制和数据同步过程来实现. 数据复制是为了容错或改进可访问性而创建数据库的一个或多个冗余副本的过程. 数据同步是在两个或多个数据库之间建立数据一致性的过程, 以及随后的持续更新以保持上述一致性.
在很多组织中, 跨不同系统执行数据同步既令人满意又具有挑战性. 我们可以找到许多需要执行数据同步的用例:
数据同步没有唯一的方式或一致同意的方法. 这项任务因情况而异, 而且,即使是初看起来很简单的数据同步也可能很复杂, 由于数据结构的复杂性. 在真实场景中, 数据同步包括许多复杂的任务, 这需要很长时间才能完成. 当出现新的需求时, 数据库专家通常必须重新实现整个同步过程. 因为做这件事没有标准的方法, 除了复制, 数据同步的实现很少是最佳的. 这导致了维护困难和更高的费用. 数据同步的实现和维护是一个非常耗时的过程, 它本身就是一份全职工作.
我们可以手动实现数据同步任务的体系结构, 可能使用微软同步框架, 或者我们可以从管理Microsoft SQL Server的工具中已经创建的解决方案中受益. 我们将尝试描述可用于解决Microsoft SQL Server数据库数据同步的最常见方法和工具,并尝试给出一些建议.
根据源和目的的结构(e.g.(数据库、表),当结构相似或不同时,我们可以区分用例.
当我们在软件开发生命周期的各个阶段使用数据时,这种情况非常常见. 例如,测试环境和生产环境中的数据结构非常相似. 常见的需求是比较测试和生产数据库之间的数据,并将生产数据库中的数据导入到测试数据库中.
如果结构不同,则同步更为复杂. 这也是一个更频繁重复的任务. 常见的情况是从一个数据库导入到另一个数据库. 最常见的情况是,当一个软件需要从另一个由另一家公司维护的软件导入数据时. 通常,导入需要在计划的基础上自动运行.
所使用的方法取决于个人偏好和需要解决的问题的复杂程度.
不管结构有多相似, 我们可以选择四种不同的方法来解决数据同步:
最直接和乏味的解决方案是手动编写用于同步的SQL脚本.
插入
, 更新
, 删除
.插入
, 更新
,有时也 删除
).我们将在表之间进行同步 Source
,有列 ID
和 价值
和桌子 目标
,列数相同.
如果表具有相同的主键, 并且目标表没有自动递增的(标识)主键, 您可以执行以下同步脚本.
——插入
插入目标(ID, 价值)
从源中选择ID,值
WHERE不存在(SELECT * FROM 目标 WHERE 目标 ?.ID =来源.ID);
- - -更新
更新目标
SET 价值 = Source.价值
从目标内部连接源到目标.ID =来源.ID
——删除
从目标删除
WHERE不存在(SELECT * FROM Source WHERE 目标 ?.ID =来源.ID)
在这种方法中,我们可以使用一个工具来比较源数据和目标数据. 比较过程生成SQL脚本,将源数据库的差异应用到目标数据库中.
有许多用于数据比较和同步的程序. 这些程序大多使用相同的方法. 用户选择源数据库和目标数据库, 但其他选择可能是数据库备份, 存放SQL脚本的文件夹, 甚至连到源代码控制系统.
下面是使用数据比较方法的最流行的工具:
第一步, 读取数据, 或者只读取来自源和目标的较大数据的校验和. 然后执行比较过程.
这些工具还提供了用于同步的附加设置.
我们需要设置以下数据同步所需的配置选项:
缺省情况下,主键或a 独特的
使用了约束. 如果没有主键,则可以选择列的组合. Sync键用于将源的行与目标的行配对.
默认情况下,表按名称配对. 您可以改变这一点,并根据自己的需要将它们配对. 在dbForge数据比较软件中,可以选择SQL查询作为源查询或目的查询.
确认后,该工具将比较源数据和目标数据. 整个过程包括下载所有源数据和目标数据,并根据指定的标准对它们进行比较. 默认情况下,比较来自相同名称的表和列的值. 所有工具都支持映射列名和表名. 此外,还存在排除的可能性 身份
(自动递增)列或在比较值之前进行一些转换(浮点类型), 忽略字符大小写, 治疗 零
作为空字符串,等等.)优化数据下载. 如果数据量很大,则只下载校验和. 这种优化在大多数情况下都是有用的, 但是,执行操作所需的时间随着数据量的增加而增加.
在下一步中,有一个生成迁移的SQL脚本. 此脚本可以保存或直接运行. 为了安全起见,我们甚至可以在运行此脚本之前进行数据库备份. ApexSQL数据差异工具可以创建一个可执行程序,该程序在选定的数据库上运行脚本. 该脚本包含需要更改的数据,而不是如何更改它的逻辑. 这意味着不能自动运行脚本以提供循环导入. 这是这种方法最大的缺点.
下面可以看到这些工具的典型UI.
这种方法与数据比较法非常相似. 与以前的方法相比,唯一的区别是没有数据比较, 生成的SQL脚本中不存在数据差异, 但是同步逻辑. 生成的脚本可以很容易地保存到存储过程中,并且可以定期运行.g.,每晚). 此方法对于数据库之间的自动导入非常有用. 该方法的性能比数据比较法要好得多.
自动生成的SQL的同步只能由 SQL数据库工作室.
SQL数据库工作室为数据比较方法提供了类似的接口. 我们需要选择源和目标(数据库或表). 然后我们需要设置选项(同步键、配对和映射). 有一个图形查询生成器功能,用于设置所有参数.
两个数据库(A和B),每个数据库包含一个包含2,000,000行的表. 这些表位于同一个SQL Server的两个不同数据库中. 该测试涵盖两种极端情况:
1)源表包含所有2,000,000行,目标表为空. 同步需要提供很多 插入
.
2)源表和目标表包含2,000,000行. 差别只在于一行. 同步只需要提供一个 更新
.
RedGate数据比较需要3个步骤:
ApexSQL数据差异需要2个步骤:
SQL数据库工作室在一个步骤中执行整个同步. 下面是同步时间,以秒为单位. 在标记为“单个步骤”的列中是上面列出的同步步骤的持续时间.
情况下. 许多插入 | 情况下. 许多insert(单独的步骤) | 案例B. 更新一行 | 案例B. 更新一行(单个步骤) | |
---|---|---|---|---|
SQL数据库工作室 | 47 | 5 | ||
RedGate数据比较 | 317 | 13+92+212 | 23 | 22+0+1 |
ApexSQL数据差异 | 188 | 18+170 | 26 | 25+ |
越低越好.
同样的测试, 但是数据库在不同的SQL服务器上, 哪些没有通过链接服务器连接.
情况下. 许多插入 | 情况下. 许多insert(单独的步骤) | 案例B. 更新一行 | 案例B. 更新一行(单个步骤) | |
---|---|---|---|---|
SQL数据库工作室 | 78 | 44 | ||
RedGate数据比较 | 288 | 17+82+179 | 25 | 24+0+1 |
ApexSQL数据差异 | 203 | 18+185 | 25 | 24+1 |
dbForge数据比较 | 326 | 11+315 | 16 | 16+0 |
越低越好.
从结果来看, 很明显,RedGate和Apex并不关心数据库是否在同一个SQL服务器上, 因为同步算法不依赖于SQL Server. SQL数据库工作室 uses native functions of SQL Server; therefore, 当数据库位于同一台服务器上时,结果会更好.
还有一种情况是,必须将一个宽表同步到许多小的相关表中.
这个示例包含一个宽表SourceData,它需要同步到小表中 大陆
, 国家
, 城市
. 方案如下.
SourceData中的数据可能如下图所示.
插入大陆(名称)
选择SourceData.大陆
从SourceData
在哪里(SourceData.大陆不是空的
并且不存在(SELECT *)从大陆测试,在测试.名字。 = SourceData.大陆))
按源数据分组.大陆;
插入城市(姓名,国家)
选择SourceData.的城市,
国家.Id
从SourceData
源数据上的左连接大陆.大陆=大陆.名字。
在源数据上左侧加入国家.国家=国家.名称和大洲.Id =国家.大陆Id
在SourceData.城市不是空的
和国家.Id不为空
并且不存在(SELECT * FROM 城市 test)
在哪里测试.名称= SourceData.城市和测试.国家Id =国家.Id)
集团
SourceData.的城市,
国家.Id;
这个脚本更复杂. 这是因为表中的记录 国家
和 大陆
必须被找到. 该脚本将丢失的记录插入到 城市
,充满 ContryId
正确.
的 更新
和 删除
如果需要,也可以用同样的方式编写脚本.
插入
, 更新
, 删除
-通常是必要的).这种同步(宽表到许多相关表)不能用数据比较方法完成, 因为它关注不同的用例. 因为数据比较方法会生成一个包含要插入数据的SQL脚本, 它不能直接查找相关表中的引用. 因为这个原因, 使用此方法的应用程序不能使用(dbForge数据比较SQL Server), RedGate SQL数据比较, Apex SQL数据差异.
但是,SQL数据库工作室可以帮助您自动创建同步脚本. 如下图所示, 在SQL数据库工作室中有一个名为“数据同步编辑器”的元素.
编辑器看起来很像众所周知的查询生成器,工作方式也非常相似. 每个表需要有一个定义的同步键, 但是表之间也有定义好的关系. 在上面的图片中也有同步的映射. 在列列表(图像的下部)中有表的列 城市
(对于其他表也是类似的).
列 国家Id
和 名字。
被选为同步键. 同步键是一组列,它们唯一地标识源表和目标表中的一行. 不能使用主键 Id
作为同步键,因为它不在源表中.
同步完成后,表是这样的:
在上面的示例中,有一个宽表作为源. 还有一种常见的情况是,源数据存储在几个相关的表中. SQL数据库工作室中的关系不是使用外键定义的,而是使用列名定义的. 这样也可以从CSV或Excel文件中导入(文件被加载到临时表中), 同步是从那个表运行的). 使用唯一的列名是一种很好的做法. 如果这是不可能的,您可以定义这些列的别名.
数据同步包括一系列的 插入
, 更新
, or 删除
命令. 有多种方法可以创建这些命令的序列. 在本文中,我们研究了创建同步SQL脚本的三个选项. 第一个选项是手动创建所有内容. 这是可行的(但花费太多时间)。, 它需要对SQL有复杂的理解, 而且很难创建和维护. 第二个选择是使用商业工具. 我们研究了以下工具:
前三个工具的工作原理非常相似. 他们比较数据, 让用户分析差异, 并且可以同步选择的差异(甚至可以自动或从命令行). 它们对以下使用场景是有益的:
每个工具都有这样或那样的原因:dbForge有很棒的UI和很多选项, ApexSQL的性能比其他的要好, RedGate是最受欢迎的一个.
第四个工具SQL数据库工作室的工作方式略有不同. 它生成包含同步逻辑而不是更改的SQL脚本. 性能也很好, 因为所有的工作都是直接在数据库服务器上完成的, 因此,不需要在数据库服务器和同步工具之间传输数据. 此工具适用于以下用例:
您可以使用RedGate数据比较等工具, ApexSQL数据差异, 和dbForge数据比较, 哪些使用数据比较方法. 您可以使用SQL数据库工作室,它会自动生成可重用的SQL脚本.
基于数据的比较可以使用第三方工具自动完成,这是有代价的. 另外, 您可以编写比较SQL脚本来显示差异, 但这要耗时得多,而且不可重复使用.
您可以通过编写SQL脚本(插入)手动同步SQL数据库, 删除, 更新),或者您可以使用第三方工具,这是有代价的. 第三方工具通过比较数据和生成同步SQL脚本来工作, 也可以设置同步逻辑和基于它生成SQL脚本.
拥有服务科学硕士学位, 管理, 和工程, Andrej为世界各地的客户从事各种规模的项目.
11
世界级的文章,每周发一次.
世界级的文章,每周发一次.