使用flink-cdc-sqlserver出现错误,需要批量开启sqlserver表cdc模式,监听表变化

docker安装

bash 复制代码
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=Zcyc123456" -p 1433:1433 --name sqlserver -d mcr.microsoft.com/mssql/server:2017-latest

开启库cdc模式

选择你自己的数据库,执行以下sql语句

sql 复制代码
EXEC sys.sp_cdc_enable_db;

校验

sql 复制代码
SELECT is_cdc_enabled FROM sys.databases WHERE name = YourDatabaseName 

开启表cdc

原因:即使您在数据库级别启用了CDC(Change Data Capture)功能,对于要捕获变更的特定表,仍然需要在表级别单独启用CDC。启动数据库级别的CDC功能为该数据库开启了使用CDC技术的基础环境,但不会自动对任何用户表进行变更数据捕获。

批量开启表cdc

sql 复制代码
-- 确保当前数据库已启用CDC
USE test;
GO

-- 获取dbo架构下所有用户表名(可以根据需要修改查询以选择不同架构或添加其他过滤条件)
DECLARE @TableNames TABLE (TableName SYSNAME);

INSERT INTO @TableNames (TableName)
SELECT t.name
FROM sys.tables t
WHERE t.is_ms_shipped = 0 -- 排除系统表和临时表
AND t.schema_id = SCHEMA_ID('dbo') -- 只考虑dbo架构下的表
-- AND t.some_column IS NOT NULL -- 添加任何其他你想要应用的筛选条件

-- 遍历表格并启用CDC
DECLARE @CurrentTableName SYSNAME;

DECLARE TableCursor CURSOR FOR
SELECT TableName FROM @TableNames;

OPEN TableCursor;

FETCH NEXT FROM TableCursor INTO @CurrentTableName;

WHILE @@FETCH_STATUS = 0
BEGIN
    IF NOT EXISTS (SELECT 1 FROM sys.change_tracking_tables WHERE object_id = OBJECT_ID(@CurrentTableName) AND is_track_columns_updated_on = 1)
    BEGIN
        DECLARE @Sql NVARCHAR(MAX) = N'EXEC sys.sp_cdc_enable_table
            @source_schema = N''dbo'', 
            @source_name = N''' + @CurrentTableName + ''', 
            @role_name = NULL, 
            @capture_instance = N''dbo_' + @CurrentTableName + '''';

        EXEC sp_executesql @Sql;
    END

    FETCH NEXT FROM TableCursor INTO @CurrentTableName;
END

CLOSE TableCursor;
DEALLOCATE TableCursor;

docker中启动SQL Server Agent

还需要开启SQL Server Agent才能够使用cdc功能

bash 复制代码
docker exec -it sql1 "bash"
 
root@b9a09ce17c02:/# /opt/mssql/bin/mssql-conf set sqlagent.enabled true
 
SQL Server needs to be restarted in order to apply this setting. Please run
 
'systemctl restart mssql-server.service'.
 
root@b9a09ce17c02:/# exit
 
exit
 
[root@localhost ~]#
 
[root@localhost ~]# docker stop sql1
 
sql1
 
[root@localhost ~]# docker start sql1
 
sql1

检查是否开启成功

sql 复制代码
-- Check if CDC is enabled on the database
SELECT name, is_cdc_enabled FROM sys.databases WHERE name = 'your_database_name';

-- Check if CDC is enabled on the tables
SELECT s.name AS schema_name, t.name AS table_name, t.is_tracked_by_cdc
FROM sys.tables t
JOIN sys.schemas s ON t.schema_id = s.schema_id
WHERE t.is_tracked_by_cdc = 1;
相关推荐
银发控、1 小时前
MySQL联合索引
数据库·mysql
予枫的编程笔记1 小时前
【MySQL修炼篇】从踩坑到精通:事务隔离级别的3大异常(脏读/幻读/不可重复读)解决方案
数据库·mysql·后端开发·数据库事务·事务隔离级别·rr级别·脏读幻读不可重复读
一起养小猫3 小时前
Flutter for OpenHarmony 实战:记账应用数据统计与可视化
开发语言·jvm·数据库·flutter·信息可视化·harmonyos
世界尽头与你3 小时前
(修复方案)CVE-2023-22047: Oracle PeopleSoft Enterprise PeopleTools 未授权访问漏洞
数据库·安全·oracle·渗透测试
韩立学长3 小时前
【开题答辩实录分享】以《智能大学宿舍管理系统的设计与实现》为例进行选题答辩实录分享
数据库·spring boot·后端
Henry Zhu1233 小时前
数据库(五):反规范化
数据库
Mr_Xuhhh3 小时前
MySQL函数详解:日期、字符串、数学及其他常用函数
java·数据库·sql
he___H4 小时前
Redis高级数据类型
数据库·redis·缓存
霖霖总总5 小时前
[小技巧60]深入解析 MySQL Online DDL:MySQL Online DDL、pt-osc 与 gh-ost 机制与最佳实践
数据库·mysql
爱学习的阿磊5 小时前
使用PyTorch构建你的第一个神经网络
jvm·数据库·python