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 = Ndbo, @source_name = NBtype, @role_name = NULL GO -- 禁用表的CDC USE myDb GO EXEC sys.sp_cdc_disable_table @source_schema = Ndbo, @source_name = Nptype, @capture_instance = Ndbo_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);