本页面介绍如何配置变更数据捕获 (CDC),以 将数据从自管理的 SQL Server 数据库流式传输到受支持的目标位置, 例如 BigQuery 或 Cloud Storage。
确保您的数据库使用完整恢复模式。如需检查和设置恢复模式,请连接到数据库,然后在 SQL 提示符或终端中运行以下命令:
USE master GO ALTER DATABASE [DATABASE_NAME] SET RECOVERY FULL GO将
DATABASE_NAME替换为源数据库的名称。为源数据库启用 CDC。如需执行此操作,请连接到数据库,然后在 SQL 提示符或终端中运行以下命令:
USE [DATABASE_NAME] GO EXEC sys.sp_cdc_enable_db GO将
DATABASE_NAME替换为源数据库的名称。在需要捕获更改的表上启用 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 的表的名称
启动 SQL Server Agent 并确保它始终处于运行状态。如果 SQL Server Agent 长期处于关闭状态,日志可能会被截断,导致 Datastream 未读取的变更数据永久丢失。
如需了解如何运行 SQL Server Agent,请参阅 启动、停止或重启 SQL Server Agent 实例。
启用快照隔离。
从 SQL Server 数据库回填数据时,务必确保快照的一致性。如果您未应用本部分中所述的设置,则在回填过程中对数据库所做的更改可能会导致重复或错误的结果。如果您的流包含没有主键的表,则必须应用快照隔离设置。
启用快照隔离会在回填过程开始时创建数据库的临时视图。这样可确保复制的数据保持一致,即使其他用户同时对实时表进行更改也是如此。 启用快照隔离可能会对性能产生轻微影响,但对于可靠的数据提取至关重要。
如需启用快照隔离,请执行以下操作:
- 使用 SQL Server 客户端连接到您的数据库。
- 运行以下命令:
ALTER DATABASE DATABASE_NAME SET ALLOW_SNAPSHOT_ISOLATION ON;将 DATABASE_NAME 替换为数据库的名称。
创建 Datastream 用户:
连接到源数据库,然后输入以下命令:
USE DATABASE_NAME;创建在 Datastream 中设置连接配置文件时使用的登录名。
CREATE LOGIN YOUR_LOGIN WITH PASSWORD = 'PASSWORD';创建用户:
CREATE USER USER_NAME FOR LOGIN YOUR_LOGIN;为其分配
db_datareader角色:EXEC sp_addrolemember 'db_datareader', 'USER_NAME';向其授予
VIEW DATABASE STATE权限:GRANT VIEW DATABASE STATE TO USER_NAME;将此用户添加到
master数据库:USE master; CREATE USER USER_NAME FOR LOGIN YOUR_LOGIN;
事务日志 CDC 方法所需的额外步骤
只有在配置源 SQL Server 数据库以与事务日志 CDC 方法搭配使用时,才需要执行本部分中所述的步骤。
连接到源数据库,然后为您的用户分配
db_owner和db_denydatawriter角色:USE DATABASE_NAME; EXEC sp_addrolemember 'db_owner', 'USER_NAME'; EXEC sp_addrolemember 'db_denydatawriter', 'USER_NAME';为
sys.fn_dblog函数授予SELECT权限。USE master; GRANT SELECT ON sys.fn_dblog TO USER_NAME;将您的用户添加到 msdb 数据库,并为其分配以下权限:
USE msdb; CREATE USER USER_NAME FOR LOGIN YOUR_LOGIN; GRANT SELECT ON dbo.sysjobs TO USER_NAME;在
master数据库中为您的用户分配以下权限:USE master; GRANT VIEW SERVER STATE TO YOUR_LOGIN;设置轮询间隔,以便您希望更改在源中可用。
USE [DATABASE_NAME] EXEC sys.sp_cdc_change_job @job_type = 'capture' , @pollinginterval