1. SQL SERVER配置说明

请遵循以下说明以确保在 Tapdata 中成功添加和使用SQLServer数据库。默认情况下,未启用 SQLServer 增量复制。为了在 SQLServer上执行更改数据捕获,必须事先由管理员明确启用增量复制功能。

注意: 您必须以 sysadmin 的成员身份登录到 SQLServer Management Studio 或 sqlcmd。 增量复制是 SQLServer 2008 及更高版本支持的功能。 确保 SQL 代理 任务是启动状态(在 SQLServer Management Studio 里面左下角)

2. 支持版本

SQL Server 2005、2008、2008 R2、2012、2014、2016、2017

3. 先决条件

3.1 开启 Sql Server 数据库代理服务

说明:如果

  • 查找 mssql-conf 工具

    1. find / -name mssql-conf
  • 开启代理服务

    1. mssql-conf set sqlagent.enabled true

    3.2 启用数据库增量复制

  • 数据库启用增量复制

    1. use [数据库名称]
    2. go
    3. EXEC sys.sp_cdc_enable_db
    4. go

    其中 [数据库名称] 是要启用增量复制的数据库。

  • 检查数据库是否启用增量复制

    1. SELECT [name], database_id, is_cdc_enabled
    2. FROM sys.databases
    3. WHERE [name] = N'[数据库名称]'
    4. go

    其中 [数据库名称] 是您要复制的数据库。

    3.3 表开启增量复制

  • 启用增量复制

    1. use<数据库名称>
    2. go
    3. EXEC sys.sp_cdc_enable_table
    4. @source_schema = N'[Schema]',
    5. @source_name = N'[Table]',
    6. @role_name = N'[Role]'
    7. go

    说明:
    <Schema>dbo
    <Table>是数据表的名称(没有 schema )。
    <Role>是可以访问更改数据的角色。如果您不想使用选通角色,请将其设置为NULL

    注意: 如果在启用增量复制时指定了 “”,则必须确保提供给 Tapdata 的数据库用户名具有适当的角色,以便 Tapdata 可以访问增量复制表。

  • 检查是否为表启用了增量复制

    1. use <数据库名称>
    2. go
    3. SELECT [name],is_tracked_by_cdc
    4. FROM sys.tables
    5. WHERE [name] = N'[table]'
    6. go
  • CDC的表执行DDL后

如果CDC的表对字段进行了增、删、改的DDL操作,则必须进行如下操作,否则在增量同步过程中,可能会出现数据不同步或者报错的情况

  • 需要disable该表的CDC*

    1. go
    2. EXEC sys.sp_cdc_disable_table
    3. @source_schema = N'[Schema]',
    4. @source_name = N'[Table]',
    5. @capture_instance = N'[Schema_Table]'
    6. go
    7. // capture_instance一般为schema_table的格式拼接而成,可以通过以下命令,查询实际的值
    8. exec sys.sp_cdc_help_change_data_capture
    9. @source_schema = N'[Schema]',
    10. @source_name = N'[Table]';
  • 重新enable开启CDC

    1. use<数据库名称>
    2. go
    3. EXEC sys.sp_cdc_enable_table
    4. @source_schema = N'[Schema]',
    5. @source_name = N'[Table]',
    6. @role_name = N'[Role]'
    7. go

    3.4 版本低于 2008 的 CDC

    MSSQL 从 SQLServer 2008 开始提供 CDC 支持。对于较早的版本,必须使用 “custom sql” 功能来模拟更改数据捕获。在从旧版本复制数据时,需要考虑以下几点:

  • 源表必须有一个更改跟踪列,比如 LAST_UPDATED_TIME,它在每次插入或更新记录时都会更新。

  • 在任务设置界面

    确保只选择 INITIAL_SYNC ,因为不支持 CDC 将 “重复运行自定义 SQL” 设置为 True。这将导致重复执行定制 SQL。

  • 在映射设计上提供适当的自定义 SQL

3.5 CDC日志清理设置

SQLServer开启CDC后,不会自动清理增量数据日志,需要进行如下设置开启清理任务。

  1. --retention的单位为分钟,本处设定清理周期为2
  2. USE AdventureWorks2012;
  3. GO
  4. EXECUTE sys.sp_cdc_change_job
  5. @job_type = N'cleanup',
  6. @retention = 2880;
  7. GO

3.6 SQLServer全库CDC设置

1. 开启全库CDC

  1. -- 全局替换 TAPDATA 替换为实际的数据库名
  2. -- 全局替换 INSURANCE 替换为实际的 schema 名称
  3. USE TAPDATA
  4. GO
  5. EXEC sys.sp_cdc_enable_db
  6. GO
  7. declare @table_name varchar(100)
  8. declare @database_name varchar(100)
  9. declare @schema_name varchar(100)
  10. set @database_name = 'TAPDATA'
  11. set @schema_name = 'INSURANCE'
  12. declare my_cursor cursor for SELECT TABLE_NAME
  13. FROM TAPDATA.INFORMATION_SCHEMA.TABLES
  14. where TABLE_CATALOG = @database_name
  15. and TABLE_SCHEMA = @schema_name;
  16. open my_cursor
  17. fetch next from my_cursor into @table_name
  18. while @@FETCH_STATUS = 0
  19. begin
  20. begin try
  21. exec sys.sp_cdc_enable_table
  22. @source_schema = @schema_name,
  23. @source_name = @table_name,
  24. @role_name = NULL
  25. end try
  26. begin catch
  27. print('[ERROR] ' + @table_name)
  28. end catch
  29. fetch next from my_cursor into @table_name
  30. end
  31. close my_cursor
  32. deallocate my_cursor

2. 关闭全库CDC

  1. -- 全局替换 TAPDATA 替换为实际的数据库名
  2. -- 全局替换 INSURANCE 替换为实际的 schema 名称
  3. USE TAPDATA
  4. GO
  5. declare @table_name varchar(100)
  6. declare @database_name varchar(100)
  7. declare @schema_name varchar(100)
  8. set @database_name = 'TAPDATA'
  9. set @schema_name = 'INSURANCE'
  10. declare my_cursor cursor for SELECT TABLE_NAME
  11. FROM TAPDATA.INFORMATION_SCHEMA.TABLES
  12. where TABLE_CATALOG = @database_name
  13. and TABLE_SCHEMA = @schema_name;
  14. open my_cursor
  15. fetch next from my_cursor into @table_name
  16. while @@FETCH_STATUS = 0
  17. begin
  18. begin try
  19. EXEC sys.sp_cdc_disable_table
  20. @source_schema = @schema_name,
  21. @source_name = @table_name,
  22. @capture_instance = 'all';
  23. end try
  24. begin catch
  25. print ('[ERROR] ' + @table_name)
  26. end catch
  27. fetch next from my_cursor into @table_name
  28. end
  29. close my_cursor
  30. deallocate my_cursor
  31. EXEC sys.sp_cdc_disable_db
  32. GO

4. SQLServer从节点同步配置

如果要从节点上做同步,除按照3(先决条件)配置之外,还需要:
SQL server从节点上的数据同步,需检查以下配置项:

  1. 开启 Sql Server 数据库代理服务 :

    1. mssql-conf set sqlagent.enabled true
  2. 开启Sql Server数据库增量复制:

    1. use 数据库名称
    2. go
    3. EXEC sys.sp_cdc_enable_db
    4. go
  3. 开启Sql Server数据库表的增量复制:

    1. use 数据库名称
    2. Go
    3. EXEC sys.sp_cdc_enable_table
    4. @source_schema = Nschema’,
    5. @source_name = Nname’,
    6. @role_name = Nrole
    7. go

5. SQLServer CDC配置微软官方指引

当遇到本文未覆盖到的问题时,请参考:
https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/change-data-capture-stored-procedures-transact-sql?view=sql-server-ver15
版本以实际为准。

官网:cloud.tapdata.net 联系我们进入用户交流群