环境:AlwaysOn集群
操作系统:Windows Server 2008 R2
数据库: SQL Server 2014
错误提示:“该日志未截断,因为其开始处的记录是挂起的复制操作或变更数据捕获。请确保日志读取器代理或捕获作业正在运行,或使用 sp_repldone 将事务标记为分布式或捕获。
BACKUP LOG 成功处理了 19424 页,花费 2.428 秒(62.497 MB/秒)。”
用语句查看同步状态,如果是replication,则不能截断。
SELECT ag.name AS ag_name, ar.replica_server_name AS ag_replica_server, dr_state.database_id as database_id,dr_state.log_send_queue_size, dr_state.redo_queue_size, is_ag_replica_local = CASE WHEN ar_state.is_local = 1 THEN N'LOCAL' ELSE 'REMOTE'END ,
ag_replica_role = CASE WHEN ar_state.role_desc IS NULL THEN N'DISCONNECTED' ELSE ar_state.role_desc END,dr_state.synchronization_health_desc,dr_state.truncation_lsn
FROM (( sys.availability_groups AS ag
JOIN sys.availability_replicas AS ar ON ag.group_id = ar.group_id )
JOIN sys.dm_hadr_availability_replica_states AS ar_state ON ar.replica_id = ar_state.replica_id)
JOIN sys.dm_hadr_database_replica_states dr_state on ag.group_id = dr_state.group_id and dr_state.replica_id = ar_state.replica_id;
分析原因,应该跟cdc有关。
CDC功能主要捕获SQLServer指定表的增删改操作,由于任何操作都会写日志(哪怕truncate),所以CDC的捕获来源于日志文件。日志文件会把更改应用到数据文件中,同时也会标记符合要求的数据标记为需要添加跟踪的项。然后通过一些配套函数,最后写入到数据仓库中。
如果关掉CDC,标记的事务日志就不能被截断,会重新开启CDC,等同步变成正常后再进行事务日志截断。