ApsaraDB RDS for SQL Serverインスタンスを使用すると、データをクラウドに簡単に移行できます。 自己管理型SQL Serverインスタンスのソースデータベースの完全バックアップデータをObject Storage Service (OSS) バケットにアップロードし、ApsaraDB RDSコンソールを使用して、完全バックアップデータをApsaraDB RDS for SQL Serverインスタンスのターゲットデータベースに移行するだけで済みます。 Microsoftのバックアップ機能は、ApsaraDB RDS for SQL Serverと互換性があります。 この機能は、データのバックアップ、移行、ディザスタリカバリなどのシナリオで使用できます。
前提条件
RDSインスタンスは、ローカルディスクでSQL Server 2008 R2を実行します。
説明 クラウドディスクでSQL Server 2008 R2を実行するRDSインスタンスは廃止されました。
ターゲットデータベースはRDSインスタンスに作成され、自己管理型SQL Serverインスタンスのソースデータベースと同じ名前になります。 詳細については、「アカウントとデータベースの作成」をご参照ください。
RAMユーザーを使用する場合は、次の要件が満たされていることを確認してください。
AliyunOSSFullAccessおよびAliyunRDSFullAccessポリシーはRAMユーザーにアタッチされます。 RAMユーザーに権限を付与する方法の詳細については、「RAMを使用してOSS権限を管理する」および「RAMを使用してApsaraDB RDS権限を管理する」をご参照ください。
ApsaraDB RDSのサービスアカウントは、Alibaba Cloudアカウントを使用してOSSバケットにアクセスすることで承認されます。
カスタムポリシーは、Alibaba Cloudアカウントを使用して手動で作成され、RAMユーザーにアタッチされます。 カスタムポリシーの作成方法の詳細については、「カスタムポリシーの作成」の「JSONタブでカスタムポリシーを作成する」をご参照ください。
カスタムポリシーには次のコンテンツを使用する必要があります。
{
"Version": "1",
"Statement": [
{
"Action": [
"ram:GetRole"
],
"リソース": "acs:ram:*:*:role/AliyunRDSImportRole" 、
"Effect": "Allow"
}
]
}
課金
このトピックで説明されている方法を使用してデータを移行する場合、OSSバケットの使用に対してのみ課金されます。
シナリオ | 課金ルール |
OSSバケットへのバックアップファイルのアップロード | 無料です。 |
OSSバケットにバックアップファイルを保存する | ストレージ料金が請求されます。 詳細については、料金をご覧ください。 OSSのページにアクセスします。 |
OSSバケットからRDSインスタンスへのバックアップファイルの移行 | |
手順1: 自己管理型インスタンスのソースデータベースのバックアップ
Microsoft SQL Server Management Studio (SSMS) クライアントを起動します。
ソースデータベースにログインします。
次のステートメントを実行して、復旧モデルを確認します。
使用マスター;
GO
SELECT名、CASE recovery_model
1が「FULL」のとき
2が「BULK_LOGGED」のとき
3 THEN 'SIMPLE' ENDモデルFROM sys.databases
WHERE名NOT IN ('master' 、'tempdb' 、'model' 、'msdb');
GO
次のステートメントを実行して、復旧モデルをFULL
に設定します。
ALTER DATABASE [dbname] SET RECOVERY FULL;
行く
ALTER DATABASE [dbname] SET AUTO_CLOSE OFF;
行く
重要 復旧モデルをFULL
に設定すると、さらに多くのログが生成されます。 ディスク容量が十分であることを確認してください。
次のステートメントを実行して、ソースデータベースをバックアップします。 この例では、dbtestデータベースはbackup.bakファイルにバックアップされます。
使用マスター;
GO
バックアップデータベース [dbtest] to disk ='d:\BACKUP \backup.bak' 圧縮、INIT;
GO
次のステートメントを実行して、バックアップファイルの整合性を確認します。
USEマスター
GO
RESTORE FILELISTONLY
FROM DISK = N'D:\backup\backup.bak';
オプションです。 次のステートメントを実行して、データベースの復旧モデルを復元します。
重要 データベースの復旧モデルがFULL
の場合は、この手順をスキップしてください。
ALTER DATABASE [dbname] セット回復シンプル;
GO
手順2: ソースデータベースのバックアップファイルをOSSバケットにアップロード
重要 OSSバケットが作成されている場合は、バケットが次の要件を満たしているかどうかを確認します。
OSSバケットを作成します。
OSSコンソールにログインします。
左側のナビゲーションウィンドウで、[バケット] をクリックします。 [バケット] ページで、[バケットの作成] をクリックします。
次のパラメーターを設定します。 他のパラメーターのデフォルト値を保持します。
パラメーター | 説明 | 例 |
バケット名 | OSS バケットの名前。 名前はグローバルに一意であり、設定後に変更することはできません。 命名規則: 名前には、小文字、数字、およびハイフン (-) を使用できます。 先頭と末尾は小文字または数字である必要があります。 名前の長さは 3 ~ 63 文字である必要があります。
| migratetest |
リージョン | OSS バケットの名前です。 内部ネットワークを介してElastic Compute Service (ECS) インスタンスからOSSバケットにデータをアップロードし、内部ネットワークを介してRDSインスタンスにデータを復元する場合は、OSSバケット、ECSインスタンス、およびRDSインスタンスが同じリージョンにあることを確認してください。 | 中国 (杭州) |
ストレージクラス | バケットのストレージクラス。 [標準] を選択します。 このトピックで説明するクラウド移行操作は、他のストレージクラスのバケットでは実行できません。 | 標準 |
バックアップファイルをOSSバケットにアップロードします。
説明 RDSインスタンスとOSSバケットが同じリージョンにある場合、内部ネットワークを介して相互に通信できます。 内部ネットワークを使用してバックアップデータをアップロードできます。 この方法は高速で、インターネットトラフィックの料金は発生しません。 ターゲットRDSインスタンスと同じリージョンにあるOSSバケットにバックアップファイルをアップロードすることを推奨します。
自己管理型SQL Serverインスタンスの完全バックアップが完了したら、次のいずれかの方法を使用して、生成された完全バックアップファイルをOSSバケットにアップロードする必要があります。
方法1: ossbrowserツールを使用する (推奨)
ossbrowserのダウンロード。 詳細については、「ossbrowserへのインストールとログイン」をご参照ください。
ダウンロードしたoss-browser-win32-x64.zip
のパッケージを64ビットWindowsオペレーティングシステムで解凍します。 次に、oss-browser.exe
をダブルクリックしてプログラムを実行します。 例として、64ビットWindowsオペレーティングシステムを使用します。
[AKログイン] タブで、[AccessKeyId] および [AccessKeySecret] パラメーターを設定し、他のパラメーターのデフォルト値を保持し、[ログイン] をクリックします。
説明 AccessKeyペアは、Alibaba CloudアカウントのIDを確認し、データセキュリティを確保するために使用されます。 AccessKeyペアの機密を保持することを推奨します。 AccessKeyペアを作成および取得する方法の詳細については、「AccessKeyペアの作成」をご参照ください。
OSSバケットの名前をクリックします。
アイコンをクリックしてアップロードするバックアップファイルを選択し、[開く] をクリックしてバックアップファイルをOSSバケットにアップロードします。
方法 2: OSS コンソールを使用する
説明 バックアップファイルのサイズが5 GB未満の場合は、OSSコンソールでバックアップファイルをアップロードすることを推奨します。
OSS コンソールにログインします。
左側のナビゲーションウィンドウで、[バケット] をクリックします。 [バケット] ページで、バケットポリシーを設定するバケットの名前をクリックします。
[オブジェクト] ページで、[オブジェクトのアップロード] をクリックします。
バックアップファイルを [アップロードするファイル] セクションにドラッグするか、[ファイルの選択] をクリックしてアップロードするバックアップファイルを選択します。
ページの下部で、[オブジェクトのアップロード] をクリックして、バックアップファイルをOSSバケットにアップロードします。
方法3: OSS APIを呼び出す
説明 バックアップファイルのサイズが5 GBを超える場合は、OSS APIを呼び出して、マルチパートアップロードを使用してバックアップファイルをOSSバケットにアップロードすることを推奨します。
この例では、Javaプロジェクトを使用して、環境変数からアクセス資格情報を取得する方法を説明します。 サンプルコードを実行する前に、環境変数が設定されていることを確認してください。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。 サンプルコードの詳細については、「マルチパートアップロード」をご参照ください。
com.aliyun.oss.ClientExceptionをインポートします。com.aliyun.oss.OSSをインポートします。impor t com.aliyun.oss.com mon.auth.*;
com.aliyun.oss.OSSClientBuilderをインポートします。com.aliyun.oss.OSSExceptionをインポートします。com.aliyun.oss.int ernal.Mimetypesをインポートします。com.aliyun.oss.mo delをインポートします。*;
java.io. ファイルをインポートします。java.io.FileInputStreamをインポートします。java.io.InputStreamをインポートします。java.util.ArrayListをインポートします。java.util.Listをインポートします。public classデモ {
public static void main(String[] args) throws Exception {
// この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケットの名前を指定します。 例: examplebucket.
String bucketName = "examplebucket";
// オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。
文字列objectName = "exampledir/exampleobject.txt";
// アップロードするローカルファイルのパスを指定します。
String filePath = "D :\\ localpath\\examplefile.txt";
// Create an OSSClient instance.
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
// InitiateMultipartUploadRequestオブジェクトを作成します。
InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName);
// 次のコードは、マルチパートアップロードタスクを開始するときにリクエストヘッダーを指定する方法の例を示しています。
ObjectMetadata metadata = new ObjectMetadata();
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// オブジェクトのwebページのキャッシュ動作を指定します。
// metadata.setCacheControl("no-cache");
// ダウンロードしたオブジェクトの名前を指定します。
// metadata.setContentDisposition("attachment;filename=oss_MultipartUpload.txt");
// オブジェクトのコンテンツのエンコード形式を指定します。
// metadata.setContentEncoding(OSSConstants.DEFAULT_CHARSET_NAME);
// マルチパートアップロードタスクの開始時に、既存のオブジェクトが同じ名前のオブジェクトで上書きされるかどうかを指定します。 この例では、x-oss-forbid-overwriteパラメーターはtrueに設定されています。 この値は、既存のオブジェクトを同じ名前のオブジェクトで上書きできないことを示します。
// metadata.setHeader("x-oss-forbid-overwrite", "true");
// アップロードするオブジェクトの各部分の暗号化に使用するサーバー側の暗号化方法を指定します。
// metadata.setHeader(OSSHeaders.OSS_SERVER_SIDE_ENCRYPTION, ObjectMetadata.KMS_SERVER_SIDE_ENCRYPTION);
// オブジェクトの暗号化に使用するアルゴリズムを指定します。 このパラメーターを設定しない場合、AES-256はオブジェクトの暗号化に使用されます。
// metadata.setHeader(OSSHeaders.OSS_SERVER_SIDE_DATA_ENCRYPTION, ObjectMetadata.KMS_SERVER_SIDE_ENCRYPTION);
// key Management Service (KMS) が管理するカスタマーマスターキー (CMK) のIDを指定します。
// metadata.setHeader(OSSHeaders.OSS_SERVER_SIDE_ENCRYPTION_KEY_ID、"9468da86-3509-4f8d-a61e-6eab1eac ****");
// オブジェクトのストレージクラスを指定します。
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS、StorageClass.Standard);
// オブジェクトのタグを指定します。 オブジェクトに対して一度に複数のタグを指定できます。
// metadata.setHeader(OSSHeaders.OSS_TAGGING, "a:1");
// request.setObjectMetadata (メタデータ);
// オブジェクトタイプに基づいてContentTypeを指定します。 このパラメーターを指定しない場合、ContentTypeフィールドのデフォルト値はapplication/oct-srreamです。
if (metadata.getContentType() == null) {
metadata.setContentType(Mimetypes.getInstance().getMimetype(new File(filePath), objectName));
}
// マルチパートアップロードタスクを初期化します。
InitiateMultipartUploadResult upresult = ossClient.initiateMultipartUpload(request);
// アップロードIDを取得します。
String uploadId = upresult.getUploadId();
// マルチパートアップロードタスクをキャンセルするか、アップロードIDに基づいてアップロードされたパーツをリストします。
// アップロードIDに基づいてマルチパートアップロードタスクをキャンセルする場合は、InitiateMultipartUpload操作を呼び出してマルチパートアップロードタスクを開始した後にアップロードIDを取得します。
// アップロードIDに基づいてマルチパートアップロードタスクでアップロードされたパーツを一覧表示する場合は、InitiateMultipartUpload操作を呼び出してマルチパートアップロードタスクを開始した後、CompleteMultipartUpload操作を呼び出してマルチパートアップロードタスクを完了する前に、アップロードIDを取得します。
// System.out.println(uploadId);
// partETagsはPartETagsのセットです。 PartETagは、アップロードされたパーツのパーツ番号とETagで構成されます。
List<PartETag> partETags = new ArrayList<PartETag>();
// 各パーツのサイズを指定します。 部品サイズは、オブジェクトの部品数を計算するために使用されます。 単位:バイト
final long partSize = 1*1024 * 1024L; // パーツサイズを1 MBに設定します。
// アップロードされたデータのサイズに基づいて部品数を計算します。 次のコードでは、ローカルファイルを例として使用して、file. length() メソッドを使用してアップロードされたデータのサイズを取得する方法を示します。
final File sampleFile=新しいファイル (filePath);
long fileLength = sampleFile.length();
int partCount = (int) (fileLength / partSize);
if (fileLength % partSize != 0) {
partCount++;
}
// すべてのパーツがアップロードされるまで、各パーツをアップロードします。
for (int i = 0; i <recordCount; i ++ ) {
long startPos = i * partSize;
long curPartSize = (i + 1 == partCount) ? (fileLength - startPos) : partSize;
UploadPartRequest uploadPartRequest = new UploadPartRequest();
uploadPartRequest.setBucketName(bucketName);
uploadPartRequest.setKey(objectName);
uploadPartRequest.setUploadId(uploadId);
// マルチパートアップロードタスクの入力ストリームを指定します。
// 次のコードでは、ローカルファイルを例として使用して、FIleInputstreamを作成し、InputStream.skip() メソッドを使用して指定されたデータをスキップする方法を示します。
InputStream instream = new FileInputStream(sampleFile);
instream.skip(startPos);
uploadPartRequest.setInputStream(instream);
// Configure the size available for each part. 最後の部分を除く各部分は100 KB以上でなければなりません。
uploadPartRequest.setPartSize(curPartSize);
// 部品番号を指定します。 各部品は、1〜10000の範囲の部品番号を有する。 指定した数値が範囲内にない場合、OSSはInvalidArgumentエラーコードを返します。
uploadPartRequest.setPartNumber( i + 1);
// 部品は順番にアップロードされません。 パーツは、さまざまなOSSクライアントからアップロードできます。 OSSは部品番号に基づいて部品をソートし、部品を結合して完全なオブジェクトを取得します。
UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);
// 部品がアップロードされると、PartETagを含む結果が返されます。 PartETagsはpartETagsに格納されます。
partETags.add(uploadPartResult.getPartETag());
}
// CompleteMultipartUploadRequestオブジェクトを作成します。
// CompleteMultipartUpload操作を呼び出すときは、すべての有効なpartETagsを指定する必要があります。 OSSがpartETagsを受信すると、OSSはすべてのパーツを1つずつ検証します。 After part verification is successful, OSS combines these parts into a complete object.
CompleteMultipartUploadRequest completeMultipartUploadRequest =
new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partETags);
// マルチパートアップロードタスクが完了したときにオブジェクトのアクセス制御リスト (ACL) を設定する方法の例を次のコードに示します。
// completeMultipartUploadRequest.setObjectACL(CannedAccessControlList.Private);
// 現在のアップロードIDを使用してアップロードされたすべてのパーツを一覧表示するかどうかを指定します。 OSS SDK For Java 3.14.0以降の場合、CompleteMultipartUploadRequestのpartETagsをnullに設定できるのは、OSSサーバーにアップロードされたすべてのパーツをリストして、パーツを完全なオブジェクトに結合する場合のみです。
// Map<String, String> headers = new HashMap<String, String>();
// リクエストでx-oss-complete-allをyesに設定した場合、現在のアップロードIDを使用してアップロードされたすべてのパーツが一覧表示され、パーツ番号でパーツが並べ替えられ、CompleteMultipartUpload操作が実行されます。
// リクエストでx-oss-complete-allをyesに設定した場合、リクエスト本文は指定できません。 リクエスト本文を指定すると、エラーが報告されます。
// headers.put("x-oss-complete-all","yes");
// completeMultipartUploadRequest.setHeaders(headers);
// マルチパートアップロードタスクを完了します。
CompleteMultipartUploadResult completeMultipartUploadResult = ossClient.completeMultipartUpload(completeMultipartUploadRequest);
System.out.println(completeMultipartUploadResult.getETag());
} catch (Exception e) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "しかし、何らかの理由でエラー応答で拒否されました。");
System.out.println("エラーメッセージ:" + oe.getErrorMessage());
System.out.println("エラーコード:" + oe.getErrorCode());
System.out.println("リクエストID:" + oe.getRequestId());
System.out.println("ホストID:" + oe.getHostId());
} catch (ClientException e) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ 「ネットワークにアクセスできないなど」;
System.out.println("エラーメッセージ:" + ce.getMessage());
} 最後に{
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
有効期間を設定し、バックアップファイルのURLを取得します。
OSSコンソールにログインします。
左側のナビゲーションウィンドウで、[バケット] をクリックします。 バックアップファイルをアップロードするバケットを見つけ、その名前をクリックします。
左側のナビゲーションウィンドウで、[オブジェクト管理] > [オブジェクト] を選択します。
バックアップファイルを選択します。
[詳細] パネルで、[有効期間 (秒)] パラメーターの値を28800に変更します。これは8時間に相当します。
重要 OSSバケットからRDSインスタンスにファイルを移行する場合は、バックアップファイルのURLが必要です。 URLの有効期間が終了すると、データ移行が失敗します。
[オブジェクトURLのコピー] をクリックします。
取得したデータバックアップファイルのURLを変更します。
デフォルトでは、URL にはファイルのインターネットエンドポイントが含まれています。 内部ネットワーク経由でデータを移行する場合は、パブリックエンドポイントをURLの内部エンドポイントに置き換える必要があります。
たとえば、バックアップファイルのURLがhttp://rdstest.oss-cn-shanghai.aliyuncs.com/testmigraterds_20170906143807_FULL.bak?Expires=15141 ****&OSSAccessKeyId=TMP ****
の場合、URLのパブリックエンドポイントoss-cn-shanghai.aliyuncs.com
を内部エンドポイントoss-cn-shanghai-internal.aliyuncs.com
に置き換える必要があります。
重要 内部エンドポイントは、ネットワークタイプとリージョンによって異なります。 詳細については、「リージョンとエンドポイント」をご参照ください。.
手順3: OSSバケットのバックアップファイルを使用してRDSインスタンスにデータを復元
[インスタンス] ページに移動します。 上部のナビゲーションバーで、RDSインスタンスが存在するリージョンを選択します。 次に、RDSインスタンスを見つけ、インスタンスのIDをクリックします。
左側のナビゲーションウィンドウで、[データベース] をクリックします。
ターゲットデータベースを見つけ、[操作] 列の [OSSからのバックアップファイルの移行] をクリックします。
インポートガイドウィザードで、画面の指示を読み、[次へ] をクリックします。
画面の指示を読み、[次へ] をクリックします。
[バックアップファイルのOSS URL] フィールドにバックアップファイルのURLを入力し、[OK] をクリックします。
説明 ローカルディスクでSQL Server 2008 R2を実行するRDSインスタンスは、完全バックアップファイルの1回限りの移行のみをサポートします。
手順4: 移行タスクのステータスの表示
左側のナビゲーションウィンドウで、[クラウドへのデータベース移行] をクリックします。 次に、移行タスクリストで移行タスクを見つけます。
重要 [タスクステータス] が [失敗] の場合、[アクション] 列の [タスクの説明] または [ファイルの詳細を表示] をクリックして原因を確認できます。 問題を修正し、前述の移行手順をもう一度繰り返します。