AWS DMS(源SQL、目标DynamoDB)无法截断事务日志求助
解决AWS DMS导致SQL Server事务日志无法截断的问题
首先得给你拆解下你看到的这个事务:awsdms_truncation_safeguard是AWS DMS自动创建的锁表,作用是防止SQL Server在DMS还没读完事务日志时就提前截断日志。这个事务一直没提交,说明DMS的日志读取进程大概率卡住了,或是和SQL Server的连接出了异常,导致锁表的更新事务没法正常收尾。
下面是一步步的实操解决方法:
1. 先排查DMS任务本身的状态和日志
- 登录AWS控制台找到你的DMS任务,先看任务状态:如果是Running with warnings或者Failed,那肯定是任务本身有错误,先优先解决任务的异常提示。
- 打开任务的CloudWatch日志,搜索
truncation_safeguard或transaction关键词,看看有没有连接超时、权限不足、SQL Server端阻塞这类报错,这些往往是问题根源。
2. 检查SQL Server端的会话状态
在SQL Server里运行以下查询,定位到卡住的事务对应的会话:
SELECT s.session_id, t.transaction_id, t.name AS transaction_name, s.status, s.login_name, s.host_name, blocking_session_id FROM sys.dm_tran_active_transactions t JOIN sys.dm_exec_sessions s ON t.transaction_id = s.transaction_id WHERE t.name = 'WVGLQ7HFWFWJCCPK4RQVRQGDVE'; -- 替换成你实际看到的事务名
- 如果
blocking_session_id不为0,说明这个会话被其他SQL会话阻塞了,先解决阻塞问题(比如终止阻塞的会话)。 - 如果会话状态是
sleeping但事务一直未提交,基本是DMS的客户端进程没正常响应。
3. 重启DMS任务(最常用的修复方案)
如果排查后任务状态正常但日志一直卡着,试试暂停再重启DMS任务:
- 暂停任务时,DMS会尝试完成当前事务并记录检查点;
- 重启后,DMS会重新建立和SQL Server的连接,自动完成之前未提交的
safeguard事务,之后SQL Server就能正常截断日志了。 - 注意:如果是CDC增量同步模式,重启不会丢失数据,DMS会从上次记录的检查点继续同步;如果是全量+增量模式,重启后会先验证全量数据一致性,再继续增量同步。
4. 验证SQL Server的权限和日志策略
- 确认DMS使用的SQL Server账号权限足够:需要
VIEW SERVER STATE、ALTER ANY DATABASE权限,以及对awsdms_truncation_safeguard表的读写权限(这个表是DMS自动创建的,一般权限没问题,但如果手动修改过表权限就会出问题)。 - 检查SQL Server的恢复模式和日志备份策略:如果是完整恢复模式,必须定期做事务日志备份,否则就算DMS完成了safeguard事务,日志文件也会一直增长(SQL Server需要保留日志到最近一次备份)。
5. 极端情况:手动终止SQL会话(谨慎操作)
如果以上方法都没用,且确认这个会话已经卡死,可以在SQL Server里手动终止:
KILL <session_id>; -- 替换成你之前查询到的session_id
- 终止后,DMS任务会因为连接中断报错,需要重启任务;
- 重启后DMS会重新创建
safeguard表的事务并正常提交,之后日志就能正常截断了; - 这个操作有风险,可能导致短暂的数据同步延迟,之后一定要验证数据一致性。
内容的提问来源于stack exchange,提问作者Haroon
相关产品推荐
相关产品推荐

