如果 sys.dm_cdc_errors
指示扫描由于更改表的错误 2628 或错误 8115 而失败,你应先使用受影响更改表中的更改数据。 之后,需要禁用并重新启用表上的 CDC,以有效地解决问题。
使用数据层导入/导出和提取/发布操作来导入数据库
对于启用了 CDC 的 SQL 数据库,在使用 SqlPackage、SSDT 或其他 SQL 工具导入/导出或提取/发布时,新数据库中将排除 cdc
架构和用户。 导入/导出和提取/部署操作中未包含的其他 CDC 对象包括在 sys.objects 中标记为 is_ms_shipped=1
的表。
即使未启用 CDC,且已在数据库中定义自定义架构或名为 cdc
的用户,该架构或用户也将在导入/导出和提取/部署操作中排除以导入/设置新数据库。
使用变量进行分区切换
对于 ALTER TABLE ... SWITCH TO ... PARTITION ...
语句,不支持在带有变更数据捕获 (CDC) 的数据库或表上使用带有分区切换的变量。 有关详细信息,请参阅分区切换限制。
本部分分步排查与 SQL Server 和 Azure SQL 托管实例上的 CDC 关联的错误。 与 CDC 相关的错误可能会阻碍捕获过程的正常运行,并导致数据库事务日志的扩展。
要检查这些错误,你可以查询动态管理视图 sys.dm_cdc_errors。 如果 sys.dm_cdc_errors 动态管理视图返回任何错误,请参阅以下部分,了解缓解步骤。
有关特定错误代码的详细信息,请参阅数据库引擎事件和错误。
以下是本部分中包含的不同疑难解答类别:
错误 200/208 - 对象名称无效。
原因:在删除 CDC 元数据后,可能会出现此错误。 要使 CDC 正常运行,不应手动修改任何 CDC 元数据,如 CDC schema
、更改表、CDC 系统存储过程、默认 cdc user
用户权限 (sys.database_principals
) 或重命名 cdc user
。
建议:要解决此问题,需要为数据库禁用并重新启用 CDC。 当为某个数据库启用变更数据捕获时,将为该数据库创建 cdc 架构、cdc 用户、元数据表和其他系统对象。
不应更改或删除在 sys.objects 系统目录视图中发现的 is_ms_shipped=1 且 schema_name='cdc' 的对象。
错误 1202 - 数据库主体不存在,或者用户不是成员
原因:在删除 CDC 用户后,可能会出现此错误。 要使 CDC 正常运行,不应手动修改任何 CDC 元数据,如 CDC schema
、更改表、CDC 系统存储过程、默认 cdc user
用户权限 (sys.database_principals
) 或重命名 cdc user
。
建议:确保 cdc
用户存在于数据库中,并且还分配了 db_owner
角色。 要创建 cdc
用户,请参阅示例创建 cdc 用户并分配角色。
错误 15517 - 无法作为数据库主体执行,因为主体不存在。
原因:无法模拟此类主体,或者你没有权限。 在删除 CDC 元数据或其已不再属于 db_owner
角色时,可能会出现此错误。 要使 CDC 正常运行,不应手动修改任何 CDC 元数据,如 CDC schema
、更改表、CDC 系统存储过程、默认 cdc user
用户权限 (sys.database_principals
) 或重命名 cdc user
。
建议:确保 cdc
用户存在于数据库中,并且还分配了 db_owner
角色。 要创建 cdc
用户,请参阅示例创建 cdc 用户并分配角色。
错误 18807 - 找不到复制系统表的对象 ID。
原因:当 SQL Server 找不到或无法访问复制系统表 '%s' 时,会发生此错误。 这可能是因为表缺少或无法访问。 要使 CDC 正常运行,不应手动修改任何 CDC 元数据,如 CDC schema
、更改表、CDC 系统存储过程、默认 cdc user
用户权限 (sys.database_principals
) 或重命名 cdc user
。
建议:请验证该系统表是否存在,以及是否可以通过直接查询表进行访问。 查询 sys.objects 系统目录,使用 is_ms_shipped=1 和 schema_name='cdc' 将谓词子句设置为列出所有与 CDC 相关的对象。 如果查询未返回任何对象,则应禁用并重新为数据库启用 CDC。 为某个数据库启用变更数据捕获,会为该数据库创建 cdc 架构、cdc 用户、元数据表和其他系统对象。
原因:cdc
用户已从 db_owner
数据库角色或 sysadmin
服务器角色中删除。
建议:确保 cdc
用户已分配 db_owner
角色。 要创建 cdc
用户,请参阅示例创建 cdc 用户并分配角色。
数据库空间管理
错误 1105 - 由于文件组已满,无法为数据库中的对象分配空间
原因:当数据库主文件组的空间耗尽,并且 SQL Server 无法为该文件组中的对象(如表或索引)分配更多空间时,会发生此错误。
建议:要解决此问题,请删除数据库中任何不必要的数据以释放空间。 确定文件组中可以安全删除的未使用的表、索引或其他对象。 密切监视空间利用率,有关详细信息,请参阅管理 Azure SQL 数据库中数据库的文件空间
如果无法删除不必要的数据/对象,请考虑为数据库事务日志分配更多空间。 有关事务日志管理的详细信息,请参阅 SQL Server 事务日志体系结构和管理指南
CDC 限制
错误 2628 — 字符串或二进制数据在表中会被截断
原因:使用 DDL 语句更改已启用 CDC 的表的列大小可能会导致后续 CDC 捕获过程出现问题。 'sys.dm_cdc_errors' 动态管理视图 (DMV) 对于任何报告的问题(如错误号 2628 和 8115)检查任何 CDC 非常有用。
建议:在对列大小进行任何更改之前,你必须评估更改是否与 CDC 更改表中的现有数据兼容。 要解决此问题,需要为数据库禁用并重新启用 CDC。 有关为数据库或表启用 CDC 的详细信息,请参阅为数据库启用 CDC 和为表启用 CDC。
错误 913 - 在处理具有系统 CLR 数据类型的表的更改时,CDC 捕获作业失败
原因:当在具有系统 CLR 数据类型的表上启用 CDC、进行 DML 更改,然后在 CDC 捕获作业处理与其他表相关的更改时对同一表进行 DDL 更改,就会发生此错误。
建议:建议的步骤是暂停表中的 DML 处理,运行捕获作业来处理更改,为表运行 DDL,运行捕获作业以处理 DDL 更改,然后重新启用 DML 处理。 有关详细信息,请参阅在处理更改时 CDC 捕获作业失败。
创建用户和分配角色
如果已删除 cdc user
,可以手动添加回用户。
使用以下 T-SQL 脚本创建用户 (cdc
),并为同一用户 (db_owner
) 分配适当的角色。
IF NOT EXISTS
SELECT *
FROM sys.database_principals
WHERE NAME = 'cdc'
BEGIN
CREATE USER [cdc]
WITHOUT LOGIN WITH DEFAULT_SCHEMA = [cdc];
EXEC sp_addrolemember 'db_owner', 'cdc';
检查和添加角色成员身份
要验证 cdc
用户是否属于 sysadmin
或 db_owner
角色,请运行以下 T-SQL 查询:
EXECUTE AS USER = 'cdc';
SELECT is_srvrolemember('sysadmin'), is_member('db_owner');
如果 cdc
用户不属于任一角色,请执行以下 T-SQL 查询,以将 db_owner
角色添加到 cdc
用户。
EXEC sp_addrolemember 'db_owner' , 'cdc';
有关 SQL Server 的 CDC 的概述,请参阅什么是变更数据捕获 (CDC)?
有关 CDC 与 Azure SQL 数据库的已知问题和限制的详细信息,请参阅 CDC 与 Azure SQL 数据库 - 已知问题和限制
有关如何启用和禁用 CDC 的详细信息,请参阅启用和禁用变更数据捕获
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:https://aka.ms/ContentUserFeedback。
提交和查看相关反馈