AWS announces preview of AWS Interconnect - multicloud
AWS announces AWS Interconnect – multicloud (preview), providing simple, resilient, high-speed private connections to other cloud service providers. AWS Interconnect - multicloud is easy to configure and provides high-speed, resilient connectivity with dedicated bandwidth, enabling customers to interconnect AWS networking services such as AWS Transit Gateway, AWS Cloud WAN, and Amazon VPC to other cloud service providers with ease.
如何排除 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 日志。
相关信息
- 语言
- 中文 (简体)
