SQL ServerデータベースをAWS RDSインスタンスへ移行する方法
本記事では、オンプレミス(またはAmazon EC2やAzure上)でホストされているMicrosoft® SQL Server®データベースを、Amazon Relational Database Service(RDS)へ移行する方法を解説します。移行の基本的な流れは、SQLデータベースをAWS S3バケットにバックアップし、そのS3バケットからAWS RDSインスタンス上にデータベースを復元するというものです。
はじめに
以前のAmazon RDSインスタンスでは、.bakファイルからのデータ復元がサポートされていませんでした。そのため、ユーザーはAmazon Data Migration Servicesやインポート/エクスポートウィザードを使って、AWS RDSとの間でデータを移動する必要がありました。
2016年7月、Amazonはネイティブバックアップ/リストア機能のサポートを開始し、RDSのMSDBデータベースに以下のストアドプロシージャを追加しました。
- rds_backup_database – 単一のデータベースをS3バケットへバックアップします。
- rds_restore_database – S3から単一のデータベースを復元します。
- rds_task_status – 実行中のバックアップおよびリストアタスクの状況を追跡します。
- rds_cancel_task – 実行中のバックアップまたはリストアタスクをキャンセルします。
本記事では、rds_restore_databaseプロシージャを使用してS3から.bakファイルを復元する方法と、rds_task_statusプロシージャでリストアの進捗を監視する方法を紹介します。さらに、AWS S3 syncコマンドを使ってバックアップファイルをS3バケットへアップロードする手順についても説明します。
前提条件
移行を実施するには、以下の環境が必要です。
- SQL Server Agentプロキシ
- AWS Command Line Interface(AWS CLI)
- ProfileName(Amazon S3へのアクセス権を持つAWSユーザーと、
aws_access_key_idおよびaws_secret_access_keyを含むS3バケット) SQLSERVER_BACKUP_RESTOREオプションがマッピングされた適切なオプショングループを持つAWS RDSインスタンス- PowerShellのインストール
加えて、SQL Serverの基礎知識、S3バケットの作成方法、AWSユーザーの作成方法、S3バケットへのアクセス権の付与、RDSインスタンスの作成方法に関する基本的な理解も求められます。
解決策
以下の3つのステップで移行手順を説明します。
- ローカルサーバー上でデータベースをバックアップする。
- バックアップファイルをAWS S3バケットへコピーする。
- S3バケットからRDS内でSQLバックアップを復元する。
ステップ1:ローカルサーバー上でデータベースをバックアップする
ローカルでのバックアップには任意の方法を使用できます。以下の例はsqlcmdコマンドを含む.batスクリプトです。SQLエージェントジョブとしてそのまま利用できるため、移行タスクをスケジュール実行したい場合にも便利です。
Sqlcmd -S SourceInstanceName -U sa -P password_here -Q
"Declare @DBName nvarchar(200)='MigrationTestDB'
DECLARE @BackupLocation NVARCHAR(2000) = 'C:\Temp\RDSmigration\backup\'+@DBName+
+ REPLACE(CONVERT(VARCHAR(20), GETDATE(), 120) + '.bak', ':', '');
BACKUP DATABASE @DBName TO DISK = @BackupLocation with compression;"
ステップ2:バックアップファイルをAWS S3バケットへコピー・アップロードする
この作業はAWS S3 copyまたはAWS S3 syncコマンドで実行できます。syncコマンドは業界で広く使われているため、ここではsyncコマンドを使用した例を紹介します。
デフォルトでは、AWS syncコマンドはファイルを削除しません。新規または変更されたファイルだけをコピー先へ転送します。以下のPowerShellスクリプトはSQLエージェントジョブで使用できます。バックアップとこのコピー処理の両方を、cmdExecとPowerShellサブシステムを実行できるよう設定されたSQLエージェントプロキシアカウントで実行する必要があります。
$LogDate = Get-Date -Format yyyy-MM-dd
$Global:LogFile = "C:\Temp\RDSmigration\Logs\$LogDate.log"
$env:Path += ';C:\Program Files\Amazon\AWSCLI\bin'
Set-AWSCredential -ProfileName backuptos3user
aws configure set aws_access_key_id AKIAVIH6FYWVO62BZ7QA
aws configure set aws_secret_access_key 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
aws configure set region ap-south-1
try
{
$now = (Get-Date -Format G)
aws s3 sync C:\Temp\RDSmigration\backup s3:// ramkrdsrestore --sse | out-file $LogFile
}
catch {
Write-Host $_.Exception.Message -ForegroundColor Green
}
ステップ3:S3バケットからRDS内でSQLバックアップを復元する
以下のコマンドを実行すると、MigrationTestDB2019-08-15 181640.bakファイルがMigrationTestDBデータベースとして復元されます。
EXEC msdb.dbo.rds_restore_database
@restore_db_name = 'MigrationTestDB',
@S3_arn_to_restore_from = 'arn:aws:s3:::ramkrdsrestore/MigrationTestDB2019-08-15 181640.bak'
ストアドプロシージャに渡すパラメータに注目してください。指定が必要なパラメータは次の2つです。
- 復元するデータベース名
- バックアップファイルのAmazon Resource Name(ARN)。S3オブジェクトの場合、ARNは上記の例のような形式になります。
コマンドを実行すると、SQL Serverがリストアタスクを開始し、TaskIDを割り当てます。以下のコマンドでタスクの状況を簡単に追跡できます。
EXEC msdb.[dbo].[rds_task_status] @db_name ='DestinationDBName'
@db_nameの代わりにTaskIDを指定して進捗を確認することも可能です。
実行時には、以下の点に注意してください。
- rds_restore_databaseプロシージャでは、バケット内のバックアップファイル名は大文字・小文字が区別されます。
- オプショングループで使用されるIAMロールが、対象のS3バケットにアクセスできることを確認します。
- S3バケットポリシーがIAMロールを排除しない設定になっていることを確認します。
- RDS SQLインスタンスが、バックアップ/リストアオプションを追加した正しいオプショングループを使用していることを確認します。この設定は非常に重要で、これがないとリストア自体が開始されません。
Amazon RDSにおけるSQL Serverネイティブバックアップ/リストアの制限事項
Amazon RDSでのSQL Serverネイティブバックアップ/リストアには、以下のような制限があります。
- 差分バックアップ、トランザクションログバックアップ、ファイルグループ単位のバックアップ/リストアは実行できません。ただし、これはデータ復旧の妨げにはなりません。Amazon RDSではスケジュールされたインスタンススナップショットを作成でき、スナップショットは35日間ローリング方式で保持されます。過去35日以内の指定した時点から5分以内にインスタンスを復元できます。
- KMSで暗号化されたバックアップをS3からオンプレミス環境へ復元することはできません。
- 同じRDSインスタンス内にデータベースを復元することはできません。
- 透過的データ暗号化(TDE)が有効なデータベースのバックアップを復元することはできません。
- 復元先のRDSインスタンスには、S3バケットへのアクセス権が必要です。
- RDS SQL Serverのネイティブバックアップ/リストアコマンドを実行するユーザーアカウントには、適切な権限が付与されている必要があります。
まとめ
本記事では、クラウド上の保存先へデータベースをバックアップし、AWS RDSインスタンス上で復元する方法を紹介しました。RDSインスタンスではドライブやサーバーへの直接アクセスができないため、ポイントはバックアップファイルを一度AWS S3バケットへ転送し、そこから復元することにあります。
もう一つの活用例として、SQLバックアップを直接AWS S3に保存する運用もあります。これにより、データの可用性・セキュリティ・パフォーマンスが向上します。Amazon S3は99.999999999%(イレブンナイン)の耐久性を持つよう設計されており、ハードウェアストレージを大幅に削減できるため、データベースバックアップの保存コスト面でも大きなメリットがあります。
コメントやご質問がある場合は、フィードバックタブをご利用ください。
専門家による管理・運用・構成で環境を最適化
RackspaceのApplication Services (RAS)の専門家は、幅広いアプリケーションポートフォリオにわたって、以下のプロフェッショナルサービスおよびマネージドサービスを提供しています。
- eコマースおよびデジタルエクスペリエンスプラットフォーム
- 企業資源計画(ERP)
- ビジネスインテリジェンス
- Salesforce顧客関係管理(CRM)
- データベース
- メールホスティングおよび生産性向上ソリューション
私たちがお約束するのは次の4つです。
- 偏りのない専門性:即座に価値をもたらす機能に焦点を当て、モダナイゼーションの道のりをシンプルにガイドします。
- Fanatical Experience™:「Process first. Technology second.®」のアプローチと専任テクニカルサポートを組み合わせ、包括的なソリューションを提供します。
- 比類ないポートフォリオ:豊富なクラウド経験を活かし、適切なクラウド上に適切なテクノロジーを選定・導入するお手伝いをします。
- アジャイルな提供体制:お客様の現在地に合わせて伴走し、私たちの成功をお客様の成功と一致させます。
データベースサービスについて詳しくはこちらをご覧ください。
コメントやご質問がある場合は、フィードバックタブをご利用ください。また、私たちとの対話もぜひ始めてみてください。
-
AWS RDSでSQL Serverネイティブデータベースをバックアップ・復元・監視する方法
データベースのバックアップとは、データベースの稼働状態、構成、保存データ一式を退避することです。バックアップがあれば、プライマリデータベースがクラッシュ・破損・消失した場合でも、複製インスタンスやコピーを作成して迅速に復旧できます。 本記事では、Amazon Web Services(AWS)Relational Database Service(RDS)におけるSQL Serverネイティブデータベースのバックアップ、復元、監視の方法を解説します。 AWS RDSでのSQLネイティブフルバックアップ AWS RDSでは、SQL Serverネイティブデータベースに対して実行できるのはフルバッ
-
MS Access から SQL Server へデータを移行する方法【初心者向け手順解説】
データベースのサイズが大きくなりすぎてAccessでは管理しきれなくなったため、筆者は最近AccessデータベースからSQL Server 2014へデータを移行しました。作業自体はそれほど難しくありませんが、同じことで悩む方のために、ステップごとの詳しい手順を記事としてまとめておきます。 事前準備:SQL Serverのインストール まず最初に、お使いのパソコンにSQL ServerまたはSQL Server Expressがインストールされていることを確認してください。個人用PCにSQL Server Expressをダウンロードする場合は、必ずAdvanced Services(高度なサ