sql cdc用法_如何启动sqlserver数据库

sql cdc用法_如何启动sqlserver数据库游标批量开启CDC;业务实战!

SQL SERVER CDC开启实操

1. 环境检查

1.1 版本检查

SELECT @@VERSION;

Microsoft SQL Server 2016 (SP2-GDR)

1.2 检查CDC服务开启状态

select is_cdc_enabled from sys.databases where name="dbname";
--0为关闭,1为开启。数据库名为dbname

2. 开启CDC

2.1 开启SQL server agent服务

sp_configure "show advanced options", 1;
GO -- 2.1.1
RECONFIGURE;
GO -- 2.1.2
sp_configure "Agent XPs", 1;
GO -- 2.1.3
RECONFIGURE
GO -- 2.1.4

2.2 开启数据库级别的CDC功能

ALTER AUTHORIZATION ON DATABASE::[dbname] TO [sa];
-- 2.2.1 变更为sa的权限,数据库名为dbname
if exists(select 1 from sys.databases where name="dbname" and is_cdc_enabled=0)
begin
    exec sys.sp_cdc_enable_db
end
;
-- 2.2.2 开启语句
select is_cdc_enabled from sys.databases where name="dbname";
-- 2.2.3 检查是否开启成功,为1则开启
/* -- 本段注释可不看
或者
USE ERP
GO  
-- 开启:
EXEC sys.sp_cdc_enable_db  
-- 关闭:
EXEC sys.sp_cdc_disable_db
GO  
 
注释: 如果在禁用变更数据捕获时为数据库定义了很多捕获实例,则长时间运行事务可能导致 sys.sp_cdc_disable_db 的执行失败。
通过在运行 sys.sp_cdc_disable_db 之前使用 sys.sp_cdc_disable_table 禁用单个捕获实例,可以避免此问题。
 
示例:
 
USE AdventureWorks2012; 
GO 
EXECUTE sys.sp_cdc_disable_table 
@source_schema = N"HumanResources", 
@source_name = N"Employee", 
@capture_instance = N"HumanResources_Employee";
*/

2.3 添加CDC专用的文件组和文件

SELECT name, physical_name FROM sys.master_files WHERE database_id = DB_ID("dbname");
-- 2.3.1 查询dbname库的物理文件
ALTER DATABASE dbname ADD FILEGROUP CDC1;
-- 2.3.2 为该库添加名为CDC1的文件组
ALTER DATABASE dbname
ADD FILE
(
  NAME= "dbname_CDC1",
  FILENAME = "D:DATAdbname_CDC1.ndf"
)
TO FILEGROUP CDC1;
-- 2.3.3 将新增文件,并映射到文件组。重复2.3.1查询操作

2.4 开启表级别CDC

SELECT name,is_tracked_by_cdc FROM sys.tables WHERE  is_tracked_by_cdc = 0;
-- 2.4.1 查询未开启的表
IF EXISTS(SELECT 1 FROM sys.tables WHERE name="AccountBase" AND is_tracked_by_cdc = 0)
BEGIN
    EXEC sys.sp_cdc_enable_table
        @source_schema = "dbo", -- source_schema
        @source_name = "AccountBase", -- table_name
        @capture_instance = NULL, -- capture_instance
        @supports_net_changes = 1, -- supports_net_changes
        @role_name = NULL, -- role_name
        @index_name = NULL, -- index_name
        @captured_column_list = NULL, -- captured_column_list
        @filegroup_name = "CDC1" -- filegroup_name
END;
-- 2.4.2 为dbname.dbo.AccountBase开启表级别CDC,文件组为CDC1
DECLARE @tableName nvarchar(36)  -- 声明变量
DECLARE My_Cursor CURSOR --定义游标
    FOR (SELECT "new_srv_workorderBase" name
union select "tablename1"
union select "tablename2"
union select "tablename3"
 ) --查出需要的集合放到游标中
OPEN My_Cursor; --打开游标
FETCH NEXT FROM My_Cursor INTO @tableName;
WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC sys.sp_cdc_enable_table
         @source_schema = "dbo", -- source_schema
         @source_name = @tableName, -- table_name
         @capture_instance = NULL, -- capture_instance
         @supports_net_changes = 1, -- supports_net_changes
         @role_name = NULL, -- role_name
         @index_name = NULL, -- index_name
         @captured_column_list = NULL, -- captured_column_list
         @filegroup_name = "CDC1" -- filegroup_name;
    FETCH NEXT FROM My_Cursor INTO @tableName;
END
CLOSE My_Cursor; --关闭游标
DEALLOCATE My_Cursor; --释放游标
-- 2.4.3 游标批量开启表
SELECT name,is_tracked_by_cdc FROM sys.tables WHERE  is_tracked_by_cdc = 1 ORDER BY NAME;
-- 2.4.4 查询已开启的表

2.5 单表开启测试范例(仅供参考,可略过)

create table test_hht
(id varchar(36) not null primary key,
city_name varchar(20),
userid bigint,
useramount decimal(18,6),
ismaster bit,
createtime datetime default getdate()); -- 测试表test_hht
IF EXISTS(SELECT 1 FROM sys.tables WHERE name="test_hht" AND is_tracked_by_cdc = 0)
BEGIN
    EXEC sys.sp_cdc_enable_table
        @source_schema = "dbo", -- source_schema
        @source_name = "test_hht", -- table_name
        @capture_instance = NULL, -- capture_instance
        @supports_net_changes = 1, -- supports_net_changes
        @role_name = NULL, -- role_name
        @index_name = NULL, -- index_name
        @captured_column_list = NULL, -- captured_column_list
        @filegroup_name = "CDC1" -- filegroup_name
END; -- 开启表级别CDC
insert into test_hht(id,city_name,userid,useramount,ismaster)values("1","wuhan",     10,1000.25,1);
insert into test_hht(id,city_name,userid,useramount,ismaster)values("1A","xiangyang",11,11000.35,0);
insert into test_hht(id,city_name,userid,useramount,ismaster)values("1B","yichang",  12,12000.45,0); -- 插入数据测试
select *  from dbname.dbo.test_hht; -- 数据表
SELECT * FROM [cdc].[dbo_test_hht_CT]; -- CDC日志表

2.6 开启成功说明

dbname库出现cdc模式,并有CT系列表。

/*
cdc.<capture_instance>_CT   可以看到,这样命名的表,是用于记录源表更改的表。

对于insert/delete操作,会有对应的一行记录,而对于update,会有两行记录。
对于__$operation列:1 = 删除、2= 插入、3= 更新(旧值)、4= 更新(新值)
对于__$start_lsn列:由于更改是来源与数据库的事务日志,所以这里会保存其事务日志的开始序列号(LSN)
*/

2.7 DDL操作:DDL操作需要重新收集表的信息(以测试表test_hht为例)

alter  table test_hht add   product_count decimal(18,2);
-- 2.7.1 增加新的一列测试
insert into test_hht(id,city_name,userid,useramount,ismaster,product_count)values("2","wuhan",     20,2000.25,1,2.5);
-- 2.7.2 插入数据测试
SELECT * FROM [cdc].[dbo_test_hht_CT];
-- 2.7.3 CT表无新的一列,CDC正常捕获到之前的列变化
EXEC sys.sp_cdc_enable_table
@source_schema = "dbo"
,@source_name = "test_hht"
,@capture_instance ="dbo_test_hht_v2" -- 给一个新的名字
,@supports_net_changes = 1
,@role_name = NULL
,@index_name = NULL
,@captured_column_list = NULL
,@filegroup_name = "CDC1";
-- 2.7.4 为表dbo.test_hht开启一个新的CDC捕获
insert into test_hht(id,city_name,userid,useramount,ismaster,product_count)values("2A","xiangyang",21,121000.35,0,12.5);
-- 2.7.5 插入数据测试
EXEC sys.sp_cdc_disable_table @source_schema = "dbo",@source_name = "test_hht", @capture_instance = "dbo_test_hht";
-- 2.7.6 SQL SERVER最多允许两个捕获表,所以多次改变时需要先禁用之前的表

2.8 参考资料

https://blog.csdn.net/vkingnew/article/details/89508885
https://blog.csdn.net/chiwei9644/article/details/100649089

3. 关闭CDC

EXEC sys.sp_cdc_enable_table
@source_schema = "dbo"
,@source_name = "test_hht"
,@capture_instance ="dbo_test_hht_v2"
-- 3.1 单表禁用
USE dbname
GO
EXEC sys.sp_cdc_disable_db
GO
-- 3.2 全库禁用(禁用后cdc的模式消失)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5788.html

(0)
上一篇 2023-04-24
下一篇 2023-04-24

相关推荐

  • [学习笔记] Oracle基础增删改查用法「终于解决」

    [学习笔记] Oracle基础增删改查用法「终于解决」查询 备份查询数据 插入 插入查询结果 更新 通过查询结果更新 删除 截断表 删除和截断的区别 TRUNCATE 是 DDL 命令,命令执行完就提交,删除的数据不能恢复; DELETE 命令是 DML

    2023-02-03
    100
  • 树形结构的菜单表设计与查询[亲测有效]

    树形结构的菜单表设计与查询[亲测有效]开发中经常会遇到树形结构的场景,比如:导航菜单、组织机构等等,但凡是有这种父子层级结构的都是如此,一级类目、二级类目、三级类目。。。 对于这种树形结构的表要如何设计呢?接下来一起探讨一下 首先,想一个

    2023-04-14
    104
  • mysql数据库基本类型_四类八种数据类型

    mysql数据库基本类型_四类八种数据类型一 数据库初识 1.1 什么是数据库 数据库(DataBase,简称DB),简而言之可视为电子化的文件柜 存储电子文件的处所,用户可以对文件中的数据运行新增,截取,更新,删除等操作. 所谓数据库是以一

    2022-12-24
    109
  • Python属性编程

    Python属性编程Python作为一门受欢迎的编程语言,被广泛用于各种领域,从后端开发到人工智能。Python中的属性编程技术尤为有用,可以帮助开发者更好地组织代码,提高代码的可重用性和可维护性。本文将对Python属性编程相关技术进行详细的介绍和阐述,包括其用法、特点、优点以及应用场景等方面的内容。

    2024-04-13
    49
  • 腾讯Q2财报:腾讯云数据库收入同比增长超过30%[亲测有效]

    腾讯Q2财报:腾讯云数据库收入同比增长超过30%[亲测有效]8月17日,腾讯Q2财报首次披露了数据库的收入增幅:“我们聚焦高质量的收入增长,优先专注自研产品同时减少亏损项目。PaaS方面,TDSQL数据库收入同比增长超过30%,占2022年第二季企业服务营收超

    2023-06-01
    102
  • Python dictionaries: 提高数据处理效率和减轻代码复杂度

    Python dictionaries: 提高数据处理效率和减轻代码复杂度在Python中,字典是一种可变容器,其中的元素可以使用键来访问。它们是Python中最常用的数据结构之一,因为它们提供了快速、有效的查找功能,并且可以帮助我们降低代码复杂度。这篇文章将深入探讨Python字典的各种细节,以及如何使用它们来提高数据处理效率和减轻代码复杂度。

    2024-03-18
    28
  • MySQL真正的UTF-8字符集utf8mb4

    MySQL真正的UTF-8字符集utf8mb4MySQL有个utf-8的坑
    MySQL 的 utf8 实际上不是真正的 UTF-8。utf8 只支持每个字符最多三个字节,而真正的 UTF-8 是每个字符最多四个字节。

    2023-01-26
    86
  • 如何深入理解关系型数据库的三大范式分别是_数据库中的三大范式

    如何深入理解关系型数据库的三大范式分别是_数据库中的三大范式该文章,GitHub已收录,欢迎老板们前来Star! GitHub地址: https://github.com/Ziphtracks/JavaLearningmanual 数据库范式 一、什么是数据库

    2023-03-11
    102

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注