AWS DMS无法截断SQL事务日志

时间:2018-05-01 19:56:52

标签: sql-server amazon-web-services aws-dms

我们正在运行AWS DMS,其中SQL作为源,DynamoDB作为目标。

我们很难截断事务日志,我们看到每个AWS DMS有2个SQL任务,如下所示:

begin transaction [WVGLQ7HFWFWJCCPK4RQVRQGDVE]; update [dbo].[awsdms_truncation_safeguard] set [latchLocker] = GETDATE() where [latchTaskName]='[WVGLQ7HFWFWJCCPK4RQVRQGDVE]' and [latchMachineGUID]='660a2d00-681b-46fd-89c3-3abdcfc8df18' and [LatchKey]='A'

知道如何让AWS DMS完成我们可以截断日志的交易

AWS文档说:https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.SQLServer.html

名称说明 safeguardPolicy

为获得最佳性能,AWS DMS尝试从活动事务日志(TLOG)捕获所有未读更改。但是,有时由于截断,活动TLOG可能不包含所有未读更改。发生这种情况时,AWS DMS将访问备份日志以捕获缺失的更改。为了最大限度地减少访问备份日志的需要,AWS DMS使用以下方法之一阻止截断:

  1. 在数据库中启动事务:这是默认方法。使用此方法时,AWS DMS会通过模仿数据库中的事务来阻止TLOG截断。只要此类交易处于开放状态,交易开始后出现的更改就不会被截断。如果需要在数据库中启用Microsoft Replication,则必须选择此方法。

  2. 在单个任务中独占使用sp_repldone:使用此方法时,AWS DMS会读取更改,然后使用sp_repldone将TLOG事务标记为已准备好进行截断。虽然此方法不涉及任何事务活动,但只能在Microsoft Replication未运行时使用。此外,使用此方法时,任何给定时间只有一个AWS DMS任务可以访问数据库。因此,如果需要针对同一数据库运行并行AWS DMS任务,请使用默认方法。

  3. 默认值:RELY_ON_SQL_SERVER_REPLICATION_AGENT

    有效值:{EXCLUSIVE_AUTOMATIC_TRUNCATION,RELY_ON_SQL_SERVER_REPLICATION_AGENT}

    示例:safeguardPolicy = RELY_ON_SQL_SERVER_REPLICATION_AGENT

    readBackupOnly

    当此参数设置为Y时,AWS DMS仅从事务日志备份中读取更改,并且在正在进行的复制期间不从活动事务日志文件中读取。将此参数设置为Y可以为正在进行的复制添加一些源延迟,但它允许您在完全加载和正在进行的复制任务期间控制活动事务日志文件的增长。

    有效值:N或Y.默认值为N。

    示例:readBackupOnly = Y

    我们正在使用SQL Replication,因为我们使用主键表,是否有解决方法。还有其他我们需要配置的东西

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。

运行:

EXEC sp_replcounters

如文件所述,添加参数

safeguardPolicy : EXCLUSIVE_AUTOMATIC_TRUNCATION 

并运行日志阅读器或创建新作业并添加以下命令并以特定间隔运行作业。日志文件不会占用任何空间,因为旧记录将被标记为已导出。

EXEC sp_replshowcmds

EXEC sp_repldone @xactid = NULL, @xact_segno = NULL, @numtrans = 0, @time = 0, @reset = 1

再次运行sp_replcounter

请检查:https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-repldone-transact-sql?view=sql-server-2017