sqlServer数据库CDC无法开启的解决办法

因为公司的产品跟ERP对接,采用的是基于数据库CDC监控增量的方案,最近一个客户重装的ERP的数据库,导致重装完,无法开启CDC,数据库开启CDC的方法,执行以下sql:

-- 为指定的数据库库开启CDC
USE myDb
GO
EXEC sys.sp_cdc_enable_db;

查询是否开启成功的方法:

--检查指定的库是否开启CDC,结果为1表示开启了CDC,为0表示没有开启。'myDb'表示要查询的库名,如果要查别的库只需更改库名
SELECT is_cdc_enabled,
       CASE
           WHEN is_cdc_enabled = 0 THEN 0
           ELSE 1
           END status
FROM sys.databases
WHERE NAME = 'myDb';

执行了开启sql时,出现“因为当前数据库中已存在名为 'cdc' 的数据库用户或名为 'cdc' 的架构,因此无法启用数据库" XXX " 。更改数据捕获需要这些对象”的错误提示,于是就到数据库根目录-安全性下面的用户和架构两个目录下看了下,确实存在“cdc”用户和“cdc”架构两个文件,

于是我重命名了cdc用户,cdc架构无法重命名,深度删除,结果又报错:

 意思是cdc架构被其它对象引用,无法删除,于是在网上搜索查询引用cdc架构的方法如下:

use myDb
go
select obj.type, obj.name
from sys.objects obj join sys.schemas s on(s.schema_id = obj.schema_id)
where s.name = 'cdc'
order by obj.name
go

 

type为“IF”是function,为“P”是procedure,删除方法如下:

drop function cdc.[fn_cdc_get_all_changes_...];
drop function cdc.[fn_cdc_get_net_changes_ ... ];
drop procedure cdc.sp_upd_855595478;

把相关引用cdc架构的函数和存储过程删除后,再启用数据库的cdc功能就正常了!

 

下面再附上数据库表的CDC开启和禁用,以及查询表的CDC是否开启的方法:


-- 开启表的CDC
use myDb;
go
EXEC sys.sp_cdc_enable_table
     @source_schema = N'dbo',
     @source_name = N'Btype',
     @role_name = NULL
GO
-- 禁用表的CDC
USE myDb
GO
EXEC sys.sp_cdc_disable_table
     @source_schema = N'dbo',
     @source_name = N'ptype',
     @capture_instance = N'dbo_ptype_CT'
GO

-- 查询表是否开启CDC
SELECT name,
       is_tracked_by_cdc,
       CASE
           WHEN is_tracked_by_cdc = 0 THEN 'CDC功能禁用'
           ELSE 'CDC功能启用'
           END 描述
FROM sys.tables
where object_id = OBJECT_ID('dbo.ptype');

### SQL Server 2019 中数据库 CDC 开启后表是否需要单独启用 在 SQL Server 2019 中,当数据库级别的变更数据捕获(Change Data Capture, CDC)被启用后,单个表仍然需要单独配置并启用 CDC 功能才能实现对该表的数据更改追踪[^1]。这是因为 CDC 的设计逻辑分为两步:首先是针对整个数据库启用支持;其次是具体到某个特定的表上显式地激活该功能。 #### 启用数据库CDC 为了使数据库能够支持 CDC,需执行如下命令: ```sql EXEC sys.sp_cdc_enable_db; ``` 此语句会设置当前数据库为允许使用 CDC,并创建必要的系统对象和架构用于存储与管理变化数据的信息。 #### 单独启用表级 CDC 即使数据库已准备好接受 CDC 请求,在实际应用层面仍需逐一对目标表格实施进一步的操作来真正启动其上的监控机制。这可以通过调用 `sp_cdc_enable_table` 存储过程达成目的: ```sql EXEC sys.sp_cdc_enable_table @source_schema = N'dbo', @source_name = N't1', @role_name = NULL ; GO ``` 上述脚本中的参数分别指定了源模式名称 (`@source_schema`) 和待跟踪变动的具体表名 (`@source_name`) 。如果省略角色授权部分,则任何拥有适当权限的人都能访问这些捕捉来的改变记录[^2]。 值得注意的是,如果没有正确配置或者忘记开启个别重要业务实体对应的CDC状态的话,那么即便全局服务正常运行也无法获取那些未标记项的历史修改详情[^3]。 另外,在Linux环境下比如CentOS 7 上部署SQL Server 2019 并完成了基本安装之后同样遵循以上原则处理CDC相关事宜,同时确保SQL Server Agent处于活动状态以便于后台任务得以顺利执行[^4]。 综上所述,在SQL Server 2019里即便是先进行了整体性的数据库级别设定,各个具体的用户定义关系型表还是得依照需求逐一打开它们各自的CDC开关才行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值