本文可帮助你解决发现已启用 CDC 的数据库持续事务日志增长的问题。
原始产品版本: SQL Server 2012 和更高版本
原始 KB 数: 2871474
现象
假设出现了下面这种情景:
- 在 Windows 上使用 SQL Server 2017、SQL Server 2016、SQL Server 2014 或 SQL Server 2012。
- 您使用 Attunity 的变更数据捕获功能来处理 Oracle 数据。
- 创建 CDC 实例以捕获 Oracle 数据库表中的更改。
- 更改捕获值存储在 SQL Server 更改捕获数据库中。
- SQL Server 数据库上的事务日志会增大,并且不会在捕获数据更改时将事务标记为截断。
在此方案中,SQL Server 数据库事务日志文件增长会累积并随时间推移消耗过多的磁盘空间。
原因
配置 Oracle 实例的变更数据捕获时,接收更改数据的 SQL 数据库将具有镜像表,其中事务标记为复制。 出现此行为的原因在于 Oracle CDC 依赖于基础系统存储过程,这些过程类似于 SQL Server CDC 中使用的存储过程。 但是,由于单独使用 Oracle CDC 时没有涉及 SQL CDC 复制,因此没有日志读取器清除标记为复制的事务。 由于事务不必在 SQL Server 中复制,因此使用本文后面所述的解决方法手动将事务标记为分布式是安全的。
若要验证此确切原因,请在 DBCC OPENTRAN 连接到 SQL Server CDC 数据库时运行该命令。 你将看到一个非分布式 LSN 数字,如以下示例所示:
Replicated Transaction Information:
Oldest distributed LSN : (0:0:0)
Oldest non-distributed LSN : (38:272:1)
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
你可能有一个非分布式 LSN,因为 Oracle CDC 使用 CDC 进行 SQL 存储过程,反过来又使用复制日志读取器。 此非分布式 LSN 对应于用于在 Attunity CDC 数据库中添加镜像表的日志条目。
如果运行此查询,选项 log_reuse_wait_desc 将返回一个值 REPLICATION,该值指示原因。
SELECT log_reuse_wait_desc FROM sys.databases WHERE name = '<your_cdc_database>'
解决方法
在连接到 SQL Server 中启用了 CDC 的数据库的查询窗口中运行以下命令:
EXEC sp_repltrans应会收到如下所示的输出:
xdesid xact_seqno xact_seqno 0x000000260000012C0001 0x0000002A000001B50001复制下一个命令的 LSN 事务序列号。
使用步骤 1 中的数字,运行以下命令
sp_repldone,以指示 BeginTran 和 CommitTran LSN 对已复制:sp_repldone @xactid = 0x000000260000012C0001, @xact_segno = 0x0000002A000001B50001运行以下命令,验证事务是否已在 CDC 数据库中标记为复制:
DBCC OPENTRAN这会返回如下所示的输出:
No active open transactions. DBCC execution completed. If DBCC printed error messages, contact your system administrator.若要确保可以重复使用事务日志,请确认数据库上没有其他重用原因:
SELECT log_reuse_wait_desc, NAME FROM sys.databases WHERE NAME = '<your_cdc_database>'这会返回如下所示的输出:
log_reuse_wait_desc name NOTHING <your_cdc_database>现在,应该能够使用日志备份截断事务日志。 还应能够收缩事务日志文件,以减少占用的磁盘空间。 例如,运行以下命令:
BACKUP LOG <your_cdc_database> TO DISK='c:\folder\logbackup.trn' DBCC SHRINKFILE (yourcdcdatabase_log, 1024)
有关详细信息,请参阅 管理事务日志文件的大小。
详细信息
有关详细信息,请参阅 Attunity Microsoft Oracle 更改数据捕获中的 CDC 实例错误疑难解答。
本文中提到的第三方产品由 Microsoft 以外的其他公司提供。 Microsoft 不对这些产品的性能或可靠性提供任何明示或暗示性担保。