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