在 MICROSOFT SQL Server 中启用内置 CDC

重要

MICROSOFT SQL Server 连接器为 公共预览版

本页提供在 Microsoft SQL Server 中启用内置更改数据捕获(CDC)的说明。 必须启用更改跟踪或 CDC 才能使用 SQL Server 连接器。 Databricks 建议对具有主键的任何表使用更改跟踪,以最大程度地减少源数据库上的负载。 如果同时启用了更改跟踪和 CDC,连接器将使用更改跟踪。 有关选择哪个选项的指导,请参阅更改跟踪与更改数据捕获

为源数据库启用内置 CDC

  1. 登录到要启用 CDC 的数据库。

  2. 在数据库上下文中运行以下 T-SQL 命令:

    Azure SQL 数据库和本地 SQL Server

    EXEC sys.sp_cdc_enable_db
    

    Amazon RDS for SQL Server

    EXEC msdb.dbo.rds_cdc_enable_db '<database-name>'
    

有关详细信息,请参阅 SQL Server 文档中的为数据库启用变更数据捕获

为源表启用内置 CDC

若要在源表上启用 CDC,请在 Azure SQL 中运行以下存储过程。 替换 source_schemasource_namerole_name 的值。 如果表具有主键,@support_net_changes 仅支持值 1

  • 替换 source_schemasource_namerole_name 的值。
  • 如果表具有主键, @support_net_changes 则仅支持值 1
EXEC sys.sp_cdc_enable_table
@source_schema = N'MySchema',
@source_name   = N'MyTable',
@role_name     = NULL,
@supports_net_changes = 1

有关详细信息,请参阅 SQL Server 文档中的为表启用变更数据捕获

授予对 CDC 架构的 SELECT 权限

除了 源设置中所述的权限外,数据库用户还需要 SELECT 对架构 cdc具有特权。 此架构包含启用 CDC 时创建的更改表。 运行以下 T-SQL 命令:

GRANT SELECT ON SCHEMA::cdc to <database-user>;

授予 VIEW SERVER STATE(本地和 RDS)

对于本地实例和 RDS 实例,只能通过 VIEW SERVER STATE 权限查询 sys.dm_server_services,该权限用于检查 SQL Server 代理的状态。 运行以下 T-SQL 命令:

GRANT VIEW SERVER STATE to <database-user>

设置 DDL 捕获和架构演变

SQL 连接器能够在复制的数据库对象上跟踪数据定义语言 (DDL),并将相关的表架构更改应用于目标表,或者在进行完整架构复制时添加新表。

DDL 捕获需要额外设置数据库对象,例如内部表、存储过程和触发器。 本文ddl_support_objects.sql()中提供的 Transact-SQL(T-SQL)脚本会删除任何预先存在的 DDL 支持对象,并创建捕获数据库中发生的 DDL 更改所需的 DDL 支持对象。

  1. 下载 ddl_support_objects.sql 脚本。

  2. 修改脚本以设置 mode 值:

    • BOTH:初始化 CT 和 CDC 对象(默认值)
    • CT:初始化 CT 对象
    • CDC:初始化 CDC 对象
    • NONE:删除所有预先存在的 CT 和 CDC 对象
  3. (推荐)(可选)修改脚本,将 replicationUser 变量设置为 SQL Server 数据库用户。

    如果定义了 replicationUser,该脚本会向用户授予使用 DDL 支持对象所需的所有权限。 否则,必须手动授予每个特权。

  4. 对要引入的每个数据库运行脚本。

    重要

    不要在 master 数据库上运行脚本。

    如果在第三方工具中运行脚本,请在运行脚本之前选择整个脚本。

变更数据捕获 (CDC) 权限要求

如果在脚本中设置 replicationUser 变量,该脚本会将对 DDL 支持对象所需的权限授予数据库用户。 所需的权限包括:

  • VIEW DEFINITION 对象上执行 lakeflowDisableOldCaptureInstance_1_1
  • VIEW DEFINITION 对象上执行 lakeflowRefreshCaptureInstance_1_1
  • VIEW DEFINITION 对象上执行 lakeflowMergeCaptureInstances_1_1
  • 在要引入的数据库上执行 VIEW DEFINITION
  • 在要引入的数据库上执行 VIEW DATABASE PERFORMANCE STATE
  • UPDATE 对象上执行 lakeflowCaptureInstanceInfo_1_1
  • EXECUTE 架构上执行 dbo
  • EXECUTE 对象上执行 lakeflowMergeCaptureInstances_1_1
  • EXECUTE 对象上执行 lakeflowDisableOldCaptureInstance_1_1
  • EXECUTE 对象上执行 lakeflowRefreshCaptureInstance_1_1

如果 replicationUser 脚本中未设置,则必须手动为 CDC 授予所需的权限。 为此,请运行以下 T-SQL 命令,替换 <database-user>

GRANT VIEW DEFINITION ON object::dbo.lakeflowDisableOldCaptureInstance_1_1 TO <database-user>;
GRANT VIEW DEFINITION ON object::dbo.lakeflowRefreshCaptureInstance_1_1 TO <database-user>;
GRANT VIEW DEFINITION ON object::dbo.lakeflowMergeCaptureInstances_1_1 TO <database-user>;
GRANT VIEW DEFINITION TO <database-user>;
GRANT VIEW DATABASE PERFORMANCE STATE TO <database-user>;
GRANT UPDATE ON object::dbo.lakeflowCaptureInstanceInfo_1_1 TO <database-user>;
GRANT EXECUTE ON schema::dbo TO <database-user>;
GRANT EXECUTE ON object::dbo.lakeflowMergeCaptureInstances_1_1 TO <database-user>;
GRANT EXECUTE ON object::dbo.lakeflowDisableOldCaptureInstance_1_1 TO <database-user>;
GRANT EXECUTE ON object::dbo.lakeflowRefreshCaptureInstance_1_1 TO <database-user>;

后续步骤

创建引入管道