첫째, 관련 문서
오래된 규칙, 당신을 오해 내 설명을 방지하기 위해, 공식 웹 사이트를 통해 SQL 서버 관련 기능의 물결을 이해하시기 바랍니다.
문서 주소 :
불쌍한 영어 친구 EN-US는 URL은에서 zh-CN 중국어보기 문서를 변경 할 수 있습니다
둘째, 특징
내장 SQL 서버는 두 개의 메커니즘 (이하, CDC 라한다) 변경 데이터 캡처라는 데이터 변화 (이하, CT 라 함)라는 또 다른 변경 추적 잡아 제공한다. 이 두 가지 기능은 DML 작업을 수행 할 수있는 경우 변경 데이터를 기록하는 사용자 (삽입, 업데이트, 삭제).
이들의 작동 원리는 데이터 테이블 작업은 SQL Server가 트랜잭션 로그를 기록 할 때 위의 두 기능 중 하나라도있는 경우에, 수 있다는 것입니다, 캡처 SQL 서버에 SQL Server 에이전트 (별도의 프로그램)을 사용 특정 테이블에 이러한 로그와 기록 (그래서 프로그램이 추가 저장 공간 및 서버 성능 오버 헤드가있을 것이다), 최종 SQL 서버는 사용자가 이러한 레코드 목록을 해결하는 데 도움이되는 기능을 제공, 물론 방법이 있습니다 이러한 변경 사항은 기록에 직접 읽을 수 있습니다.
이러한 2014 년의 기능 및 다음 버전은 기업 또는 개발자 버전을 필요로 위의 SQL 서버 2016 버전에서이 기능을 가지고 않습니다, 표준 버전은이 기능이 내장되어 있습니다.
장점 :
- 사용자 지정 솔루션없이 내장 시스템
- 조정을 필요로하지 않는 데이터 시트 구조는 필요에 ID 열 같은 것을 추가 없습니다
- CDC는 내장 된 데이터 지우기 메커니즘 로그 만료 후 통관 메커니즘을 필요로하지 않습니다
- 서버 성능에 영향을 미칩니다하지만이 프로그램은 비동기이지만, 모든 프로세스가 독립적 후, 플립 플롭의 사용의 직접적인 영향보다는이 효과는 작다 ( SQL 서버에 별도의 시스템에 에이전트를 배포 할 계획이없는 모른다 큰 형님에 알 수있는 다음을 그 )
- 변경 신뢰성 획득해야하며, 프로그램의 순서를 변경 커밋 트랜잭션을 기반으로 커밋 된 트랜잭션, 시간의 순서를 변경합니다.
- SQL 서버 구성 및 관리하는 몇 가지 도구를 제공합니다
그것이 작동하는 방법 :
여기에 주로 기반으로 전투는, 그래서 그냥 ~ 느낌의 공식 웹 사이트에 당신이 사진을 넣어
차이 :
이러한 두 가지 기능의 주요 차이점은, 기록 된 데이터의 포맷은, CDC를보다 상세히 일부 그는, 변경 전후, 즉, 각 필드 데이터의 값을 각 레코드마다 변경 내용을 기록한다는 것이다. 중부 표준시는이 기록은 이전의 내용을 변경 한 특정 변경 내용이 기록되지 않습니다 후, 단지 기록이다.
아래 기록 된 구체적인 내용은 ~ Shaoanwuzao, 당신에게 자세한 설명을 해주십시오 줄 것이다
셋째, 준비
관련 기능을 엽니 다
이 문서뿐만 아니라, 다른 사람들이 정원에 의해 쓰여진 기사를 블로그를 참조하십시오 :
https://www.cnblogs.com/maikucha/p/9039205.html
https://www.cnblogs.com/chenmh/p/4408825.html
1. 파일 전용 그룹을 추가
오른쪽 데이터 변경 사항을 기록해야 할 필요성에 -> 속성 -> 파일 그룹, TDC의라는 이름의 파일 그룹을 추가, 파일 그룹 추가를 클릭합니다.
2. 데이터베이스 파일을 추가합니다
문서 탭 페이지로 전환 한 다음 당신은 그냥 좋은 그룹 TDC 파일 그룹을 만든 파일을 새 파일, 데이터의 파일 형식 선택 행을 만들기를 선택하려면 추가 버튼을 클릭합니다.
이 단계는 처음 두 단계는 물론,이 두 단계를 무시할 수있는 공식 문서가 없다, 나는 거기에 다른 블로거에서 배운 것입니다,하지만 내 이해는 이것이 포착하는 두 단계의 주요 공정 및 SQL 서버를 피할 수 있다는 것이다 기본 과정과 동일한 파일을 사용하는 경우 MDF 파일 자원은, 몇 가지 검사를 수행 PRD에 공식 전에, 특히, 성능 문제 및 동시성 문제가 발생할 수 있습니다.
3. SQL Server 에이전트를 사용
SQL Server 에이전트 서비스 내에서 발견 된 Windows 서비스에서, (필요한 경우, 시작시 설정) 시작을 클릭 연결된 MSSQL 데이터베이스의 마지막 표시 한 후 다음과 같이 :
4. 데이터베이스 레벨 관련 기능을 사용
이러한 데이터는 기능은 기본적으로 해제되어 변경 내용 추적,이 기능을 사용하는 경우, 먼저 필요에 데이터베이스 레벨 이 기능을 사용 할 수 있습니다.
CDC 활성화 된 데이터베이스 기능은 다음과 같은 SQL을 수행하는 데 필요한 :
사용보기 MyDB
GO
EXEC sys.sp_cdc_enable_db
GO
CT를 사용할 데이터베이스 함수는 다음과 같은 SQL을 수행하는 데 필요한 :
ALTER DATABASE JaxTest (데이터베이스 이름) 후 SET CHANGE_TRACKING = 켜짐 (CHANGE_RETENTION = 2 일의 ON을 AUTO_CLEANUP =)
당신은 데이터베이스에서 마우스 오른쪽 수도 있습니다 -> 속성 -> 구성 변경 내용 추적 페이지 :
5. 테이블 수준의 웹 가능
데이터베이스 수준의 완료가 활성화되면, 또한 다음과 같은 과정이 수, 테이블 수준에서 활성화해야합니다 :
의 테이블을 만들어 보자 :
CREATE TABLE Person ( Id INT IDENTITY(1,1) PRIMARY KEY NOT NULL, Name NVARCHAR(32) NOT NULL, Age INT NOT NULL, Remark NVARCHAR(512) NULL )
启用CDC需要执行下面的SQL:
exec sys.sp_cdc_enable_table [ @source_schema = ] 'source_schema', ---表所属的架构名,一般是dbo [ @source_name = ] 'source_name' ,----表名 [ @role_name = ] 'role_name'---是用于控制更改数据访问的数据库角色的名称。 [,[ @capture_instance = ] 'capture_instance' ]--是用于命名变更数据捕获对象的捕获实例的名称,这个名称在后面的存储过程和函数中需要经常用到。 [,[ @supports_net_changes = ] supports_net_changes ]---指示是否对此捕获实例启用净更改查询支持如果此表有主键,或者有已使用 @index_name 参数进行标识的唯一索引,则此参数的默认值为 1。否则,此参数默认为 0。 [,[ @index_name = ] 'index_name' ]--用于唯一标识源表中的行的唯一索引的名称。index_name 为 sysname,并且可以为 NULL。如果指定,则 index_name 必须是源表的唯一有效索引。如果指定 index_name,则标识的索引列优先于任何定义的主键列,就像表的唯一行标识符一样。 [,[ @captured_column_list = ] 'captured_column_list' ]--需要对哪些列进行捕获。captured_column_list 的数据类型为 nvarchar(max),并且可以为 NULL。如果为 NULL,则所有列都将包括在更改表中。 [,[ @filegroup_name = ] 'filegroup_name' ]--是要用于为捕获实例创建的更改表的文件组。 [,[ @partition_switch = ] 'partition_switch' ]--指示是否可以对启用了变更数据捕获的表执行 ALTER TABLE 的 SWITCH PARTITION 命令。allow_partition_switch 为 bit,默认值为 1。
上面的内容可能有点啰嗦,举个实际例子吧,比如我要对Person这张表启用CDC,则执行的SQL如下:
EXEC sys.sp_cdc_enable_table @source_name = 'Person', @source_schema = 'dbo', @capture_instance = 'dbo_Personal', @filegroup_name = 'TDC', @supports_net_changes = 1, @role_name = NULL
启用CT需要执行下面的SQL:
ALTER TABLE dbo.Person(表名) ENABLE CHANGE_TRACKING WITH (TRACK_COLUMNS_UPDATED = ON)
当然,也可以在数据表上右键->属性->变更跟踪 Tab页中进行启用。
到这里为止,就已经启用了数据库的CDC和CT两个功能,当然,实际大部分情况下,只需要根据需要,选择其中一种即可,这里只是都做一个说明。你可以只挑一个来进行实践。
使用CDC和CT功能进行变更抓取
1.使用CDC进行变更抓取
在我们先向表中插入一些数据,然后再修改、删除插入的这些数据,再使用SQL SERVER提供的相关SP来抓取这些变更。
本文中的数据变化过程如下:
首先新增三条数据:
然后修改成下面这样子:
最后再把第二条删掉:
此时,我们先使用CDC的相关脚本来查询所有变更:
DECLARE @from_lsn binary(10), @to_lsn binary(10); SET @from_lsn = sys.fn_cdc_get_min_lsn('dbo_Personal'); SET @to_lsn = sys.fn_cdc_get_max_lsn(); SELECT * FROM cdc.fn_cdc_get_all_changes_dbo_Personal (@from_lsn, @to_lsn, N'all update old'); GO
这段脚本中有两个地方用到了dbo_Personal这个名字,这个名字其实是在上面启用CDC的时候,指定的@capture_instance = 'dbo_Personal', 这个参数,如果你已经忘记了,可以翻到博客的上面回顾一下~
如果你已经忘记你执行的时候指定的这个参数名字,可以在DB的Function列表中找到它,都是以cdc.fn_cdc_get_all_changes开头的。
执行脚本后,会得到如下结果:
调用这个Function时候的参数含义和返回的每一列的含义可以参考微软官方文档:https://docs.microsoft.com/zh-cn/sql/relational-databases/system-functions/cdc-fn-cdc-get-all-changes-capture-instance-transact-sql?view=sql-server-2017,下面也给懒人朋友们截个图。
从这个LOG中,其实我们已经可以获得非常详细的我们每一次对Person这张表的操作了,而且可以发现,微软的这个顺序也已经是按照我们执行的SQL语句的顺序进行排列了,每一个字段每次的变更前后也记录的非常的清楚了。
此外,对于CDC,也可以抓取净变更记录,即再一段时间内,数据差异,并且把反复修改的中间过程会过滤掉,比如把某条记录的某个字段从A改成B,又从B改成A,这时候就会被忽略掉这个修改:
我们可以执行下面的SQL来抓取净变更:
DECLARE @from_lsn binary(10), @to_lsn binary(10); SET @from_lsn = sys.fn_cdc_get_min_lsn('dbo_Personal'); SET @to_lsn = sys.fn_cdc_get_max_lsn(); SELECT * FROM cdc.fn_cdc_get_net_changes_dbo_Personal (@from_lsn, @to_lsn, N'all '); GO
最终得到的结果如下:
可以看到,对于Id为2的那条数据,是没有体现在这里的,因为他在这个过程中,是从新增变为了删除,相当于是没有变化的,所以这个函数获取出来就没有那条记录~
: 관련 매개 변수의 기능 및 열 의미가 참조 반환 https://docs.microsoft.com/en-us/sql/relational-databases/system-functions/cdc-fn-cdc-get-net-changes-capture -instance-TRANSACT-SQL?보기 = SQL 서버 2017
2. CT 변경 크롤링
사용 CT 크롤링는 다음과 같은 SQL을 필요로 변경 :
SELECT * FROM CHANGETABLE (CHANGES dbo.Person, 0 ) AS CT
상기 기록 동작을 위해, 최종 결과는 다음과 같이 될 것이다 :
우리는 그가 ID가 변경의 내용이, 그는이 기록되지 않을 것이다 것과 같이 변경되었습니다 기록 할 것이다, CT 레코드의 결과는 매우 간단 볼 수 있지만 다른 곳으로이 변경 내용을 동기화 할 경우 그는 당신에게 말할 것이다 작업을 삽입, 삭제 또는 업데이트 (SYS_CHANGE_OPERATION 열)를 사용하여 필요 물론, 우리는 탐험을 계속해야 할, 많은 고급 사용이 있습니다.
개요
주로 데이터를 캡처 CDC 기능의 변화를 사용하는 방법에 대한 사실, 전체 비교적 얕은이라고 말했다이 문서에서는이 내 자신의 이해 중 하나가 다른 한편으로는, 문서 공간 제약이 문서의 초점 쓸모없는 깊은입니다입니다 도 이러한 것들의 다양한 용도가 명확하게하기 위해, 우리는 단지 하나의 목적을 가지고, 즉, 데이터는 SQL 서버에 ES에 동기화된다. 그것은 다른 기능의 번호와 함께, 오늘에 올 때 그래서 다음 기사 우리는 ES로 데이터를 가져 오려고하기 위해이 기능을 사용합니다.
그것은 ~ 침대 바오 머리로 이동, 늦었다