备份中缺少 CDC 系统表

xpi*_*pil 6 sql-server-2008 sql-server sql-server-2012 change-data-capture

我正在将使用 CDC 的数据库从 SQL Server 2008 R2 迁移到 SQL Server 2012。

对象资源管理器的“系统表”分支下有CDC相关的表:

cdc.ddl_history
cdc.lsn_time_mapping
cdc.captured_columns
cdc.index_columns
cdc.change_tables
Run Code Online (Sandbox Code Playgroud)

备份数据库并在不同的服务器上恢复后,CDC 相关的表不存在。

我尝试使用 SSIS 复制它们,但它们在“导出数据”向导 GUI 中不可见。似乎实际复制它们的唯一方法是手动导出它们或将SELECT * FROM...结果输出到文件。

如何确保正确恢复变更数据捕获相关表?

Han*_*non 18

如果要将启用 CDC 的数据库还原到不同的实例,则必须确保在执行还原之前“拥有”相关数据库的服务器主体存在于目标实例上。您还必须确保KEEP_CDC在恢复数据库时使用该选项。

恢复选项MSDN 页面

  • KEEP_CDC 应该用于防止在另一台服务器上还原数据库备份或日志备份并恢复数据库时删除更改数据捕获设置。不允许在使用 NORECOVERY 选项还原备份时指定此选项。

  • 使用 KEEP_CDC 恢复数据库不会创建变更数据捕获作业。要在恢复数据库后从日志中提取更改,请为恢复的数据库重新创建捕获进程作业和清理作业。有关信息,请参阅sys.sp_cdc_add_job (Transact-SQL)

  • 有关将变更数据捕获与数据库镜像结合使用的信息,请参阅变更数据捕获和其他 SQL Server 功能

我刚刚将启用 CDC 的测试数据库还原到在我的测试 SQL Server 2008R2 实例上创建的 SQL Server 2012 实例上,但没有在 2012 实例上创建拥有数据库的登录名。还原过程中显示错误:

消息 22831,级别 16,状态 1,过程 sp_cdc_disable_db_internal,第 262 行

无法更新指示未为变更数据捕获启用数据库 CDCTest 的元数据。执行命令 '[sys].[sp_MScdc_ddl_database triggers] 'drop'' 时发生故障。返回的错误为 15517:“无法作为数据库主体执行,因为主体“dbo”不存在,无法模拟此类主体,或者您没有权限。”。使用操作和错误来确定失败的原因并重新提交请求。

sysadmin在恢复启用 CDC 的数据库之前,登录名还必须是服务器角色的成员。

如果所有者是 SQL 登录名,则需要使用相同的 SID 在目标实例中重新创建数据库的所有者(如果所有者是 Windows 登录名,如果 Windows 登录名是域,则 SID 自然会相同-成员)。

您需要执行如下操作来恢复您的数据库:

/*
    obtain the identify of the login that "owns" the database by looking at the 
    UserName column in the output from the following command:
*/
RESTORE HEADERONLY FROM DISK = 'D:\SQLServer\Temp\CDCTest.bak'

/*
    This login is the owner of the database
*/
CREATE LOGIN CDCTestLogin 
WITH PASSWORD = 'LozierPituophisUnconsciousShelduck4'
    , SID = 0x2ECDACB721D7E84E8A28DCFE1C758799;

/*
    Ensure the login is a member of the 'sysadmin' server-level fixed role.
*/
EXEC sp_addsrvrolemember @loginame = 'CDCTestLogin', @rolename = 'sysadmin';
GO


/*
    Restore the database, with the KEEP_CDC option
*/
RESTORE DATABASE CDCTest FROM DISK = 'D:\SQLServer\Temp\CDCTest.bak'
WITH MOVE 'CDCTest' TO 'D:\SQLServer\MV2012\Data\CDCTest.mdf'
    , MOVE 'CDCTest_log' TO 'D:\SQLServer\MV2012\Logs\CDCTest_log.LDF'
    , REPLACE
    , KEEP_CDC;
Run Code Online (Sandbox Code Playgroud)