AWS DMS タスクで CDC をオンにしている場合に、RDS for SQL Server ソースの T ログが満杯になる問題を解決する方法を教えてください。

所要時間3分
0

私は、MS 変更データキャプチャー機能(MS change data capture、CDC)を有効にした AWS Database Migration Service (AWS DMS) でのタスクを抱えています。私のタスクで、Amazon Relational Database Service (Amazon RDS) for SQL Server をソースとして使用しています。AWS DMS タスクで、T ログが満杯になる問題が発生しています。

簡単な説明

AWS DMS タスクのソースである SQL Server を使用している場合は、インスタンスで MS 変更データキャプチャー機能(MS change data capture、CDC)をアクティブ化して変更を複製します。MS-CDC for Amazon RDS SQL Server、オンプレミスの SQL Server、SQL Server on Amazon Elastic Compute Cloud(Amazon EC2)インスタンスを使用できます。

CDC を有効にすると、fn_dblog() 関数を使用して、アクティブなログファイルから進行中の DML の変更を追跡して読み取ります。CDC はすべてのソーステーブルに対して、対応する CDC 変更テーブルを作成します。

CDC は、変更を追跡記録するために 2 つのジョブを作成します。

  • キャプチャジョブ - T ログをスキャンして、sp_replcmds ストアプロシージャを使用し、対応する変更テーブルに変更を取り込んで記録します。
  • クリーンアップジョブ - 保持ポリシーに基づいて変、変更の追跡記録をクリーンアップします。

以下のストアドプロシージャーを実行して、これらの設定に設定された値を表示します。

EXEC sys.sp_cdc_help_jobs
  • Maxtrans- 各スキャンサイクル内で処理するトランザクションの最大数。
  • Maxscans- ログからすべての行を抽出するために実行するスキャンサイクルの最大数。
  • Pollinginterval- ログスキャンサイクルの間隔 (秒数)。

Amazon RDS for SQL Server では、トランザクションログのバックアップは、設計上、5 分ごとに実行されます。トランザクションログのバックアップ中に、SQL Server がトランザクションログの非アクティブな部分を切り捨てます。この部分には、AWS DMS が読み取れなかったログシーケンス番号(LSNs)が含まれています。その結果、AWS DMS は、意図しているデータ変更を複製するために必要な LSN を見つけられない可能性があります。

この問題を回避するには、AWS DMS では、awsdms_truncation_safeguard および pollingInterval オプションを使用することができます。

awsdms_truncation_safeguard: AWS DMS は、ソースデータベースに awsdms_truncation_safeguard というテーブルを作成します。このテーブルは、データベース内のトランザクションを模倣することで、トランザクションログの切り捨てを防止します。

ただし、AWS DMS によりログの読み取りが 10 分を超えて遅延すると、タスクは再び失敗します。この問題を回避するには、pollingInterval パラメーターを使用することができます。詳細については、「AWS DMS のソースとしての Microsoft SQL Server データベースの使用」を参照してください。

**pollingInterval:**キャプチャジョブの既定値は 5 秒に設定されています。つまり、pollingInterval は 5 秒ごとに実行され、T ログをスキャンして変更を読み取り、これらのログをレプリケート済みとしてマークします。次に、ログを切り捨てます。

ベストプラクティスは、pollingInterval 値を 3599 以上に設定することです。これにより、キャプチャジョブが頻繁に実行されるのを防ぎます。また、指定した時間分が切り捨てられないように、T ログを構成します。

トランザクションの多いデータベースでは、T ログが空きのない状態になる可能性があります。その後、タスクは次のようなエラーで失敗します。

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 を使用していることを確認してください

CDC がオンになっている場合に SQL Server の T ログが満杯になる問題の、トラブルシューティングと解決方法

CDC がオンになっている場合に SQL Server の T ログが満杯になる問題をトラブルシューティングおよび解決するには、次の手順を使用します。

1.トランザクションログファイルのサイズを確認します。

DBCC SQLPERF(logspace)

2.トランザクションログが満杯の場合は、次のコマンドを実行してログの内容を確認します。

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 ログを圧縮することはできません。この場合にはタスクを停止し、ログバックアップによってトランザクションログが切り捨てられるのを待ちます。次に、データベースの T ログを圧縮します。

T ログファイルを圧縮してタスクを再開します

ログをクリーンアップした後、T ログ ファイルを圧縮して、タスクを再起動します。

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>'

3.CDC がオフになっていることを確認します。

select is_cdc_enabled, * from sys.databases where name = 'dbname' Value 1- enabled and 0 -Disabled

4.CDS がオフになっていることを確認し、10 分間以上待ってから、T ログを圧縮します。

use <dbname>
SELECT file_id, name
FROM sys.database_files;
GO
USE <dbname>
GO
DBCC SHRINKFILE (N'dbname_log' , 0, TRUNCATEONLY)
GO

5.ログのサイズを確認します。

DBCC SQLPERF(logspace)

6.CDC を再度オンにしてからタスクを再起動します。タスクを再開すると、トランザクションが失われる可能性があります。Amazon RDS for SQL Server は、アーカイブ済みの T ログへのアクセスをサポートしていません。

関連情報

SQL Server ソースから継続的なレプリケーション (CDC) を使用するための前提条件

AWS DMS のソースとして Amazon RDS for SQL Server を使用する場合の推奨設定

AWS公式
AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ