1、背景
由于需要学习flink cdc,并且数据选择sqlserver,所以这里记录sqlserver的cdc开启操作步骤。
2、基础前提
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容器
--- 经过上述操作,再查看代理服务状态应该是开启了