まず、関連文書
古いルールは、あなたを欺く私の説明を避けるために、公式ウェブサイトを通じてのSQL Server関連の機能の波を理解しておいてください。
ドキュメント住所:
チェンジ・データ・キャプチャ:https://docs.microsoft.com/en-us/sql/relational-databases/track-changes/about-change-data-capture-sql-server?view=sql-server-2017
下手な英語の友人は、EN-US URLは、ZH-CN中国のビューの文書に変更されることができます
第二に、特長
組み込みSQL Serverは、二つの機構(以下、CDCと称する)チェンジ・データ・キャプチャと呼ばれるデータの変化、(以下、CTと呼ぶ)と呼ばれる別の変更追跡をつかむ提供します。これら2つの関数はDML操作を実行することができたときに、変更データを記録するようにユーザに(挿入、更新、削除)。
その動作原理は、データテーブルの操作は、SQL Serverは、トランザクションログを記録するときは、上記の2つの関数のいずれかがある場合は、有効にすることで、キャプチャするために、SQL Server、SQL Serverエージェント(別のプログラム)を使用しています特定のテーブルにこれらのログレコード(そのプログラムは、追加のストレージ容量とサーバーのパフォーマンスのオーバーヘッドを持つことになります)、最終的にSQL Serverは、ユーザーがこれらのレコードリストを解決するための関数のセットを提供し、もちろん、方法がありますこれらの変更は、レコードに直接読み取ることができます。
これらの2014年に機能し、次のバージョンは、EnterpriseまたはDeveloper Editionが必要ですが、上記のSQL Server 2016バージョンでは、この機能を持っていることに注意してください、標準バージョンは、この機能に組み込まれています。
利点:
- カスタムソリューションなしで構築されたシステム
- データ・シート構造は、ID列のようなものを追加する必要が調整を必要としません。
- CDCは、内蔵されたデータクリアメカニズムLOGの有効期限後にカスタムのクリアランス機構を必要としません。
- サーバがパフォーマンスに影響しますが、プログラムは、非同期ですが、すべてのプロセスが独立しているの後、フリップフロップの使用の直接的な影響よりも、この効果は小さい(SQL Serverの別のマシンにエージェントを展開するプランがないかわかりません兄上のその次知ることができます)
- 変更はコミットされたトランザクションで、時間の順序を変更するトランザクションに基づいてコミットし、プログラムの順序を変更する信頼性の高い取得する必要があります。
- SQL Serverは、設定および管理するためのいくつかのツールを提供します
どのように動作します:
ここでは主に戦闘を基づいており、これだけ〜気持ちの公式ウェブサイトにあなたの二つの絵を入れて
違い:
この2つの機能の主な違いは、記録されたデータの形式は、CDCは、より詳細にのいくつかは、彼は、変更前と変更後、つまり、各フィールドのデータの値を、各レコードのすべての変更の詳細を記録することです。CTはちょうど、レコード、特定の変更は記録されません前と後のこのレコードは内容に変更されています。
下記の記録された特定コンテンツがあなたに詳細な説明を与える、〜Shaoanwuzaoください。
第三に、準備
関連の機能を開きます。
この記事に加えて、他の人の庭で書かれた記事をブログに参照してください。
https://www.cnblogs.com/maikucha/p/9039205.html
https://www.cnblogs.com/chenmh/p/4408825.html
1.ファイルの専用のグループを追加します。
右のデータ変更を記録する必要性に - > [プロパティ] - > [ファイルグループ、TDCのファイルという名前のグループを追加し、ファイル・グループの追加]をクリックします。
2.データベース・ファイルを追加します。
文書タブページに切り替え、その後、新しいファイルを作成するには、[追加]ボタンをクリックし、データのファイルの種類の選択行、あなただけの良いグループTDCファイルグループを作成したファイルを選択します。
このステップでは、最初の2つのステップは、もちろん、あなたがこれらの2つのステップを無視することができる公式文書が存在しない、私はそこを介して他のブロガーから学んだことですが、私の理解では、これがつかむために二段階の主要プロセスとSQL Serverを避けるためであるということですMDFファイルのリソース、主要プロセスの場合と同じファイルを使用するには、いくつかのテストを行い、PRDの公式前に、具体的には、パフォーマンスの問題と並行性の問題を引き起こす可能性があります。
3. SQL Serverエージェントを有効にします
SQL Serverエージェントサービスの中に発見Windowsサービスでは、(必要であれば、起動時に設定)[スタート]をクリックし、接続MSSQLデータベースの最後の表示された後、次のように:
4.データベースレベル関連の機能を有効にします
これらのデータは、追跡機能はデフォルトではオフになっており、これらの機能を使用しているとき、あなたが最初に必要とされる変更データベースレベルこれらの機能を有効にします。
以下のSQLを実行するために必要なCDC有効にデータベース機能:
使用mydbという
GO
EXEC sys.sp_cdc_enable_db
GO
以下のSQLを実行するために必要なCT対応のデータベース機能:
ALTER DATABASE JaxTest(データベース名) のSET CHANGE_TRACKING = ON (CHANGE_RETENTION = 2 DAYS、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 ServerのESに同期されます。それが今日に来るときので、次の記事では、我々はESにデータをインポートしようと、他の多くの機能と組み合わせて、これらの機能を使用します。
それは〜ベッドバオ毛に行って、遅れていました