如何排除 RDS for SQL Server 源在 AWS DMS 任务开启 CDC 时出现的 T-Log 写满问题?

3 分钟阅读
0

我有一个 AWS Database Migration Service(AWS DMS)任务开启了变更数据捕获(CDC)状态。我的任务使用 Amazon Relational Database Service (Amazon RDS) for SQL Server 作为源。我在 AWS DMS 任务中看到了 “SQL Server T-Log 写满” 问题。

概述

如果您使用 SQL Server 作为 AWS DMS 任务的来源,请在实例上激活 MS 更改数据捕获 (CDC),以复制更改。您可在 Amazon Elastic Compute Cloud (Amazon EC2) 实例上对于 Amazon RDS SQL Server、本地 SQL Server 和 SQL Server 使用 MS-CDC。

开启 CDC 后,它使用 fn\ _dblog () 函数来跟踪并从活动日志文件中读取正在进行的 DML 更改。对于每个源表,CDC 都会创建相应的 CDC ** 变更表**。

CDC 创建两个任务来跟踪变化:

  • 捕获任务:扫描 T-log,然后使用 sp\ _replcmds 存储流程在相应的变更表中捕获和记录更改。
  • 清理任务:根据留存策略来清除变更跟踪。

运行下列已存储的流程,来查看这些设置的设定值:

EXEC sys.sp_cdc_help_jobs
  • Maxtrans:每个扫描周期中要处理的最大事务数。
  • Maxscans:为从日志中提取所有行而要运行的最大扫描周期数。
  • Pollinginterval:日志扫描周期之间间隔的秒数。

在 Amazon RDS for SQL Server 上,根据设计,每 5 分钟进行一次日志备份。在事务日志备份期间,SQL Server 会截断事务日志的非活动部分。此部分会包含 AWS DMS 未读取的日志序列号 (LSN)。因此,AWS DMS 可能无法找到复制所需数据更改而需要的 LSN。

为避免这一问题,AWS DMS 有 awsdms_truncation_safeguardpollingInterval 选项。

awsdms_truncation_safeguard: AWS DMS 在源数据库中创建了一个名为 awsdms\ _truncation\ _safeguard 的表。此表通过模仿数据库中的事务来防止事务日志被截断

但如果 AWS DMS 延迟读取日志超过 10 分钟,则任务会再次失败。要避免此问题,请使用 pollingInterval 参数。有关更多信息,请参阅使用 Microsoft SQL Server 数据库作为 AWS DMS 的源

**pollingInterval:**捕获任务的默认值设置为 5 秒。这意味着 pollingInterval 每 5 秒运行一次,扫描 T-log 以读取更改,然后将这些日志标记为已复制。然后,它会截断日志。

最佳做法是将 pollingInterval 值设置为不小于 3599。这样可以防止捕获任务过于频繁运行。它还配置了 T-log,使任务在指定的时间内不会被截断。

极度繁忙的数据库可能会导致 T-Log 处于写满状态。然后导致任务失败,出现类似于以下的错误:

E: RetCode: SQL_ERROR SqlState: 42000 NativeError: 9002 Message: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The transaction
log for database 'yourdatabase' is full due to 'REPLICATION'

解决方法

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请确保您使用的是最新版本的 AWS CLI

排除并解决 SQL Server T-Log 在 CDC 开启时写满的问题

完成以下步骤以排除和解决 SQL Server T-Log 在 CDC 开启时写满的问题。

  1. 检查事务日志文件的大小:
DBCC SQLPERF(logspace)
  1. 如果事务日志已满,则运行以下命令以查看日志的内容:
select name, log\_reuse\_wait\_desc from sys.databases where name = ' db\_name '
  • **Replication:**复制停止工作或未读取活动事务。
  • **Active_transaction:**有一个待决事务。

如果有活动事务,请查看活动事务列表:

select \* from sys.sysprocesses where open\_tran=1

**注意:**当 AWS DMS 处于运行状态时,无法缩小已开启 CDC 的数据库的 T-Log。相反,应停止任务,然后等待日志备份截断事务日志。然后再缩小数据库的 T-Log。

缩小 T-log 文件并重启任务

清理日志后,缩小 T-log 文件,然后重启任务:

  1. 停止任务。

  2. 检查 CDC 的状态,然后关闭 CDC。

检查 CDC 的状态:

select b.name,a.run\_date,a.run\_status from msdb.dbo.sysjobhistory as a
join msdb.dbo.sysjobs as b on a.job\_id=b.job\_id
where b.name like '%cdc%capture%';

在数据库级别关闭 CDC:

exec msdb.dbo.rds_cdc_disable_db '<db_name>'

查找属于 CDC 的表格:

USE db\_name
GO
SELECT s.name AS Schema\_Name, tb.name AS Table\_Name
, tb.object\_id, tb.type, tb.type\_desc, tb.is\_tracked\_by\_cdc
FROM sys.tables tb
INNER JOIN sys.schemas s on s.schema\_id = tb.schema\_id
WHERE tb.is\_tracked\_by\_cdc = 1

在表级别关闭 CDC:

use <db_name>
EXEC sys.sp_cdc_disable_table
@source_schema = N'<schema>',
@source_name = N'<table>',
@capture_instance = N'<schema_table>'
  1. 验证 CDC 是否已关闭:
select is_cdc_enabled, * from sys.databases where name = 'dbname' Value 1- enabled and 0 -Disabled
  1. 确认 CDS 已关闭后,请等待至少 10 分钟,然后缩小 T-log:
use <dbname>
SELECT file_id, name
FROM sys.database_files;
GO
USE <dbname>
GO
DBCC SHRINKFILE (N'dbname_log' , 0, TRUNCATEONLY)
GO
  1. 确认日志的大小:
DBCC SQLPERF(logspace)
  1. 再次开启 CDC,然后重新启动任务。恢复任务可能会导致事务丢失。Amazon RDS for SQL Server 不支持访问已存档的 T 日志。

相关信息

从 SQL Server 源使用持续复制 (CDC) 的先决条件

使用 Amazon RDS for SQL Server 作为 AWS DMS 源时的推荐设置

AWS 官方
AWS 官方已更新 1 年前