SQL Server Management Studio (SSMS) を使用して、SQL Server データベースを Alibaba Cloud RDS for SQL Server に移行します。この方法では、ソースデータベースを .bacpac ファイルとしてエクスポートし、移行先の RDS インスタンスにインポートします。この例では、Azure SQL データベースをソースとして使用します。
エクスポートにはソースデータベースをオフラインにする必要があるため、この方法はメンテナンスウィンドウが許容される 1 回限りの移行に最適です。
前提条件
開始する前に、以下を確認してください。
-
RDS for SQL Server インスタンスが次のすべての要件を満たしていること。
-
RDS Basic Edition、RDS High-availability Edition、または RDS Cluster Edition で動作していること。RDS High-availability Edition で動作している場合は、SQL Server 2012 以降を使用している必要があります。
-
汎用または専用インスタンスファミリーに属していること。共有インスタンスファミリーはサポートされていません。
-
サブスクリプションまたは従量課金の課金方式を使用していること。サーバーレスインスタンスはサポートされていません。
-
仮想プライベートクラウド (VPC) 内に存在すること。ネットワークタイプを変更するには、「ネットワークタイプの変更」をご参照ください。
-
ソースデータベースよりも大きいストレージ容量を持っていること。移行先インスタンスのサイズは、ソースストレージの少なくとも 1.2 倍にしてください。現在の容量が不十分な場合は、続行する前にストレージ容量を拡張してください。
-
エディションに応じて、以下の日付以降に作成されたこと。
-
RDS High-availability Edition または RDS Cluster Edition:2021 年 1 月 1 日
-
RDS Basic Edition:2022 年 9 月 2 日
-
作成日を確認するには、ApsaraDB RDS コンソールでインスタンスの [基本情報] ページに移動し、[ステータス] セクションで [作成時間] フィールドを探します。
-
-
SSMS がインストールされていること。ローカルコンピューターまたは Elastic Compute Service (ECS) インスタンスにインストールしてください。ECS インスタンスを使用する場合は、VPC 内に存在し、Windows Server イメージを実行し、パブリック IP アドレスが割り当てられている必要があります。
このガイドの例では SSMS 19.1 を使用しています。手順は、SSMS のバージョンと設定によって異なる場合があります。
-
RDS インスタンスにシステム管理者アカウントが作成されていること。Alibaba Cloud アカウントでインスタンスにログインし、システム管理者アカウントを作成してください。
-
IP アドレスホワイトリストが RDS インスタンスに設定されており、クライアントからの接続が許可されていること。
-
内部ネットワーク経由で ECS インスタンスを接続する場合、ECS インスタンスと RDS インスタンスは同じリージョンおよび同じ VPC 内に存在する必要があります。ECS インスタンスのプライベート IP アドレスをホワイトリストに追加してください。
-
ローカルコンピューターから接続する場合は、そのパブリック IP アドレスをホワイトリストに追加してください。詳細については、「IP アドレスホワイトリストの設定」をご参照ください。
-
制限事項
移行を開始する前に、以下の制限事項を確認してください。
-
エクスポート中、ソースデータベースはオフラインである必要があります。エクスポートはデータベースのトランザクション整合性のあるスナップショットをキャプチャするため、エクスポートの実行中は書き込みを実行できません。エクスポート時間とインポート時間の両方を考慮したメンテナンスウィンドウを計画してください。エクスポート速度は、ソースインスタンスの仕様に依存します。
-
制約とビューがエクスポートの失敗を引き起こさないようにする必要があります。エクスポートする前に、ソースデータベーススキーマを検証してください。
-
データベース名が競合すると、インポートがブロックされます。移行先の RDS インスタンスに同じ名前のデータベースが既に存在する場合、インポートは失敗するか、データの不整合が発生します。
-
互換性レベルが一致している必要があります。ソースインスタンスと移行先インスタンスの両方で次のクエリを実行し、互換性を確認してください。
SELECT name, compatibility_level FROM sys.databases;詳細については、「ALTER DATABASE 互換性レベル」をご参照ください。
ソースデータベースの準備 (Azure SQL データベース)
Azure SQL データベースへのインターネットアクセスを有効にし、ECS インスタンスまたはローカルコンピューターのパブリック IP アドレスからの接続を許可するようにファイアウォールを設定してください。手順については、Azure のドキュメントをご参照いただくか、Azure サポートにお問い合わせください。
ステップ 1: Azure SQL データベースからのデータのエクスポート
エクスポートする前に、ソースデータベースへのすべての書き込みを停止してください。これにより、エクスポートされた .bacpac ファイルのトランザクション整合性が確保されます。
-
[オブジェクトエクスプローラー] で [データベース] を展開し、移行するデータベースを右クリックして、[タスク] > [データ層アプリケーションのエクスポート] を選択します。
-
導入画面で、[次へ] をクリックします。
エクスポート設定ページ
-
[設定] タブで、[ローカルディスクに保存] を選択します。
-
[参照] をクリックし、保存先を選択して、
.bacpac拡張子を付けたファイル名を入力します。 -
[詳細] タブで、エクスポートするテーブルを選択します。
トリガーやストアドプロシージャなどの他のオブジェクトをエクスポートするには、[オブジェクトエクスプローラー] でデータベースを右クリックし、[タスク] > [スクリプトの生成] を選択します。 エクスポートウィザードの詳細については、「データ層アプリケーションのエクスポート」をご参照ください。
-
[次へ] をクリックします。
-
[完了] をクリックしてエクスポートを開始します。エクスポートが完了したら、[閉じる] をクリックします。
ステップ 2: RDS インスタンスへのデータのインポート
-
SSMS を開いて、RDS インスタンスに接続します。[サーバーに接続] ダイアログボックスで、次のパラメーターを設定します。
パラメーター 値 [サーバーの種類] データベース エンジン [サーバー名] RDS インスタンスの内部エンドポイントまたはパブリックエンドポイント。エンドポイントを確認するには、「エンドポイントとポート番号の表示と変更」をご参照ください。 [認証] SQL Server 認証 [ログイン] システム管理者アカウントのユーザー名 [パスワード] システム管理者アカウントのパスワード -
[接続] をクリックします。
-
[オブジェクト エクスプローラー] で、[データベース] を右クリックし、[データ層アプリケーションのインポート] を選択します。
-
[次へ] をクリックします。
インポート設定ページ
-
[ローカルディスクからインポート] を選択します。
-
[参照] をクリックして、ソースデータベースからエクスポートされた
.bacpacファイルを選択します。 -
[次へ] をクリックします。
データベース設定ページ
-
[新しいデータベース名] に、RDS インスタンスのデータベース名を入力します。
重要ソースデータベースと同じ名前を使用してください。異なる名前を使用すると、ワークロードを RDS インスタンスに切り替えた後、アプリケーション機能が失敗する可能性があります。
-
[SQL Server 設定] セクションで、[データファイルパス] と [ログファイルパス] の両方を
E:\SQLDATA\DATAに設定します。 -
[次へ] をクリックします。
-
[完了] をクリックしてインポートを開始します。インポートが完了したら、[閉じる] をクリックします。
ステップ 3: データ整合性の検証
ソースデータベースと移行先データベースの両方で次のクエリを実行し、結果を比較してください。結果が一致すれば、整合性のある移行が確認されます。
これらのクエリを実行している間、ソースデータベースでデータの変更が発生しないようにしてください。エクスポート後の変更は、行数の差異を引き起こします。
クエリ 1:合計行数の確認
USE <database name>;
SELECT SUM(b.rows) AS 'RowCount'
FROM sysobjects AS a INNER JOIN
sysindexes AS b ON a.id = b.id
WHERE (a.type = 'u') AND (b.indid IN (0, 1))
クエリ 2:データファイルサイズの確認
USE <database name>;
SELECT a.name [File name]
,cast(a.[size]*1.0/128 as decimal(12,1)) AS [Specified file size (MB)]
,CAST( fileproperty(s.name,'SpaceUsed')/(8*16.0) AS DECIMAL(12,1)) AS [Storage occupied by the file (MB)]
,CAST( (fileproperty(s.name,'SpaceUsed')/(8*16.0))/(s.size/(8*16.0))*100.0 AS DECIMAL(12,1)) AS [Percentage of the storage occupied by the file to the total storage capacity]
,CASE WHEN A.growth =0 THEN 'Fixed file size' ELSE 'Increment at which the storage that is allocated to the file increases' end [Increase mode]
,CASE WHEN A.growth > 0 AND is_percent_growth = 0 THEN 'Fixed increment'
WHEN A.growth > 0 AND is_percent_growth = 1 THEN 'Increment represented by an integer percentage'
ELSE 'Fixed file size' END AS [Increase mode]
,CASE WHEN A.growth > 0 AND is_percent_growth = 0 THEN cast(cast(a.growth*1.0/128as decimal(12,0)) AS VARCHAR)+'MB'
WHEN A.growth > 0 AND is_percent_growth = 1 THEN cast(cast(a.growth AS decimal(12,0)) AS VARCHAR)+'%'
ELSE 'Fixed file size' end AS [Increment (% or MB)]
,a.physical_name AS [File directory]
,a.type_desc AS [File type]
FROM sys.database_files a
INNER JOIN sys.sysfiles AS s ON a.[file_id]=s.fileid
LEFT JOIN sys.dm_db_file_space_usage b ON a.[file_id]=b.[file_id]
ORDER BY a.[type]
データ整合性検証が完了したら、ワークロードを RDS for SQL Server インスタンスに切り替え、機能が期待どおりに動作するかテストできます。