【问题标题】:How to add more columns in existing Change Data Capture (CDC) table without Losing any data如何在现有变更数据捕获 (CDC) 表中添加更多列而不丢失任何数据
【发布时间】:2019-06-14 10:03:06
【问题描述】:
我在 Microsoft SQL Server 2008 中有一个表,我已经为其启用了 5 列的 CDC。它已经在生产中运行和生活,并拥有数千条记录。现在我需要在同一个表中添加 4 个新列,并为新添加的列启用数据捕获。
我尝试了以下场景:
1. 为 CDC 创建一个新的临时实例并将所有数据从原始 CDC 复制到 tempCDC 实例。现在再次使用原始名称重新创建 CDC 实例并从临时实例中复制所有数据。
但在这种情况下,CDC.change_tables 中的起始 Lsn 列会被重置。我存储了原始起始 Lsn 并将其替换为原始起始 Lsn 以及表 CDC change_tables。
但它仍然无法正常工作,并且似乎在重新创建实例时它正在内部重置某些地方的 start Lsn。
因此我无法查看基于 CDC 启用表的报告。
【问题讨论】:
标签:
sql-server
sql-server-2008
change-data-capture
【解决方案1】:
以下查询解决了我的目的。
DECLARE @startLsn binary(10)
SELECT @startLsn = MIN([__$start_lsn]) FROM [cdc].[dbo_City_CT]
UPDATE [cdc].[change_tables] set [start_lsn] =@startLsn
WHERE [capture_instance] ='dbo_City';
其中 [cdc].[dbo_City_CT] 是重新创建的最终实例表,其中包含所有新列以及所有现有数据。
所以。该命令必须在“重新创建实例并恢复旧数据”后才能运行。
【解决方案2】:
我没有要测试的 SQL 2008,但在较新的版本中,您可以执行以下操作:
- 为更改的表创建一个新的捕获实例。每个表可以有 2 个实例,新的实例将包含新列。
- 将第一个实例的_CT表的内容添加到第二个实例的_CT表中
- 删除该表的旧捕获实例。
您尝试的方式是不可能的,您应该使用新的捕获实例。