前提条件
RDS SQL Server实例需满足如下条件:
实例剩余空间需大于待上云的数据文件。若空间不足,请提前升级实例空间。
2012及以上版本、2008 R2云盘:需确保实例中不存在与待迁移数据库名称相同的数据库。
2008 R2高性能本地盘版本:需确保实例中已创建与待迁移数据库名称相同的数据库。
如果通过RAM用户登录,需满足以下条件:
RAM账号具备AliyunOSSFullAccess权限和AliyunRDSFullAccess权限。如何为RAM用户授权,请参见通过RAM对OSS进行权限管理和通过RAM对RDS进行权限管理。
阿里云账号(主账号)已授权RDS官方服务账号可以访问您OSS的权限。
点击展开查看授权方法
前往RDS实例详情页备份恢复页面,单击OSS备份数据恢复上云按钮。
在数据导入向导页面单击两次下一步,进入3. 数据导入步骤。
若该页面左下角显示您已授权RDS官方服务账号可以访问您OSS的权限,则表示已授权。否则表示还未授权,单击该页面的授权地址同意授权即可。

所在阿里云账号(主账号)需手动创建权限策略,然后将权限添加到RAM账号中。
点击展开查看策略内容
{
"Version": "1",
"Statement": [
{
"Action": [
"ram:GetRole"
],
"Resource": "acs:ram:*:*:role/AliyunRDSImportRole",
"Effect": "Allow"
}
]
}
注意事项
迁移级别:本方案仅支持单个数据库的迁移(数据库级)。如需迁移多个或所有数据库,请使用实例级迁移方案。
版本兼容性:备份文件所在本地SQL Server版本不支持迁移到低版本RDS SQL Server实例。
权限管理:授予RDS服务账号访问OSS权限后,系统会在访问控制RAM的角色管理中创建名为AliyunRDSImportRole
的角色,请勿修改或删除该角色,否则会导致上云任务失败。若误操作,需通过数据上云向导重新授权。
账号管理:迁移完成后,原有数据库账号无法使用,需在RDS控制台重新创建账号。
OSS文件保留:在上云任务完成前,请勿删除OSS上的备份文件,否则会导致任务失败。
备份文件要求:
文件名限制:文件名不得包含特殊字符(如!@#$%^&*()_+-=
),否则会导致上云失败。
文件后缀:RDS支持的备份文件为.bak
(全量备份)、.diff
(差异备份)、.trn
或.log
(日志备份),系统无法识别其他文件类型。
文件类型:仅支持上传全量备份文件。不支持差异备份或日志备份。
文件来源:若源数据是此前下载的RDS SQL Server全量备份文件(默认为.zip
格式),需解压为.bak
文件后再进行上云操作。
费用说明
本方案中仅会产生OSS的相关费用,详情如下图所示。

场景 | 费用说明 |
将本地数据备份文件上传至OSS | 不产生费用。 |
备份文件存储在OSS | 会产生OSS的存储费用,计费详情请参见OSS定价。 |
将备份文件从OSS迁移至RDS | |
准备工作
在本地数据库环境中执行DBCC CHECKDB
语句,以确保数据库中没有任何的allocation errors
和consistency errors
。正常执行结果如下:
...
CHECKDB found 0 allocation errors and 0 consistency errors in database 'xxx'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
1. 备份本地数据库
请根据RDS SQL Server实例版本,选择对应方案。
2012及以上版本、2008 R2云盘
说明 在对本地数据库做全量备份之前,请确保已停止写入数据。备份过程中新写入的数据将不会被备份。
下载备份脚本,用SSMS(SQL Server Management Studio)打开备份脚本。
修改脚本中SELECT语句中的如下参数,位于脚本中YOU HAVE TO INIT PUBLIC VARIABLES HERE
下。
配置项 | 说明 |
@backup_databases_list | 需要备份的数据库,多个数据库以分号(;)或者半角逗号(,)分隔。 |
@backup_type | 备份类型。参数值如下: FULL:全量备份。 DIFF:差异备份。 LOG:日志备份。
|
@backup_folder | 备份文件所在的本地目录。如不存在,会自动创建。 |
@is_run | 是否执行备份。参数值如下: |
执行备份脚本。
2008 R2高性能本地盘
打开Microsoft SQL Server Management Studio(SSMS)客户端。
登录待迁移的数据库。
执行如下命令,确认源数据库当前的恢复模式。
USE master;
GO
SELECT name, CASE recovery_model
WHEN 1 THEN 'FULL'
WHEN 2 THEN 'BULK_LOGGED'
WHEN 3 THEN 'SIMPLE' END model FROM sys.databases
WHERE name NOT IN ('master','tempdb','model','msdb');
GO
执行如下命令,将源数据库的恢复模式设置为FULL
。
ALTER DATABASE [dbname] SET RECOVERY FULL;
GO
ALTER DATABASE [dbname] SET AUTO_CLOSE OFF;
GO
重要 恢复模式设置为FULL
后,会使SQL Server的日志信息增多,请确保具备足够的硬盘空间。
执行如下命令,备份源数据库。
本案例中,将dbtest数据库备份至backup.bak文件为例演示。
USE master;
GO
BACKUP DATABASE [dbtest] to disk ='d:\backup\backup.bak' WITH COMPRESSION,INIT;
GO
执行如下命令,校验备份文件的完整性。
USE master
GO
RESTORE FILELISTONLY
FROM DISK = N'D:\backup\backup.bak';
重要 如果有结果集返回,代表备份文件有效。
如果提示错误,请重新执行备份操作。
可选:执行如下命令,还原数据库的恢复模式。
重要 如果数据库的恢复模式原本就是FULL
,无需执行本步骤。
ALTER DATABASE [dbname] SET RECOVERY SIMPLE;
GO
2. 上传备份文件到OSS
请根据RDS SQL Server实例版本,选择对应方案。
2012及以上版本、2008 R2云盘
将备份文件上传至OSS前,您需先在OSS中创建存储空间Bucket。
上传备份文件到OSS。
本地数据库备份完成后,请将备份文件上传到与您的RDS实例同地域的OSS Bucket中,两者处于同一地域时可通过内网互通(不会产生外网流量费用),且数据上传速度更快。您可以采用如下方法之一:
使用ossbrowser工具上传(推荐)
下载ossbrowser。
以Windows x64操作系统为例,解压下载的oss-browser-win32-x64.zip
压缩包,双击运行oss-browser.exe
应用程序。
使用AK登录方式,配置参数AccessKeyId和AccessKeySecret,其他参数保持默认,然后单击登入。

单击目标Bucket,进入存储空间。
单击
,选择需要上传的备份文件,然后单击打开,即可将本地文件上传至OSS中。
使用OSS控制台上传
说明 如果备份文件小于5 GB,建议您直接通过OSS控制台上传备份文件。
登录OSS管理控制台。
单击Bucket列表,然后单击目标Bucket名称。
在文件列表中,单击上传文件。
您可以将备份文件拖拽至待上传文件区域,也可以单击扫描文件,选择需要上传的备份文件。
单击页面下方的上传文件,即可将本地备份文件上传至OSS中。
使用OSS API分片上传
说明 如果备份文件大于5 GB,建议您调用OSS API采用分片上传的方式将备份文件上传到OSS Bucket中。
本示例以Java项目为例,从环境变量中获取访问凭证代码。运行本代码示例之前,请先配置环境变量。更多示例,请参见分片上传。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.internal.Mimetypes;
import com.aliyun.oss.model.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填写Bucket名称,例如examplebucket。
String bucketName = "examplebucket";
// 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
String objectName = "exampledir/exampleobject.txt";
// 待上传本地文件路径。
String filePath = "D:\\localpath\\examplefile.txt";
// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。
String region = "cn-hangzhou";
// 创建OSSClient实例。
// 当OSSClient实例不再使用时,调用shutdown方法以释放资源。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 创建InitiateMultipartUploadRequest对象。
InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName);
// 创建ObjectMetadata并设置Content-Type。
ObjectMetadata metadata = new ObjectMetadata();
if (metadata.getContentType() == null) {
metadata.setContentType(Mimetypes.getInstance().getMimetype(new File(filePath), objectName));
}
System.out.println("Content-Type: " + metadata.getContentType());
// 将metadata绑定到上传请求中。
request.setObjectMetadata(metadata);
// 初始化分片。
InitiateMultipartUploadResult upresult = ossClient.initiateMultipartUpload(request);
// 返回uploadId。
String uploadId = upresult.getUploadId();
// partETags是PartETag的集合。PartETag由分片的ETag和分片号组成。
List<PartETag> partETags = new ArrayList<PartETag>();
// 每个分片的大小,用于计算文件有多少个分片。单位为字节。
// 分片最小值为100 KB,最大值为5 GB。最后一个分片的大小允许小于100 KB。
// 设置分片大小为 1 MB。
final long partSize = 1 * 1024 * 1024L;
// 根据上传的数据大小计算分片数。以本地文件为例,说明如何通过File.length()获取上传数据的大小。
final File sampleFile = new File(filePath);
long fileLength = sampleFile.length();
int partCount = (int) (fileLength / partSize);
if (fileLength % partSize != 0) {
partCount++;
}
// 遍历分片上传。
for (int i = 0; i < partCount; 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);
// 设置分片大小。
uploadPartRequest.setPartSize(curPartSize);
// 设置分片号。每一个上传的分片都有一个分片号,取值范围是1~10000,如果超出此范围,OSS将返回InvalidArgument错误码。
uploadPartRequest.setPartNumber(i + 1);
// 每个分片不需要按顺序上传,甚至可以在不同客户端上传,OSS会按照分片号排序组成完整的文件。
UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);
// 每次上传分片之后,OSS的返回结果包含PartETag。PartETag将被保存在partETags中。
partETags.add(uploadPartResult.getPartETag());
// 关闭流
instream.close();
}
// 创建CompleteMultipartUploadRequest对象。
// 在执行完成分片上传操作时,需要提供所有有效的partETags。OSS收到提交的partETags后,会逐一验证每个分片的有效性。当所有的数据分片验证通过后,OSS将把这些分片组合成一个完整的文件。
CompleteMultipartUploadRequest completeMultipartUploadRequest =
new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partETags);
// 完成分片上传。
CompleteMultipartUploadResult completeMultipartUploadResult = ossClient.completeMultipartUpload(completeMultipartUploadRequest);
System.out.println("上传成功,ETag:" + completeMultipartUploadResult.getETag());
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught a ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
2008 R2高性能本地盘
将备份文件上传至OSS前,您需先在OSS中创建存储空间Bucket。
上传备份文件到OSS。
本地数据库备份完成后,请将备份文件上传到与您的RDS实例同地域的OSS Bucket中,两者处于同一地域时可通过内网互通(不会产生外网流量费用),且数据上传速度更快。您可以采用如下方法之一:
使用ossbrowser工具上传(推荐)
下载ossbrowser。
以Windows x64操作系统为例,解压下载的oss-browser-win32-x64.zip
压缩包,双击运行oss-browser.exe
应用程序。
使用AK登录方式,配置参数AccessKeyId和AccessKeySecret,其他参数保持默认,然后单击登入。

单击目标Bucket,进入存储空间。
单击
,选择需要上传的备份文件,然后单击打开,即可将本地文件上传至OSS中。
使用OSS控制台上传
说明 如果备份文件小于5 GB,建议您直接通过OSS控制台上传备份文件。
登录OSS管理控制台。
单击Bucket列表,然后单击目标Bucket名称。
在文件列表中,单击上传文件。
您可以将备份文件拖拽至待上传文件区域,也可以单击扫描文件,选择需要上传的备份文件。
单击页面下方的上传文件,即可将本地备份文件上传至OSS中。
使用OSS API分片上传
说明 如果备份文件大于5 GB,建议您调用OSS API采用分片上传的方式将备份文件上传到OSS Bucket中。
本示例以Java项目为例,从环境变量中获取访问凭证代码。运行本代码示例之前,请先配置环境变量。更多示例,请参见分片上传。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.internal.Mimetypes;
import com.aliyun.oss.model.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填写Bucket名称,例如examplebucket。
String bucketName = "examplebucket";
// 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
String objectName = "exampledir/exampleobject.txt";
// 待上传本地文件路径。
String filePath = "D:\\localpath\\examplefile.txt";
// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。
String region = "cn-hangzhou";
// 创建OSSClient实例。
// 当OSSClient实例不再使用时,调用shutdown方法以释放资源。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 创建InitiateMultipartUploadRequest对象。
InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName);
// 创建ObjectMetadata并设置Content-Type。
ObjectMetadata metadata = new ObjectMetadata();
if (metadata.getContentType() == null) {
metadata.setContentType(Mimetypes.getInstance().getMimetype(new File(filePath), objectName));
}
System.out.println("Content-Type: " + metadata.getContentType());
// 将metadata绑定到上传请求中。
request.setObjectMetadata(metadata);
// 初始化分片。
InitiateMultipartUploadResult upresult = ossClient.initiateMultipartUpload(request);
// 返回uploadId。
String uploadId = upresult.getUploadId();
// partETags是PartETag的集合。PartETag由分片的ETag和分片号组成。
List<PartETag> partETags = new ArrayList<PartETag>();
// 每个分片的大小,用于计算文件有多少个分片。单位为字节。
// 分片最小值为100 KB,最大值为5 GB。最后一个分片的大小允许小于100 KB。
// 设置分片大小为 1 MB。
final long partSize = 1 * 1024 * 1024L;
// 根据上传的数据大小计算分片数。以本地文件为例,说明如何通过File.length()获取上传数据的大小。
final File sampleFile = new File(filePath);
long fileLength = sampleFile.length();
int partCount = (int) (fileLength / partSize);
if (fileLength % partSize != 0) {
partCount++;
}
// 遍历分片上传。
for (int i = 0; i < partCount; 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);
// 设置分片大小。
uploadPartRequest.setPartSize(curPartSize);
// 设置分片号。每一个上传的分片都有一个分片号,取值范围是1~10000,如果超出此范围,OSS将返回InvalidArgument错误码。
uploadPartRequest.setPartNumber(i + 1);
// 每个分片不需要按顺序上传,甚至可以在不同客户端上传,OSS会按照分片号排序组成完整的文件。
UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);
// 每次上传分片之后,OSS的返回结果包含PartETag。PartETag将被保存在partETags中。
partETags.add(uploadPartResult.getPartETag());
// 关闭流
instream.close();
}
// 创建CompleteMultipartUploadRequest对象。
// 在执行完成分片上传操作时,需要提供所有有效的partETags。OSS收到提交的partETags后,会逐一验证每个分片的有效性。当所有的数据分片验证通过后,OSS将把这些分片组合成一个完整的文件。
CompleteMultipartUploadRequest completeMultipartUploadRequest =
new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partETags);
// 完成分片上传。
CompleteMultipartUploadResult completeMultipartUploadResult = ossClient.completeMultipartUpload(completeMultipartUploadRequest);
System.out.println("上传成功,ETag:" + completeMultipartUploadResult.getETag());
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught a ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
设置备份文件的链接有效时间,并获取文件的链接地址。
登录OSS 管理控制台。
单击Bucket 列表,然后单击目标Bucket名称。
在左侧导航栏,选择文件管理 > 文件列表。
单击目标数据库备份文件操作列的详情,在弹出面板中,将过期时间 (秒)修改为28800秒,即8小时。
重要 将备份文件从OSS迁移至RDS时,需要使用备份文件的链接地址,如果超过了链接有效时间,将导致数据迁移失败。
单击复制文件URL,获取文件的链接地址。

修改获取到的数据备份文件链接地址。
默认获取的是文件的外网连接地址,如需通过内网迁移数据,您需要将文件链接地址中的Endpoint改成内网Endpoint。
例如,备份文件的链接地址为http://rdstest.oss-cn-shanghai.aliyuncs.com/testmigraterds_20170906143807_FULL.bak?Expires=15141****&OSSAccessKeyId=TMP****
,您需要将链接地址中的oss-cn-shanghai.aliyuncs.com
修改为oss-cn-shanghai-internal.aliyuncs.com
。
重要 不同的网络类型、不同地域所对应的内网Endpoint不同。具体详情,请参见访问域名和数据中心。
3. OSS备份数据导入RDS
请根据RDS SQL Server实例版本,选择对应方案。
2012及以上版本、2008 R2云盘
访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
在左侧菜单栏中选择备份恢复。
单击页面上方的OSS备份数据恢复上云。
在数据导入向导页面,单击两次下一步,进入数据导入步骤。
设置如下参数。
配置项 | 说明 |
数据库名 | 备份数据导入目标RDS实例上的数据库名,名称需要符合SQL Server官方限制。 |
OSS Bucket | 选择备份文件所在的OSS Bucket。 |
OSS子文件夹名 | 备份文件所在的子文件夹名。 |
OSS文件列表 | 单击右侧 按钮,可以按照备份文件名前缀模糊查找,会展示文件名、文件大小和更新时间。请选择需要上云的备份文件。 |
上云方案 | 打开数据库(只有一个全量备份文件):全量上云,适合仅有一个完全备份文件上云的场景。本操作选择打开数据库,此时CreateMigrateTask中的BackupMode = FULL 并且IsOnlineDB = True 。 不打开数据库(还有差异备份或日志文件):增量上云,适合有完全备份文件加上日志备份(或者差异备份文件)上云的场景,此时CreateMigrateTask中的BackupMode = UPDF 并且IsOnlineDB = False 。
|
一致性检查方式 | 异步执行DBCC:在打开数据库时系统不做DBCC CheckDB,而是在打开数据库任务结束以后,异步执行DBCC CheckDB操作,以此节约打开数据库操作的时间开销(数据库比较大,DBCC CheckDB非常耗时),减少您的业务停机时间。如果您对业务停机时间要求非常敏感,且不关心DBCC CheckDB结果,建议使用异步执行DBCC。此时CreateMigrateTask 中的CheckDBMode = AsyncExecuteDBCheck 。 同步执行DBCC:相对于异步执行DBCC,有的用户非常关心DBCC CheckDB的结果,以此来找出用户线下数据库数据一致性错误。此时,建议您选择同步执行DBCC,影响是会拉长打开数据库的时间。此时CreateMigrateTask 中的CheckDBMode = SyncExecuteDBCheck 。
|
单击确定。
请耐心等待上云任务完成,您可以单击刷新以查看任务的最新状态。如上云任务失败,请根据任务描述提示排查错误,具体可参见本文常见错误。
说明 数据上云完成后,系统会根据RDS实例的自动备份策略在指定的备份时间(该时间可手动调整)发起备份,生成的备份集将包含已上云的数据,您可以在RDS实例详情页的备份恢复页面查看。
如果尚未到达备份时间点,但您急需在云上生成备份,也可以选择进行手动备份。
2008 R2高性能本地盘
访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
在左侧导航栏,单击数据库管理。
找到目标数据库,单击操作列的从OSS上的备份文件迁入。
在数据导入向导对话框中,阅读提示内容,单击下一步。
阅读OSS上传的相关提示内容,单击下一步。
在备份文件OSS URL栏中填写备份文件在OSS的链接地址,单击确定。

说明 RDS SQL Server 2008 R2高性能本地盘实例当前仅支持将全量备份文件一次性迁入云上的方案。
4. 查看备份上云进度
请根据RDS SQL Server实例版本,选择对应方案。
2012及以上版本、2008 R2云盘
访问RDS实例左侧导航栏备份恢复页面,在备份数据上云记录页签内查看备份上云记录,包括任务状态、任务开始和结束时间等。默认展示最近一周的记录,可按需调整时间区间。

说明 任务状态为失败时,请查看任务描述或单击目标迁移任务后面的查看文件详情,确认任务失败的原因并修复,然后重新执行数据迁移。
2008 R2高性能本地盘
访问RDS实例左侧导航栏数据上云页面,然后找到目标迁移任务来查看数据迁移的进度。
说明 任务状态为失败时,请查看任务描述或单击目标迁移任务后面的查看文件详情,确认任务失败的原因并修复,然后重新执行数据迁移。
常见错误
每条备份上云恢复记录中都会有任务描述信息,您可以通过这些描述信息发现任务失败或报错的原因。常见的错误信息如下:
同名数据库已经存在
错误信息1:The database (xxx) is already exist on RDS, please backup and drop it, then try again.
错误信息2:Database 'xxx' already exists. Choose a different database name.
错误原因:为了保证RDS SQL Server上数据的安全性,RDS SQL Server不支持同名数据库的上云操作。
解决方法:如果您确实需要对现有数据库的数据进行覆盖,请先自行备份已经存在的数据,然后删除数据库,最后再重新执行数据上云任务。
使用差异备份文件
错误信息:Backup set (xxx.bak) is a Database Differential backup, we only accept a FULL Backup.
错误原因:您提供的备份文件是差异备份,不是全量备份文件,一次性全量迁入上云仅支持全量备份文件,不支持差异备份。
使用日志备份文件
错误信息:Backup set (xxx.trn) is a Transaction Log backup, we only accept a FULL Backup.
错误原因:您提供的备份文件是日志备份,不是全量备份文件,一次性全量迁入上云仅支持全量备份文件,不支持日志备份。
备份文件校验失败
错误信息:Failed to verify xxx.bak, backup file was corrupted or newer edition than RDS.
错误原因:备份文件损坏或者备份文件所在的本地环境SQL Server实例版本比RDS SQL Server版本高,导致校验失败。例如将一个SQL Server 2016的备份还原到RDS SQL Server 2012版本,就会报告这个错误。
解决方法:如果是备份文件损坏,请在本地环境重新做一个全量备份,重新生成迁移上云任务;如果是版本过高,请使用与本地环境版本一致或者更高的RDS SQL Server。
说明 如需将已有RDS SQL Server实例升级到更高版本,请参见升级数据库版本。
DBCC CHECKDB失败
错误信息:DBCC checkdb failed.
错误原因:DBCC CheckDB检查操作报错,说明数据库在本地环境中已经发生错误。
解决方法:使用如下命令修复本地环境数据库错误后重新上云。
重要 使用该命令修复错误的过程,可能会导致数据丢失。
DBCC CHECKDB (DBName, REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS, ALL_ERRORMSGS
空间不足1
错误信息:Not Enough Disk Space for restoring, space left (xxx MB) < needed (xxx MB).
错误原因:RDS实例剩余空间不满足备份文件上云所需要的最小空间要求。
解决方法:升级实例存储空间。
空间不足2
登录账号权限不足
错误信息:Cannot open database "xxx" requested by the login. The login failed.
错误原因:登录RDS实例的用户账号无数据库的访问权限。
解决方案:在RDS实例账号管理页面为用户账号授予数据库访问或操作权限。具体详情,请参见为账号授权和各类型账号支持的权限列表。
没有高权限账号
错误信息:Your RDS doesn’t have any init account yet, please create one and grant permissions on RDS console to this migrated database (xxx).
错误原因:RDS实例不存在高权限账号,OSS备份数据上云任务不知道需要为哪个用户授权,但是备份文件已经成功还原到目标实例上,所以任务状态是成功的。
解决方法:创建高权限账号。
RAM子账号操作权限不足
常见返回信息
任务类型 | 任务状态 | 任务描述 | 说明 |
全量备份文件一次性迁入 | 成功 | success
| 上云成功。 |
失败 | Failed to download backup file since OSS URL was expired.
| OSS下载URL有效期过期,导致上云失败。 |
Your backup is corrupted or newer than RDS, failed to verify.
| 备份文件损坏或者比RDS的版本更高,导致上云失败。 |
DBCC checkdb failed
| DBCC checkdb失败,导致上云失败。 |
autotest_2008r2_std_testmigrate_log.trn is a Transaction Log backup, we only accept a FULL Backup.
| 日志备份,导致上云失败。 |
autotest_2008r2_std_testmigrate_diff.bak is a Database Differential backup, we only accept a FULL Backup.
| 差异备份,导致上云失败。 |