CDC 的已知問題和錯誤

適用於:SQL ServerAzure SQL 受控執行個體

本文說明 SQL ServerAzure SQL 受控執行個體中異動資料擷取 (CDC) 的已知問題和限制。

對於 Azure SQL 資料庫,請參閱 Azure SQL 資料庫中的 CDC 的已知問題

修改中繼資料

若要讓 CDC 正常運作,您不應手動修改任何 CDC 中繼資料,例如 CDC schema、變更資料表、CDC 系統預存程序、預設 cdc user 權限 (sys.database_principals) 或重新命名 cdc user

不得修改 sys.objectsis_ms_shipped 屬性設為 1 的任何物件。

SELECT    name AS object_name   
        ,SCHEMA_NAME(schema_id) AS schema_name  
        ,type_desc  
        ,is_ms_shipped  
FROM sys.objects 
WHERE is_ms_shipped= 1 AND SCHEMA_NAME(schema_id) = 'cdc'

定序差異

請務必注意,在資料庫與設定進行異動資料擷取的資料表資料行之間有不同的定序。 CDC 會使用暫時儲存體來填入側邊資料表。 如果資料表的 CHAR 或 VARCHAR 資料行具有與資料庫定序不同的定序,而且如果這些資料行儲存非 ASCII 字元 (例如雙位元組 DBCS 字元),則 CDC 可能無法保存與基底資料表中資料一致的已變更資料。 原因是過度儲存體變數不能有與其建立關聯的定序。

請考慮下列其中一種方法來確保已擷取的異動資料與基底資料表一致:

  • 將 NCHAR 或 NVARCHAR 資料類型用於包含非 ASCII 資料的資料行。

  • 或者,對於資料行和資料庫使用相同的定序。

例如,如果您有一個使用 SQL_Latin1_General_CP1_CI_AS 定序的資料庫,請考慮使用下表:

CREATE TABLE T1( 
     C1 INT PRIMARY KEY, 
     C2 VARCHAR(10) collate Chinese_PRC_CI_AI)

CDC 可能無法擷取資料行 C2 的二進位資料,因為其定序不同 (Chinese_PRC_CI_AI)。 使用 NVARCHAR 避免這個問題:

CREATE TABLE T1( 
     C1 INT PRIMARY KEY, 
     C2 NVARCHAR(10) collate Chinese_PRC_CI_AI --Unicode data type, CDC works well with this data type
     )

加速資料庫復原 (ADR) 和變更資料擷取 (CDC)

目前,不支援同時啟用異動資料擷取 (CDC) 和加速資料庫復原 (ADR)。 在 SQL Server 上啟用異動資料擷取 (CDC) 時,ADR 的主動記錄截斷功能會停用。 這是因為 CDC 掃描會存取資料庫交易記錄。 使用中交易將繼續保留交易記錄截斷,直到交易認可且 CDC 掃描跟上或交易中止為止。 這可能會導致各種問題,包括交易記錄填滿比平常更多,或側邊資料表中記錄的資料作業異常。

啟用 CDC 時,我們建議您使用 [可繼續索引] 選項。 可繼續索引不需要持續開啟長時間執行的交易即可建立或重建索引,允許在此作業期間執行記錄截斷,而讓記錄空間管理的效能更佳。 如需詳細資訊,請參閱線上索引作業的指導方針 - 可繼續索引考量因素

如果結構描述或名為 cdc 的使用者已存在,啟用 CDC 會失敗

當您在資料庫上啟用 CDC 時,它會建立一個名為 cdc 的新結構描述和使用者。 因此,不建議手動建立名為 cdc 的自訂結構描述或使用者,因為此名稱會保留供系統使用。

如果您已在未啟用 CDC 的資料庫中手動定義自訂結構描述或使用者 cdc,則系統預存程序 sys.sp_cdc_enable_db 將無法在該資料庫上啟用 CDC 且會產生下列錯誤訊息。

無法為異動資料擷取啟用資料庫 <database_name>,因為目前資料庫中已存在名為 'cdc' 的資料庫使用者或名為 'cdc' 的結構描述。 CDC 必須獨佔擁有這些物件。 請卸除或重新命名該使用者或結構描述,然後再試一次。

若要解決此問題:

  • 手動卸除空的 cdc 結構描述和 cdc 使用者。 然後,就可以在資料庫上成功啟用 CDC。

COLUMN 變更為 VARCHAR 和 VARBINARY 後 CDC 會失敗

在已啟用 CDC 的資料表上,資料行的資料類型從 TEXT 變更為 VARCHARIMAGEVARBINARY,且現有資料列更新為非資料列值。 更新之後,CDC 掃描將會產生錯誤。

來源資料表的 DDL 變更

使用 DDL 陳述式變更啟用 CDC 的資料表的資料行大小可能會導致後續 CDC 擷取程序發生問題,從而導致錯誤 2628錯誤 8115。 請記住,CDC 變更資料表中的資料會根據使用者設定的設定保留。 因此,在對資料行大小進行任何變更之前,您必須評定變更是否與 CDC 變更資料表中的現有資料相容。

如果 sys.dm_cdc_errors 表示掃描因變更資料表的錯誤 2628錯誤 8115 而失敗,您應先取用受影響變更資料表中的變更資料。 之後,您需要停用再重新啟用資料表上的 CDC,以有效地解決問題。

使用資料層匯入/匯出和擷取/發佈作業匯入資料庫

在已啟用 CDC 的 SQL 資料庫上,當您使用 SqlPackage、SSDT 或其他 SQL 工具來匯入/匯出或擷取/發佈時,cdc 結構描述和使用者會在新的資料庫中遭到排除。 其他不在匯入/匯出和擷取/部署作業中的 CDC 物件會含有 sys.objects 中標示為 is_ms_shipped=1 的資料表。

即使未啟用 CDC,而且您已在資料庫中定義名為 cdc 的自訂結構描述或使用者,也會在匯入/設定新資料庫的匯入/匯出和擷取/部署作業中排除該結構描述或使用者。

使用變數進行資料分割切換

針對 ALTER TABLE ... SWITCH TO ... PARTITION ... 陳述式,不支援在具有異動資料擷取 (CDC) 的資料庫或資料表上使用變數進行資料分割切換。 請參閱分割區切換限制以深入了解。

疑難排解錯誤

本節會逐步針對與 SQL Server 上的 CDC 和 Azure SQL 受控執行個體關聯的錯誤進行疑難排解。 CDC 相關的錯誤可能會阻礙擷取程序的正常運作,並導致資料庫交易記錄擴充。

若要檢查這些錯誤,您可以查詢動態管理檢視 sys.dm_cdc_errors。 如果 sys.dm_cdc_errors 動態管理檢視傳回任何錯誤,則請參閱下一節以了解緩和步驟。

注意

如需有關特定錯誤碼的詳細資訊,請參閱資料庫引擎事件和錯誤

以下是本節中包含的不同疑難排解類別:

類別 描述
已修改的中繼資料 包括有關在追蹤資料表已修改或卸除時如何緩解與 CDC 相關的問題的資訊。
資料庫空間管理 包括有關在資料庫空間用盡時如何緩解問題的資訊。
CDC 限制 包含有關如何緩解 CDC 限制所造成問題的資訊。

已修改的中繼資料

錯誤 200/208 – 無效的物件名稱

  • 原因:卸除 CDC 中繼資料時,可能會發生錯誤。 若要讓 CDC 正常運作,您不應手動修改任何 CDC 中繼資料,例如 CDC schema、變更資料表、CDC 系統預存程序、預設 cdc user 權限 (sys.database_principals) 或重新命名 cdc user

  • 建議:若要解決此問題,您需要為資料庫停用並重新啟用 CDC。 在為資料庫啟用異動資料擷取時,也會為資料庫建立 cdc 結構描述、cdc 使用者、中繼資料表及其他系統物件。

注意

不改變或卸除在 sys.objects 系統目錄檢視中找到的 is_ms_shipped=1 且 schema_name='cdc' 的物件。

錯誤 1202 - 資料庫主體不存在,或者使用者不是成員

  • 原因:卸除 CDC 使用者時,可能會發生錯誤。 若要讓 CDC 正常運作,您不應手動修改任何 CDC 中繼資料,例如 CDC schema、變更資料表、CDC 系統預存程序、預設 cdc user 權限 (sys.database_principals) 或重新命名 cdc user

  • 建議:請確保 cdc 使用者存在於您的資料庫中,並已指派 db_owner 角色。 若要建立 cdc 使用者,請參閱建立 cdc 使用者和指派角色範例。

錯誤 15517 - 無法以資料庫主體的形式執行,因為主體不存在

  • 原因:無法模擬這種類型的主體,或您沒有權限。 CDC 中繼資料已卸除或不再是 db_owner 角色的一部分時,可能會發生錯誤。 若要讓 CDC 正常運作,您不應手動修改任何 CDC 中繼資料,例如 CDC schema、變更資料表、CDC 系統預存程序、預設 cdc user 權限 (sys.database_principals) 或重新命名 cdc user

  • 建議:請確保 cdc 使用者存在於您的資料庫中,並已指派 db_owner 角色。 若要建立 cdc 使用者,請參閱建立 cdc 使用者和指派角色範例。

錯誤 18807 – 找不到複寫系統資料表的物件識別碼

  • 原因:在 SQL Server 找不到或存取複寫系統資料表 '%s' 時,會發生此錯誤。 這可能是因為資料表遺失或無法連線。 若要讓 CDC 正常運作,您不應手動修改任何 CDC 中繼資料,例如 CDC schema、變更資料表、CDC 系統預存程序、預設 cdc user 權限 (sys.database_principals) 或重新命名 cdc user

  • 建議:請確認該系統資料表已存在,而且可直接透過查詢資料表存取。 查詢 sys.objects 系統目錄,透過 is_ms_shipped=1 和 schema_name='cdc' 設定述詞子句,以列出所有與 CDC 相關的物件。 如果查詢未傳回任何物件,則您應停用並重新啟用資料庫的 CDC。 為資料庫啟用異動資料擷取會針對資料庫建立 cdc 結構描述、cdc 使用者、中繼資料表及其他系統物件。

錯誤 21050 – 只有 sysadmin 或 db_owner 固定伺服器角色的成員才能執行此作業

  • 原因cdc 使用者已從 db_owner 資料庫角色或 sysadmin 伺服器角色中移除。

  • 建議:確保 cdc 使用者已指派 db_owner 角色。 若要建立 cdc 使用者,請參閱建立 cdc 使用者和指派角色範例。

資料庫空間管理

錯誤 1105 – 檔案群組已滿,無法在資料庫中為物件配置空間

  • 原因:在資料庫的主要檔案群組空間不足,且 SQL Server 無法為該檔案群組內的物件 (例如資料表或索引) 配置更多空間時,會發生此錯誤。

  • 建議:若要解決此問題,請刪除資料庫內任何不必要的資料以釋放空間。 識別可以安全地移除的檔案群組中未使用的資料表、索引或其他物件。 密切監視空間利用率,如需詳細資訊,請參閱管理 Azure SQL 資料庫中的資料庫檔案空間

    如果無法卸除不必要的資料/物件,則請考慮為資料庫交易記錄配置更多空間。 如需有關交易記錄管理的詳細資訊,請參閱 SQL Server 交易記錄架構和管理指南

CDC 限制

錯誤 2628 – 字串或二進位資料在資料表中會被截斷

  • 原因:使用 DDL 陳述式變更啟用 CDC 的資料表的資料行大小可能會導致後續 CDC 擷取程序發生問題。 'sys.dm_cdc_errors' 動態管理檢視 (DMV) 對於檢查任何 CDC 是否有任何報告的問題 (例如錯誤號碼 2628 和 8115) 非常有用。

  • 建議:在對資料行大小進行任何變更之前,您必須評定變更是否與 CDC 變更資料表中的現有資料相容。 若要解決此問題,您需要為資料庫停用並重新啟用 CDC。 如需有關為資料庫或資料表啟用 CDC 的詳細資訊,請參閱為資料庫啟用 CDC為資料表啟用 CDC

錯誤 913 - 處理具有系統 CLR 資料類型的資料表的變更時,CDC 擷取作業失敗

  • 原因:當 CDC 擷取作業正在處理與其他資料表相關的變更時,在具有系統 CLR 資料類型的資料表上啟用 CDC、進行 DML 變更,然後在相同資料表上進行 DDL 變更時,會發生此錯誤。

  • 建議:建議的步驟是停止對資料表的 DML,執行擷取作業來處理變更,為資料表執行 DDL,執行擷取作業來處理 DDL 變更,然後重新啟用 DML 處理。 如需詳細資訊,請參閱在處理變更時 CDC 擷取作業失敗

建立使用者和指派角色

如果已移除 cdc user,您可以手動新增回此使用者。

使用下列 T-SQL 指令碼來建立使用者 (cdc),並為其指派適當的角色 (db_owner)。

IF NOT EXISTS 
(
    SELECT * 
    FROM sys.database_principals 
    WHERE NAME = 'cdc'
)
BEGIN
    CREATE USER [cdc] 
    WITHOUT LOGIN WITH DEFAULT_SCHEMA = [cdc];
END

EXEC sp_addrolemember 'db_owner', 'cdc';

檢查並新增角色成員資格

若要確認 cdc 使用者是否屬於 sysadmindb_owner 角色,請執行下列 T-SQL 查詢:

EXECUTE AS USER = 'cdc';

SELECT is_srvrolemember('sysadmin'), is_member('db_owner');

如果 cdc 使用者不屬於任一角色,請執行下列 T-SQL 查詢,以將 db_owner 角色新增至 cdc 使用者。

EXEC sp_addrolemember 'db_owner' , 'cdc';

下一步