SQL Server 增量数据同步

今天就说说 SQL Server 增量数据同步。当公司的业务数据量越来越多的时候,数据分析部门总想用来做报表,或者提炼出有用的运营数据。通常,相关负责人希望将各个业务系统、各种不同结构的数据同步到数据仓库、数据湖等。

 

若是其他类型数据库,多部署在 Linux 环境中,同步数据有较多及成熟的方案。

 

SQL Server 有哪些增量同步方案呢?

 

方案一:更改跟踪(Chang Tracking)

更改跟踪是表级别的跟踪,记录的只是行已更改的事实,而不是行更改的次数或任何中间更改的值。因为只存储的行标识符,这就要求表必须有主键。当对表进行DML操作时,系统表都会将主键记录下来,生成自己的行版本。

 

那具体的行数据在哪呢?当然还是在原来的表了,只要将跟踪的主键与原表关联,可以找到新增和最后一次更改的行记录。对于删除的记录,原表没有了,我们知道主键就可以同步到目标表进行删除。通过记录版本,每次可同步最近的操作。

 

图片

CT原理图

 

不过,更改跟踪在实际工作中,很少人会使用。我想有几个原因:

  • 更改的中间值没有记录,对数据有严格的事务属性不适用。

  • DML频繁,也影响到跟踪表记录的DML频繁,也会影响一些性能。

  • 了解的人很少,毕竟几乎所有的第三方同步工具,都是基于变更数据捕获(CDC),而不是更改跟踪。

  • 更改跟踪不算增量同步一种,相当于同步当前一次快照记录。

 

 

方案二:变更数据捕获(Change Data Capture,CDC)

CDC 应该是多少大数据开发人员了解的,CDC 也是表级别的数据同步。CDC 同样有一张表记录跟踪,当对源表进行 DML 时,在事务日志会记录相关操作信息。变更数据捕获代理使用异步进程读取事务日志,将相关操作结果应用到副本表(捕获实例表)中,这样就完成了对源表操作的记录跟踪。即使数据库恢复模式处于简单模式,也同样适用。CDC 原理如下图。

 

图片

CDC 原理

 

对于增量跟踪,应用程序在每次操作时,记录相应的时间或者事务日志序列号(LSN),下次读取大于该 LSN 即可。既然是读取数据库的事务日志,CDC 进程逻辑嵌入在存储过程 sp_replcmds中(事务复制也使用相同的进程)。

 

CDC 是比较常用的,但是当对表新增字段的时候,新字段是不会跟踪的。一般的解决方法是:新增字段后,对原表再启用一个CDC跟踪实例表,待原来的跟踪记录同步完成后,删除原跟踪实例表。字段新增方案其实还有一种,我这有一个脚本(如下链接)。当新增字段后,执行链接中脚本,将生产新的一个临时CDC跟踪实例,根据该实例生成的存储过程信息,替换原来的存储过程,然后禁用该新实例。这样增加字段后就不必等数据同步完成,继续使用表第一次启用CDC的系统对象。

https://github.com/hzc2012/SQLServer/blob/master/Scripts/Sync_CDC_Table_Columns_To_CT

 

 

方案三:UpdatedTime 字段

该方案也是非常普遍的同步方案。表中新增一个时间字段,默认值为当前时间 GETDATE()。然而该字段不像 MySQL 可以自动更新。只能添加一个更新触发器,当行数据被更改时,UpdatedTime 更新为当前时间。如下示例。

CREATE TABLE [dbo].[TestTab](
  ID INT IDENTITY(1,1) NOT NULL,
  Name VARCHAR(50) NOT NULL,
  UpdatedTime DATETIME NOT NULL DEFAULT(GETDATE())
)
GO
CREATE TRIGGER tr_TestTab_update  
ON dbo.TestTab  
AFTER UPDATE   
AS
BEGIN
  UPDATE t SET UpdatedTime=GETDATE() 
  FROM dbo.TestTab t 
  INNER JOIN inserted i ON t.id=i.id
END
GO

数据的同步则按照时间进行增量查询,捕获相应的变更数据。对于触发器,相信大家都比较抵制,触发器每次都得进行一次表关联更新,增加了系统资源开销。若每次更新表数据都更新一个时间字段也不合适。那如何是好啊!下面,我们使用另一种方案!

 

方案四:行版本 rowversion / timestamp

该方案在大多数同学中还不被熟悉,估计只有较专业的 SQL Server DBA 有可能了解。说起 timestamp 可能很多同学都听过,在 SQL Server 中,timestamp 只是 rowversion 的一个同义词(可以说是别名)。timestamp 是 SQL Server 早期版本使用的名称, timestamp 已过时,在以后的 SQL Server 版本中将被删除。接下来,我们就使用 rowversion 吧。

 

rowversion 是数据库中自动生成的唯一二进制数字的数据类型。rowversion 通常用作给表行加版本戳的机制。存储大小为 8 个字节。rowversion 数据类型只是递增的数字,不保留日期或时间。不可为空的 rowversion 列在语义上等同于 binary(8) 列。可为空的 rowversion 列在语义上等同于varbinary(8) 列。

 

我们做一个示例,插入5行数据。

CREATE TABLE TestTab (id INT NOT NULL,rv ROWVERSION );
GO
INSERT INTO TestTab(id) VALUES(1)
GO 5
SELECT * FROM TestTab
GO

id  rv
1  0x00000000000007D5
1  0x00000000000007D6
1  0x00000000000007D7
1  0x00000000000007D8
1  0x00000000000007D9

SELECT @@DBTS AS 当前RV,MIN_ACTIVE_ROWVERSION() AS 下一个可用RV
0x00000000000007D9  0x00000000000007DA

使用系统变量和函数 @@DBTS 和 MIN_ACTIVE_ROWVERSION() 查看数据库的行版本号。也可以创建多个表进行验证,行版本是数据库范围级别的,不过增量同步数据时,还是按表将行版本存储起来,待下一次增量读取表记录。(是不是类似方案三?)

 

 

总结:

SQL Serve 中的增量数据同步方案,相对其他数据库来说是有点损耗性能的,毕竟闭源,只能连接数据库进行数据查询操作。不过,也有较多的第三方工具做的不错,也是基于上面的几种方案进行数据增量抽取。如 Oracle GoldenGate、Debezium 是基于CDC的,而 alibaba/DataX 对于SQL Server 是基于查询抽取数据的。根据不同的业务场景或架构情况,选择符合自己的方案才是最好的。

 

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SQL Server向MySQL同步数据需要使用一些工具或者编写一些脚本来实现。在同步数据前,需要先建立好SQL Server和MySQL之间的连接。 一种常用的同步方法是使用MySQL的ODBC驱动,将SQL Server中的数据导出成CSV格式,再通过ODBC将数据导入到MySQL数据库中。这种方法的缺点是,需要手动定期同步数据,并且如果数据量较大,导入时间较长。 更为高级的同步方法是使用数据同步工具,例如DBSync、ParaSQL等,可以实现自动同步。这些工具可以进行增量同步,只同步更新的数据,大大提高同步效率。此外,还可以针对不同的数据库结构设置映射关系,自定义同步规则。 另外一种方法是编写脚本来实现数据同步。可以使用SQL Server Integration Services (SSIS) 或者Python等编程语言的库来实现。这种方法需要一定的技术水平,但可以自由控制同步过程,适用于特定的需求。 无论采用什么方法,数据同步过程需要注意数据格式和数据类型的兼容性,以及数据一致性的保证。同步过程中还需要监控同步状态和错误信息,及时处理异常情况。 ### 回答2: 将SQL Server中的数据同步到MySQL是一个常见的需求,因为SQL Server和MySQL两种关系型数据库系统都有各自的优点和适用场景。在进行这种数据同步时,可以使用多种方法来实现。 首先,可以使用ETL工具来完成数据同步。ETL工具是专门用于抽取、转换和加载数据的软件,可以将SQL Server中的数据转化为MySQL所需的格式,然后将其加载到MySQL数据库中。其中,ETL的抽取过程可以使用SQL Server的触发器或日志来触发,确保所有的数据都被同步。 另一种方式是使用数据同步工具,比如SymmetricDS、GoldenGate等工具。这些工具可以实现实时数据同步,保证在数据修改后,MySQL数据库能够及时更新。使用这些数据同步工具可以方便地对数据进行精细的控制和调度,避免了数据丢失或重复。 除此之外,还可以使用存储过程或函数来实现数据同步。存储过程或函数可以在SQL Server和MySQL之间进行数据的转换和同步,具有较高的效率和灵活性。可以通过设定适当的参数和条件,实现灵活有效的数据同步。 综上所述,SQL Server向MySQL同步数据可以采用多种方式,选择不同的方法需要考虑到数据量、同步频率、数据精度、效率以及安全性等多个因素。因此,在实施数据同步前,需要认真评估各种方法的优缺点,再根据实际情况进行选择和配置。 ### 回答3: SQL Server 向 MySQL 同步数据通常可以通过以下两种方法实现: 1. 通过工具实现 可以使用一些数据同步工具,例如:MySQL Workbench 和 SQL Server Management Studio 等。这些工具通常都可以提供数据的导入和导出功能,使得数据在两种不同的数据库之间自动同步。这些工具可以将数据转换为 CSV 或者 SQL 脚本,从而能够很容易地将数据导入到 MySQL 数据库中。 2. 使用存储过程实现 SQL Server 和 MySQL 都支持存储过程,可以通过编写同步存储过程来实现数据同步。开发人员首先需要在 MySQL 数据库中创建一个存储过程,然后通过连接 SQL Server 和 MySQL 数据库,将 SQL Server 数据库中的数据导入到 MySQL 数据库中。具体来说,同步存储过程工作流程如下: - 连接到 SQL Server 和 MySQL 数据库。 - 将 SQL Server 数据库中的表复制到 MySQL 数据库中。 - 将 SQL Server 数据库中的数据插入到对应的 MySQL 数据库表中。 - 检查插入过程中是否出现错误。 - 如果没有错误,则提交数据到 MySQL 数据库。 以上就是 SQL Server 向 MySQL 同步数据的两种方法,不同的方法根据场景和需求进行选择。在实际应用中,开发者应该根据自己的实际情况来选择最适合的同步方式,从而保证数据在两种不同的数据库之间的同步

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值