Sql-Server

備份中缺少 CDC 系統表

  • September 25, 2015

我正在將使用 CDC 的數據庫從 SQL Server 2008 R2 遷移到 SQL Server 2012。

在對象資源管理器的“系統表”分支下有 CDC 相關的表:

cdc.ddl_history
cdc.lsn_time_mapping
cdc.captured_columns
cdc.index_columns
cdc.change_tables

備份數據庫並在不同的伺服器上恢復後,與 CDC 相關的表不存在。

我嘗試使用 SSIS 複製它們,但它們在“導出數據”嚮導 GUI 中不可見。看來實際複製它們的唯一方法是手動導出它們或將SELECT * FROM...結果輸出到文件。

如何確保正確還原更改數據擷取相關的表?

如果要將啟用 CDC 的數據庫還原到不同的實例,則必須確保“擁有”相關數據庫的伺服器主體在執行還原之前存在於目標實例上。您還必須確保KEEP_CDC在還原數據庫時使用該選項。

有關還原選項的 MSDN 頁面

  • KEEP_CDC 應用於防止在另一台伺服器上恢復數據庫備份或日誌備份並恢復數據庫時刪除更改數據擷取設置。不允許在使用 NORECOVERY 選項恢復備份時指定此選項。
  • 使用 KEEP_CDC 恢復數據庫不會創建變更數據擷取作業。要在還原數據庫後從日誌中提取更改,請為還原的數據庫重新創建擷取程序作業和清理作業。有關資訊,請參閱sys.sp_cdc_add_job (Transact-SQL)
  • 有關將變更數據擷取與數據庫鏡像結合使用的資訊,請參閱變更數據擷取和其他 SQL Server 功能

我剛剛將一個支持 CDC 的測試數據庫恢復到我的 SQL Server 2012 實例上,該實例是在我的測試 SQL Server 2008R2 實例上創建的,而沒有在 2012 實例上創建擁有該數據庫的登錄名。還原過程中顯示錯誤:

消息 22831,級別 16,狀態 1,過程 sp_cdc_disable_db_internal,第 262 行

無法更新指示數據庫 CDCTest 未啟用更改數據擷取的元數據。執行命令時發生故障'

$$ sys $$.$$ sp_MScdc_ddl_database triggers $$‘降低’’。返回的錯誤是 15517:‘無法作為數據庫主體執行,因為主體“dbo”不存在,無法模擬這種類型的主體,或者您沒有權限。’。使用操作和錯誤來確定失敗的原因並重新送出請求。

sysadmin在恢復啟用 CDC 的數據庫之前,登錄名還必須是伺服器角色的成員。

如果所有者是 SQL 登錄名,則需要在目標實例中使用相同的 SID 重新創建數據庫的所有者(如果所有者是 Windows 登錄名,如果 Windows 登錄名是域,則 SID 自然會相同-成員)。

您需要執行以下操作來恢復數據庫:

/*
   obtain the identify of the login that "owns" the database by looking at the 
   UserName column in the output from the following command:
*/
RESTORE HEADERONLY FROM DISK = 'D:\SQLServer\Temp\CDCTest.bak'

/*
   This login is the owner of the database
*/
CREATE LOGIN CDCTestLogin 
WITH PASSWORD = 'LozierPituophisUnconsciousShelduck4'
   , SID = 0x2ECDACB721D7E84E8A28DCFE1C758799;

/*
   Ensure the login is a member of the 'sysadmin' server-level fixed role.
*/
EXEC sp_addsrvrolemember @loginame = 'CDCTestLogin', @rolename = 'sysadmin';
GO


/*
   Restore the database, with the KEEP_CDC option
*/
RESTORE DATABASE CDCTest FROM DISK = 'D:\SQLServer\Temp\CDCTest.bak'
WITH MOVE 'CDCTest' TO 'D:\SQLServer\MV2012\Data\CDCTest.mdf'
   , MOVE 'CDCTest_log' TO 'D:\SQLServer\MV2012\Logs\CDCTest_log.LDF'
   , REPLACE
   , KEEP_CDC;

引用自:https://dba.stackexchange.com/questions/116171