程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL 2008的變更數據捕獲——跟蹤可變部分

SQL 2008的變更數據捕獲——跟蹤可變部分

編輯:關於SqlServer

SQL Server 2008的CDC函數讀取激活了CDC的每個表所關聯的事務日志來記錄系統表中的變更。它將這些文件寫到同一個數據庫的系統表中,這些系統表是可以通過直接查詢或系統函數來訪問的。

讓我們看些示例代碼並看看每一步有什麼改變。

使用示例代碼來跟蹤可變部分

首先,我們從一個全新的數據庫開始。要跟蹤這些變更,打開對象浏覽器並展開這些文件夾:

· Databases

· SQLServer Agent | Jobs

· (數據庫創建之後)Security | Roles | Database Roles

· (數據庫創建之後)Programmability | Stored Procedures | System Stored Procedures

· (數據庫創建之後)Programmability | Functions | Table-valued Functions

創建數據庫

CREATE DATABASE TestCdc

這為我們創建了新數據庫,但是沒有新作業。展開Tables文件夾和System Tables文件夾。現在是空的。

在數據庫TestCdc上激活變更數據捕獲

USE TestCdc

-- Turn on Change Data Capture at database level

EXEC sys.sp_cdc_enable_db

這個步驟需要一些時間。現在刷新System Tables文件夾。現在它下面有6個系統表:

· cdc.captured_columns

· cdc.change_tables

· cdc.ddl_history

· cdc.index_columns

· cdc.lsn_time_mapping

· dbo.systranschemas

注意,其中的5個是“cdc” schema 部分的。

在sys.all_objects表中還有四個新的看起來很奇怪的“SQL inline table-valued function”登錄:

· fn_cdc_get_all_changes_◦...◦

· fn_cdc_get_all_changes_...

· fn_cdc_get_net_changes_◦...◦

· fn_cdc_get_net_changes_...

(我使用了非比例字體,用“◦”來標記空格,使得很清楚地看到在這些名稱中有嵌入的空格。)

下面是會返回這些函數的查詢:

SELECT [name] FROM sys.all_objects WHERE [name] LIKE '%...%'

還有更多的新存儲過程

· sp_batchinsert_lsn_time_mapping

· sp_ins_dummy_lsn_time_mapping

· sp_ins_instance_enabling_lsn_time_mapping

· sp_ins_lsn_time_mapping

現在還沒有新的作業或角色。

創建新的Schema和用戶表

CREATE SCHEMA MySchema

CREATE TABLE MySchema.Person (

PersonID int IDENTITY PRIMARY KEY,

FirstName varchar(32) NOT NULL,

LastName varchar(32) NOT NULL,

UpdateCt int NOT NULL DEFAULT 0

)

上面的代碼創建了一個新的用戶表,但是這個表還沒有激活CDC。

這個步驟不影響我們所跟蹤的函數/存儲過程/角色列表。

為新的用戶表激活CDC

EXEC sys.sp_cdc_enable_table

@source_schema = N'MySchema',

@source_name = N'Person',

@role_name = N'ChangeDataAccessRole',

@supports_net_changes = 1

這會為新的用戶表激活CDC。刷新上面所列的文件夾。我們現在有了

· 一個新的系統表(cdc.MySchema_Person_CT)

· 兩個新的作業(cdc.TestCdc_capture和cdc.TestCdc_cleanup)

· 一個新的數據庫角色(ChangeDataAccessRole) 兩個新的表值型函數

o fn_cdc_get_all_changes_MySchema_Person

o fn_cdc_get_net_changes_MySchema_Person

· 三個新的存儲過程:

o sp_batchinsert_389576426

o sp_insdel_389576426

o sp_upd_389576426

你可以獲得這些存儲過程(sp_helptext 'cdc.sp_batchinsert_389576426' 【你的數字可能不一樣】)的文本。很明顯這個存儲過程被生成了,而且是專用於這個用戶表的。

如果你為第二個表激活了CDC,那麼你將獲得另一組的sp_batchinsert_n、sp_insdel_n和sp_upd_n存儲過程。

系統表cdc.MySchema_Person_CT

這個表具有以下字段:

· __$start_lsn

· __$end_lsn

· __$seqval

· __$Operation

· __$update_mask

· PersonID

· FirstName

· LastName

· UpdateCt

作業cdc.TestCdc_capture

當你研究這個捕捉作業時,你會發現它是很有趣的。從sysjobs,我們可以看出這個作業是屬於sa的,是在“REPL-LogReader”分類中,並有一個“CDC Log Scan Job”的描述。

從sysjobsteps,我們看到它有兩個步驟:

讀過這些細節之後,接下來有兩個步驟,但是我們將保留第二個,直到我們插入了一些數據之後再執行

sp_helptext N'sys.sp_MScdc_capture_job'

SELECT * FROM sys.dm_cdc_log_scan_sessions

存儲過程Psys.sp_MScdc_capture_job和sys.sp_cdc_scan

sys.sp_MScdc_capture_job是開始整個CDC過程的存儲過程。它首先進行一些安全檢查,然後調用sys.sp_cdc_scan,這將進行實質的工作。sys.sp_cdc_scan執行變更數據捕獲日志掃描操作。

默認情況下,sys.sp_cdc_scan在每個循環間進行五秒鐘的延遲。在每個常規的循環中,它調用sp_replcmds。(這是個復制存儲過程。使用默認(1)調用這個存儲過程會返回等待分配的下一個事務。在這個存儲過程中,默認@maxtrans是500。)

最後,它從sys.dm_cdc_log_scan_sessions讀取來准備調用sp_sqlagent_log_jobhistory,從而記錄作業歷史信息。

數據庫角色ChangeDataAccessRole

如果你打開新的ChangeDataAccessRole角色的屬性窗口,那麼你會看到這個角色屬於“cdc”,並且具有對上面所列的兩個表值型函數的SELECT權限,除此之外沒有其它權限。

總結

研究這些細節使我們了解了Server 2008的CDC是怎樣執行的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved