使用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;
相关推荐
这个DBA有点耶6 小时前
从症状到根因:数据库监控指标的分层方法与静态/动态阈值策略
数据库·mysql·代码规范
SelectDB6 小时前
时间旅行与快照能力速查:Doris 侧三条落地路径
大数据·数据库·数据分析
SelectDB6 小时前
云数仓成本结构拆解速查:五层计费 vs Doris / 托管形态
大数据·数据库·数据分析
SelectDB6 小时前
什么场景能承接与建议保留:Doris vs Snowflake 边界速查
大数据·数据库·数据分析
这个DBA有点耶8 小时前
DELETE没删多少数据,表却越来越大——InnoDB删除空洞与页合并失效的根因
数据库·mysql·代码规范
ly768911 小时前
PostgreSQL 备份恢复策略:pg_basebackup、WAL 归档与 PITR 在企业 Java 系统中的落地
java·数据库·postgresql·pitr·pg_basebackup·wal 归档
小羊没烦恼!12 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
注塑机数据采集联网12 小时前
如何解决注塑机数据采集联网对接MES系统数据WiFi传输数据不稳问题
大数据·数据库·物联网·数据挖掘·数据分析
黄俊懿12 小时前
【架构师从入门到进阶】第六章:服务集群优化——第八节:线程数公式
java·服务器·数据库·分布式·性能优化·架构·系统架构