如何排除 RDS for SQL Server 源在 AWS DMS 任务开启 CDC 时出现的 T-Log 写满问题?
我有一个 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_safeguard 和 pollingInterval 选项。
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 开启时写满的问题。
- 检查事务日志文件的大小:
DBCC SQLPERF(logspace)
- 如果事务日志已满,则运行以下命令以查看日志的内容:
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 文件,然后重启任务:
-
停止任务。
-
检查 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>'
- 验证 CDC 是否已关闭:
select is_cdc_enabled, * from sys.databases where name = 'dbname' Value 1- enabled and 0 -Disabled
- 确认 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
- 确认日志的大小:
DBCC SQLPERF(logspace)
- 再次开启 CDC,然后重新启动任务。恢复任务可能会导致事务丢失。Amazon RDS for SQL Server 不支持访问已存档的 T 日志。
相关信息
相关内容
- AWS 官方已更新 2 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前