为 CDC 配置自行管理的 SQL Server 数据库

本页面介绍如何配置变更数据捕获 (CDC),以 将数据从自管理的 SQL Server 数据库流式传输到受支持的目标位置, 例如 BigQuery 或 Cloud Storage。

  1. 确保您的数据库使用完整恢复模式。如需检查和设置恢复模式,请连接到数据库,然后在 SQL 提示符或终端中运行以下命令:

    USE master
    GO
    ALTER DATABASE [DATABASE_NAME] SET RECOVERY FULL
    GO
    

    DATABASE_NAME 替换为源数据库的名称。

  2. 为源数据库启用 CDC。如需执行此操作,请连接到数据库,然后在 SQL 提示符或终端中运行以下命令:

    USE [DATABASE_NAME]
    GO
    EXEC sys.sp_cdc_enable_db
    GO
    

    DATABASE_NAME 替换为源数据库的名称。

  3. 在需要捕获更改的表上启用 CDC:

    USE [DATABASE_NAME]
    EXEC sys.sp_cdc_enable_table
    @source_schema = N'SCHEMA_NAME',
    @source_name = N'TABLE_NAME',
    @role_name = NULL
    GO
    

    替换以下内容:

    • DATABASE_NAME:源数据库的名称
    • SCHEMA_NAME:表所属的架构的名称
    • TABLE_NAME:要为其启用 CDC 的表的名称
  4. 启动 SQL Server Agent 并确保它始终处于运行状态。如果 SQL Server Agent 长期处于关闭状态,日志可能会被截断,导致 Datastream 未读取的变更数据永久丢失。

    如需了解如何运行 SQL Server Agent,请参阅 启动、停止或重启 SQL Server Agent 实例

  5. 启用快照隔离。

    从 SQL Server 数据库回填数据时,务必确保快照的一致性。如果您未应用本部分中所述的设置,则在回填过程中对数据库所做的更改可能会导致重复或错误的结果。如果您的流包含没有主键的表,则必须应用快照隔离设置。

    启用快照隔离会在回填过程开始时创建数据库的临时视图。这样可确保复制的数据保持一致,即使其他用户同时对实时表进行更改也是如此。 启用快照隔离可能会对性能产生轻微影响,但对于可靠的数据提取至关重要。

    如需启用快照隔离,请执行以下操作:

    1. 使用 SQL Server 客户端连接到您的数据库。
    2. 运行以下命令:
    ALTER DATABASE DATABASE_NAME SET ALLOW_SNAPSHOT_ISOLATION ON;
    

    DATABASE_NAME 替换为数据库的名称。

  6. 创建 Datastream 用户:

    1. 连接到源数据库,然后输入以下命令:

      USE DATABASE_NAME;
      
    2. 创建在 Datastream 中设置连接配置文件时使用的登录名。

      CREATE LOGIN YOUR_LOGIN WITH PASSWORD = 'PASSWORD';
      
    3. 创建用户:

      CREATE USER USER_NAME FOR LOGIN YOUR_LOGIN;
      
    4. 为其分配 db_datareader 角色:

      EXEC sp_addrolemember 'db_datareader', 'USER_NAME';
      
    5. 向其授予 VIEW DATABASE STATE 权限:

      GRANT VIEW DATABASE STATE TO USER_NAME;
      
    6. 将此用户添加到 master 数据库:

      USE master;
      CREATE USER USER_NAME FOR LOGIN YOUR_LOGIN;
      

事务日志 CDC 方法所需的额外步骤

只有在配置源 SQL Server 数据库以与事务日志 CDC 方法搭配使用时,才需要执行本部分中所述的步骤。

  1. 连接到源数据库,然后为您的用户分配 db_ownerdb_denydatawriter 角色:

    USE DATABASE_NAME;
    EXEC sp_addrolemember 'db_owner', 'USER_NAME';
    EXEC sp_addrolemember 'db_denydatawriter', 'USER_NAME';
    
  2. sys.fn_dblog 函数授予 SELECT 权限。

    USE master;
    GRANT SELECT ON sys.fn_dblog TO USER_NAME;
    
  3. 将您的用户添加到 msdb 数据库,并为其分配以下权限:

    USE msdb;
    CREATE USER USER_NAME FOR LOGIN YOUR_LOGIN;
    GRANT SELECT ON dbo.sysjobs TO USER_NAME;
    
  4. master 数据库中为您的用户分配以下权限:

      USE master;
      GRANT VIEW SERVER STATE TO YOUR_LOGIN;
    
  5. 设置轮询间隔,以便您希望更改在源中可用。

    USE [DATABASE_NAME]
    EXEC sys.sp_cdc_change_job @job_type = 'capture' , @pollinginterval