SQL SERVER CDC功能(变更数据监听)
查看指定SQL SERVER数据库是否开启CDC功能
# 查看GPS数据库是否开启CDC
SELECT is_cdc_enabled,CASE WHEN is_cdc_enabled=0 THEN 'CDC功能禁用' ELSE 'CDC功能启用' END 描述
FROM sys.databases
WHERE NAME = 'GPS'
//--
SELECT name,is_cdc_enabled FROM sys.databases WHERE name=‘GPS’
SELECT name,is_cdc_enabled FROM sys.databases WHERE is_cdc_enabled=1
开启sql-server agent
开启此功能CDC 才能将数据库变更捕获保存到CDC记录表
/opt/mssql/bin/mssql-conf set sqlagent.enabled true
# 设置后,需要重启服务器(docker安装 见下文)
开启CDC功能
# 使用指定库 我这里为gps
use gps
# 执行命令
EXECUTE sys.sp_cdc_enable_db
Docker 安装SQL SERVER
docker pull microsoft/mssql-server-linux:2017-latest
docker run -d -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=123456aA!' -p 1433:1433 --name sqlserver2017 -v /var/lib/mssql_data:/opt/mssql_data microsoft/mssql-server-linux:2017-latest
docker exec -it sqlserver2017 "bash"
/opt/mssql/bin/mssql-conf set sqlagent.enabled true
exit
docker restart sqlserver2017
查看当前已经开启CDC的数据表
SELECT name,is_tracked_by_cdc FROM sys.tables WHERE is_tracked_by_cdc = 1;
开启表CDC
示例:
对'USRALMHS'表开启变更捕获
EXEC sys.sp_cdc_enable_table
@source_schema= 'dbo', --源表架构
@source_name = 'USRALMHS', --源表
@role_name = 'CDC_Role' --角色(将自动创建)
GO
--如果不想控制访问角色,则@role_name必须显式设置为null。
$operation说明
__$operation=2的情况,表示新增
__$operation=3或者4,表示更新,3表示旧值,4表示新值
__$operation=1的情况,表示删除
数据库操作详细流程
1、使用具有Sysadmin权限的用户执行以下语句:
-- 使用指定库
USE XXX
-- 执行命令
EXECUTE sys.sp_cdc_enable_db
2、当前数据库中创建变更数据捕获清理或捕获作业
EXEC [sys].[sp_cdc_add_job] @job_type = N'capture';
EXEC [sys].[sp_cdc_add_job] @job_type = N'cleanup';
3、为当前数据库中指定的源表启用变更数据捕获
EXEC sys.sp_cdc_enable_table @source_schema= 'dbo', --源表架构
@source_name = 'XXXXXX', --源表
@role_name = 'XXXX' --角色(如果这个角色没有将自动创建,也可显示指定为NULL,这样的话就不利用角色限制对更改数据的访问。
|