sqlserver开启CDC

1、背景

由于需要学习flink cdc,并且数据选择sqlserver,所以这里记录sqlserver的cdc开启操作步骤。

2、基础前提

官方介绍地址:https://learn.microsoft.com/zh-cn/sql/relational-databases/track-changes/enable-and-disable-change-data-capture-sql-server?view=sql-server-ver15

CDC即表示变更数据捕获,变更数据捕获使用 SQL Server 代理记录表中发生的插入、更新及删除。因为sqlserver对于数据库的操作日志,不像mysql那样对外可以轻松访问,所以需要通过一个代理服务端的机制去提供类似bin-log日志的功能。

官方介绍:

变更数据捕获的更改数据源为 SQL Server 事务日志。 在将插入、更新和删除应用于跟踪的源表时,将会在日志中添加说明这些更改的项。 日志用作捕获进程的输入来源。 然后,它会读取日志,并在跟踪的表的关联更改表中添加有关更改的信息。 系统将提供一些函数,以枚举在更改表中指定范围内发生的更改,并以筛选的结果集的形式返回该值。 通常,应用程序进程使用筛选的结果集在某种外部环境中更新源表示形式。

3、Sqlserver2019开启cdc操作

  • 查看账号的权限
sql 复制代码
EXEC sp_helpsrvrolemember 'sysadmin'
  • 查看库是否开启cdc
sql 复制代码
select is_cdc_enabled,name from sys.databases where name='your db name';
  • 对数据库启动cdc
sql 复制代码
// mydb是需要开启的数据库, Go表示执行之后结束本次会话
use mydb 
GO
exec sys.sp_cdc_enable_db
Go
  • 查看数据库是否开启cdc
sql 复制代码
// 查询数据库的开启状态,结果为1代表已开启
select is_cdc_enabled,name from sys.databases;
or
select is_cdc_enabled,name from sys.databases where name = 'your database name'

此时刷新,会发现schemas下多出了cdc

  • 查看表是否开启cdc
sql 复制代码
// 查询单个表是否开启CDC(返回状态,状态为1表示成功开启CDC功能)
SELECT is_tracked_by_cdc FROM sys.tables WHERE name='Student';

// 验证表的CDC开启,查询所有开启CDC功能的表(会返回表名和状态:状态为1表示开启CDC功能
SELECT name,is_tracked_by_cdc FROM sys.tables WHERE  is_tracked_by_cdc = '1';
  • 对表开启cdc
sql 复制代码
// 开启表cdc
EXEC sys.sp_cdc_enable_table
        @source_schema = 'dbo',
        @source_name = 'Student',
        @supports_net_changes = 0,
        @role_name = NULL;

正常情况下,刷新之后会发现多出来了dbo_Student_CT.

至此,库、表已开启了CDC。

  • 确认CDC agent是否已正常启动(重要
sql 复制代码
// 查看代理服务是否启动,如果结果是stop,需要到sqlserver服务器开启代理
EXEC master.dbo.xp_servicecontrol N'QUERYSTATE',N'SQLSERVERAGENT';

如果是stop,说明未开启的,需要去sqlserver的服务器端进行开启。

bash 复制代码
--- sqlserver cdc agent服务代理开启,步骤

// 1、找到sqlserver的容器信息
docker ps 

// 2、进入容器,需要加-uroot
docker exec -it -uroot 1710518237bb 

// 3、执行
/opt/mssql/bin/mssql-conf set sqlagent.enabled true 

// 4、完成上述操作,重启sqlserver容器
docker restart 1710518237bb 

--- 经过上述操作,再查看代理服务状态应该是开启了

4、测试验证

  • 在Student表中新增记录

在对应的cdc的dbo_Student_CT中可以看到新增操作记录信息。

至此,说明整个过程是成功!

5、草稿记录

以下是学习时的操作记录

sql 复制代码
--- 开启cdc, 在需要开启cdc的数据库下执行该指令
exec sys.sp_cdc_enable_db;

--- 查询数据库的开启状态,结果为1代表已开启
select is_cdc_enabled,name from sys.databases;

--开启SQL server agent服务(逐条执行)
sp_configure 'show advanced options', 1;
GO 
RECONFIGURE;
GO 
sp_configure 'Agent XPs', 1;
GO 
RECONFIGURE
GO 

--- 添加CDC功能需要的文件组和文件(必要)
--- 注意:这是必要的,创建单独的文件组和文件后会防止其在运行过程中与数据库的主资源争夺
       
--- 查询现有的文件的位置,直接在此目录下创建即可
SELECT name, physical_name FROM sys.master_files WHERE database_id = DB_ID('test_db');

--添加文件组
ALTER DATABASE test_db ADD FILEGROUP CDC2;
 
--添加文件,FILENAME 填写docker 容器内部的地址路径
ALTER DATABASE test_db 
ADD FILE
(
  NAME= 'CDC', 
  FILENAME = '/opt/cdc/CDC.ndf',
  SIZE = 200MB,
  FILEGROWTH = 100MB -- 设定文件的自动增长量为100MB
)
TO FILEGROUP CDC2;

-- 修改文件组的文件
ALTER DATABASE test_db
MODIFY FILE
(  
	NAME = 'CDC', 
	FILEGROWTH = 100MB
);


--- 开启表cdc
EXEC sys.sp_cdc_enable_table
        @source_schema = 'dbo',
        @source_name = 'Student',
        @capture_instance = NULL,
        @supports_net_changes = 1,
        @role_name = NULL, 
        @index_name = NULL, 
        @captured_column_list = NULL, 
        @filegroup_name = 'CDC2';
       
EXEC sys.sp_cdc_enable_table
        @source_schema = 'dbo',
        @source_name = 'Test',
        @capture_instance = NULL,
        --@supports_net_changes = 1,
        @role_name = NULL, 
        @index_name = NULL, 
        @captured_column_list = NULL, 
        @filegroup_name = 'CDC2';
       
EXEC sys.sp_cdc_enable_table
        @source_schema = 'dbo',
        @source_name = 'TestTable',
        @capture_instance = NULL,
        @supports_net_changes = 1,
        @role_name = NULL, 
        @index_name = NULL, 
        @captured_column_list = NULL, 
        @filegroup_name = 'CDC2';
       
--- 验证表的CDC开启,查询所有开启CDC功能的表(会返回表名和状态:状态为1表示开启CDC功能
SELECT name,is_tracked_by_cdc FROM sys.tables WHERE  is_tracked_by_cdc = '1';

--- 查询单个表是否开启CDC(返回状态,状态为1表示成功开启CDC功能)
SELECT is_tracked_by_cdc FROM sys.tables WHERE name='Student';


--- 关闭表CDC和数据库CDC

--- 关闭表CDC
EXEC sys.sp_cdc_disable_table @source_schema = 'dbo', @source_name = 'Student', @capture_instance = 'all';
 
--关闭数据库CDC
EXEC sys.sp_cdc_disable_db;

-- 查看CDC 作业配置
sys.sp_cdc_help_jobs

--- 查看账号的权限
EXEC sp_helpsrvrolemember 'sysadmin';

--- 查看代理服务是否启动,如果结果是stop,需要到sqlserver服务器开启代理
EXEC master.dbo.xp_servicecontrol N'QUERYSTATE',N'SQLSERVERAGENT';

--- sqlserver服务器开启代理,步骤
--- docker 安装的sqlserver
--- docker ps 找到sqlserver的容器信息
--- docker exec -it -uroot 1710518237bb  进入容器,需要加-uroot
--- /opt/mssql/bin/mssql-conf set sqlagent.enabled true 执行该脚本
--- docker restart 1710518237bb  重启sqlserver容器
--- 经过上述操作,再查看代理服务状态应该是开启了





















       
相关推荐
丁总学Java39 分钟前
MySQL高级-MVCC-原理分析(RR级别)
数据库·mysql·mvcc·rr级别·可重复读
“抚琴”的人39 分钟前
C#——Path类详情
开发语言·数据库·microsoft·c#
创作小达人39 分钟前
InnoDB中的表级锁、页级锁、行级锁详解
java·数据库·mysql
missterzy2 小时前
Spring Boot 创建定时任务
java·数据库·spring boot·定时任务
m0_748171582 小时前
数据库第一次作业
数据库
V+zmm101342 小时前
springcloud分布式架构网上商城 LW +PPT+源码+讲解
java·数据库·后端·vue·idea·springclud
苏生Susheng3 小时前
【Oracle】Oracle常用语句大全
java·数据库·sql·mysql·oracle·sql语句·数据库语法
叶孤程3 小时前
【Qt知识】window frame 对窗口坐标的影响
数据库·qt·microsoft
dot.Net安全矩阵3 小时前
.NET 漏洞分析 | 某ERP系统存在SQL注入
数据库·sql·安全·web安全·矩阵·.net
编程梦想家(大学生版)3 小时前
数据库数据插入实战:创建表与插入数据
数据库·电子商务平台数据库创建于与插入