トランザクション ログ ファイルのエクスポートをスケジュールする

トランザクション ログのバックアップ ファイルには、完全バックアップの取得後にソース データベースで発生した変更が含まれます。移行ジョブの継続的な読み込みフェーズには、トランザクション ログ バックアップが必要です。

このページでは、ソースの SQL Server データベースの定期的なトランザクション ログのエクスポートとアップロードをスケジュールする方法について説明します。

Amazon RDS のトランザクション ログ ファイルのアップロードをスケジュールする

トランザクション ログ ファイルを Amazon RDS ソース インスタンスから、トランザクション ログ ファイルを保存する Cloud Storage バケットに定期的に転送するようにスケジュールできます。

次の手順を行います。

  1. Amazon RDS インスタンスで自動バックアップが有効になっていることを確認します。Amazon RDS ドキュメントの 自動バックアップを有効にするをご覧ください。
  2. Amazon RDS インスタンスでトランザクション ログ ファイルへのアクセスを有効にします。 RDS for SQL Server でのトランザクション ログ バックアップへのアクセスをご覧ください。次のサンプル コマンドも確認できます。

    Amazon RDS でトランザクション ログへのアクセスを有効にするストアド プロシージャ呼び出しの例

    export DATABASE=YOUR_DATABASE_NAME;
    export S3_Bucket=YOUR_S3_BUCKET;
    exec msdb.dbo.rds_tlog_copy_setup
    @target_s3_arn='arn:aws:s3:::${S3_Bucket}/${DATABASE}/log/';
  3. 定期的なスケジュールで実行される SQL エージェント ジョブを作成します。このジョブは、次のスクリプトを実行する必要があります。
    declare @DATABASE varchar(100);
    SELECT @DATABASE=YOUR_DATABASE_NAME;
    
    USE @DATABASE;
    declare @startTime varchar(100);
    declare @endTime varchar(100);
    SELECT
      @startTime = CONVERT(VARCHAR(100), DATEADD(hour, -1, GETUTCDATE()), 120),
      @endTime = CONVERT(VARCHAR(100), GETUTCDATE(), 120);
    
    exec msdb.dbo.rds_tlog_backup_copy_to_S3 
      @db_name=@DATABASE,
      @backup_file_start_time=@startTime,
      @backup_file_end_time=@endTime;
  4. S3 バケットから Cloud Storage バケットへの継続的なファイル転送を構成します。ファイルの移動には、Storage Transfer Service のイベントドリブン転送ジョブなど、任意のソリューションを使用できます。AWS S3 からのイベント ドリブン転送を設定するをご覧ください。

オンプレミスの SQL Server インスタンスのトランザクション ログファイルのアップロードをスケジュールする

トランザクション ログ ファイルをセルフマネージド ソース インスタンスから、トランザクション ログ ファイルを保存する Cloud Storage バケットに定期的に転送するようにスケジュール設定できます。おすすめの解決策の一つは、

次の手順を行います。

  1. スクリプトを実行するシステムで、 gcloud init gcloud auth login gcloud config set project のいずれかを実行して、認証とプロジェクトを使用して Google Cloud CLI を初期化します。
  2. 次のスクリプトをソース SQL Server インスタンスのファイルに保存します。

    このスクリプトは、 gcloud storage cp コマンドを使用して、トランザクション ログ ファイルの作成と Cloud Storage バケットへのアップロードを自動化します。

    Bash

    #!/bin/bash
    
    NOW="$(date +%s)"
    
    EXT=".trn"
    if [[ "$1" == "final" ]]
    then
      EXT='.trn.final'
    fi
    
    NAME="{DATABASE}.${NOW}.${EXT}"
    FULL_NAME="/SQLServerBackups/log/${NAME}"
    
    
    QUERY="BACKUP LOG ${DATABASE} TO DISK = '${FULL_NAME}'"
    /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "${SA_PASSWORD}" -d master -Q "${QUERY}"
    
    gcloud storage cp "${FULL_NAME}" "${GCS_BACKUPS}/log/"

    PowerShell

    # Get the current timestamp
    $NOW = [int](Get-Date -UFormat '%s')
    
    # Set the file extension based on the command-line argument
    $EXT = '.trn'
    if ($args[0] -eq 'final') {
        $EXT = '.trn.final'
    }
    
    # Construct the backup file name
    $NAME = "{0}.{1}{2}" -f $DATABASE, $NOW, $EXT
    $FULL_NAME = "X:\SQLServerBackups\log\$NAME"
    
    # Construct the SQL backup query
    $QUERY = "BACKUP LOG $DATABASE TO DISK = '$FULL_NAME'"
    
    # Execute the SQL backup command
    Invoke-Sqlcmd -ServerInstance 'localhost' -Username 'SA' -Password $env:SA_PASSWORD -Database 'master' -Query $QUERY
    
    # Upload the backup file to Google Cloud Storage
    gcloud storage cp "$FULL_NAME" "$GCS_BACKUPS/log/"
  3. スクリプトを定期的に実行するように、任意のスケジューリング ツールを構成します。

    このスクリプトを手動で使用し、"final" 位置引数を渡して、名前が .trn.final 接尾辞で終わるトランザクション ログファイルを作成することもできます。これは、移行を完了して 移行ジョブを昇格する場合に便利です。