中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SQL SERVER如何開啟CDC

發布時間:2021-10-19 11:45:54 來源:億速云 閱讀:316 作者:iii 欄目:開發技術

本篇內容介紹了“SQL SERVER如何開啟CDC”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

目錄
  • 1. 環境檢查

    • 1.1 版本檢查

    • 1.2 檢查CDC服務開啟狀態

  • 2. 開啟CDC

    • 2.1 開啟SQL server agent服務

    • 2.2 開啟數據庫級別的CDC功能

    • 2.3 添加CDC專用的文件組和文件

    • 2.4 開啟表級別CDC

    • 2.5 單表開啟測試范例(僅供參考,可略過)

    • 2.6 開啟成功說明

    • 2.7 DDL操作:DDL操作需要重新收集表的信息(以測試表test_hht為例)

  • 3. 關閉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:\DATA\dbname_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最多允許兩個捕獲表,所以多次改變時需要先禁用之前的表

    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的模式消失)

    “SQL SERVER如何開啟CDC”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    永德县| 资源县| 珲春市| 四子王旗| 娄底市| 东城区| 吉木萨尔县| 平和县| 连平县| 安丘市| 苏尼特右旗| 凌海市| 乌兰察布市| 襄垣县| 武冈市| 龙泉市| 双柏县| 兴仁县| 巢湖市| 疏附县| 南城县| 古蔺县| 盐津县| 苏尼特左旗| 黄山市| 纳雍县| 井研县| 疏勒县| 岗巴县| 会泽县| 板桥市| 绩溪县| 句容市| 襄垣县| 庆城县| 和龙市| 桃园县| 富蕴县| 溆浦县| 安阳县| 平顶山市|