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容器
--- 经过上述操作,再查看代理服务状态应该是开启了





















       
相关推荐
零炻大礼包38 分钟前
【SQL server】数据库远程连接配置
数据库
zmgst1 小时前
canal1.1.7使用canal-adapter进行mysql同步数据
java·数据库·mysql
随心............1 小时前
python操作MySQL以及SQL综合案例
数据库·mysql
€☞扫地僧☜€1 小时前
docker 拉取MySQL8.0镜像以及安装
运维·数据库·docker·容器
CopyDragon1 小时前
设置域名跨越访问
数据库·sqlite
xjjeffery1 小时前
MySQL 基础
数据库·mysql
写bug的小屁孩1 小时前
前后端交互接口(三)
运维·服务器·数据库·windows·用户界面·qt6.3
恒辉信达1 小时前
hhdb数据库介绍(8-4)
服务器·数据库·mysql
齐 飞2 小时前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
云空2 小时前
《Python 与 SQLite:强大的数据库组合》
数据库·python·sqlite