2021-09-06 docker中SqlServer开启代理服务,并配置cdc

本文详细介绍了如何在Docker环境下安装SQLServer 2017,并通过命令行工具连接数据库。同时,文章讲解了如何开启数据库级别的变更数据捕获(CDC)以及表级别的CDC,并强调了SQLServer代理服务的重要性。最后,提到了CDC的清理作业配置和手动启动的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、docker中安装SqlServer并开启代理:

从 Docker Hub 中拉出 SQL Server 2017 Linux 容器映像。

docker pull microsoft/mssql-server-linux:2017-latest

运行容器映像:

docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=<YourStrong!Passw0rd>' \
   -p 1433:1433 --name sql1 \
   -d microsoft/mssql-server-linux:2017-latest

连接到SqlServer:

下列步骤在容器内部使用 SQL Server 命令行工具 sqlcmd 来连接 SQL Server。

使用 docker exec -it 命令在运行的容器内部启动交互式 Bash Shell。 在下面的示例中,sql1 是在创建容器时由 --name 参数指定的名称。

docker exec -it sql1 "bash"

进入到容器中。

进入到容器中后,开启mssql-server的代理服务:

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

2、在源库执行(开启库级 CDC)

sql

USE MyDB -- 修改为需要开启的数据库

GO

EXEC sys.sp_cdc_enable_db

GO

2. 查询是否成功开启

sql

SELECT is_cdc_enabled 

FROM sys.databases

WHERE NAME = '<数据库名>' -- 库名

3. 开启表级 CDC

> 不确定能否只开启表级别而不开启库级别,看文档说是需要的 `after a database has been enabled

sql

USE MyDB -- 修改为需要开启的数据库

GO

EXEC sys.sp_cdc_enable_table

@source_schema = N'dbo', -- 默认好像是 dbo,不是库名

@source_name = N'MyTable', -- 表名

@role_name = NULL,

@filegroup_name = null,

@supports_net_changes = 1

GO

4.注意事项

1). 需要打开 **SQL Server 代理** 之后才会在 xxx_CT 表中查看到变更信息

> 没打开之前会默认记录,但不会显示,打开之后会补充到 xxx_CT 表。即:对表启用变更数据捕获时,SQL Server 代理不必正在运行。但是,只有当 SQL Server 代理正在运行时,捕获进程才会处理事务日志并将条目写入更改表。

2). 默认 cleanup Job 是没有启动的,需要手动启动

sql

USE cdc_source; -- 数据库名



GO

EXEC sys.sp_cdc_help_jobs;

GO



-- 停止作业

GO

EXEC sys.sp_cdc_stop_job @job_type = N'cleanup';

GO



-- 修改配置

GO

EXECUTE sys.sp_cdc_change_job

@job_type = N'cleanup',

@retention = 1;

GO



-- 开始作业

GO

EXEC sys.sp_cdc_start_job @job_type = N'cleanup';

GO

### 使用 Flink CDC 从 SQL Server 进行数据采集 为了使用 Apache Flink 的 Change Data Capture (CDC) 功能来捕获来自 Microsoft SQL Server 数据库的变化将其流式传输到其他系统,需完成几个关键配置步骤。 #### 添加 Maven 依赖项 首先,在项目的 `pom.xml` 文件中添加必要的依赖项以支持 Flink 和 SQL Server CDC 集成: ```xml <dependency> <groupId>com.ververica</groupId> <artifactId>flink-connector-sqlserver-cdc</artifactId> <version>3.0.0</version> </dependency> ``` 此依赖项提供了用于连接和读取 SQL Server 日志文件所需的类和支持[^1]。 #### 启动 SQL Server 容器实例 如果本地环境中尚未安装 SQL Server,则可以通过 Docker 快速启动一个容器化版本。这一步骤对于测试环境特别有用: ```bash docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=${your_password}' \ -p 1433:1433 --name sqlserver \ -d mcr.microsoft.com/mssql/server:latest ``` 上述命令会创建一个新的名为 `sqlserver` 的容器,公开默认端口 1433 给主机访问[^2]。 #### 编写 Flink 应用程序代码 下面是一个简单的 Java 实现例子,展示了如何利用 Flink CDC 来监听特定表上的变更事件将这些更新发送至下游处理逻辑: ```java import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import com.ververica.cdc.connectors.sqlserver.SqlServerSource; public class SqlServerCdcExample { public static void main(String[] args) throws Exception { final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 创建 SQL Server CDC 源表 var source = SqlServerSource.<String>builder() .hostname("localhost") // 替换为实际服务器地址 .port(1433) // 默认端口号 .database("YourDatabaseName") // 要监控的数据库名称 .username("sa") // 登录用户名 .password("${your_password}")// 用户密码 .tableList("dbo.YourTableName") // 表名列表;可以指定多个逗号分隔的名字 .deserializer(new JsonDebeziumDeserializationSchema()) // 自定义反序列化方案 .build(); // 将源注册到执行环境中 env.fromSource(source, WatermarkStrategy.noWatermarks(), "SQL Server Source") .print(); // 或者应用更复杂的转换操作 // 执行作业 env.execute("Flink SQL Server CDC Example"); } } ``` 这段代码片段设置了一个基本的数据管道,它可以从指定的 SQL Server 表中提取更改记录通过控制台打印出来。请注意替换占位符变量(如 `${your_password}`)的实际值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值