SQL Server实例级别迁移上云

RDS SQL Server提供了实例级别的数据库迁移上云方案,支持将自建SQL Server的多库或所有库的全量数据迁移至阿里云RDS SQL Server。您只需先备份自建SQL Server的所有数据库,并将完整备份文件上传到OSS Bucket(存储空间)的同一文件夹中,然后执行迁移上云脚本即可。

说明

如果您的上云迁移级别为数据库,即每次只需完成一个数据库迁移上云,SQL Server提供了以下三种基于OSS的数据库上云方案:

前提条件

  • 源端数据库需为自建SQL Server。

  • 目标端RDS SQL Server实例需满足如下条件:

    • 实例版本为2008 R2、2012及以上。如需创建实例,请参见创建RDS SQL Server实例

    • 实例版本为RDS SQL Server 2008 R2时,需要在目标RDS实例中创建与待迁移数据库名称相同的数据库,并保持数据库为空。如何创建数据库,请参见创建数据库和账号

      说明

      2012及以上版本的实例,无需执行本步骤。

    • RDS SQL Server实例拥有足够的存储空间。如果空间不足,请提前升级实例空间。具体操作,请参见变更配置

  • 已开通OSS服务。具体操作,请参见开通OSS服务

  • 如果通过RAM用户登录,则必须满足以下条件:

    • RAM账号具备AliyunOSSFullAccess权限和AliyunRDSFullAccess权限。如何为RAM用户授权,请参见通过RAM对OSS进行权限管理通过RAM对RDS进行权限管理

    • 阿里云账号(主账号)已授权RDS官方服务账号可以访问您OSS的权限。

      点击展开查看授权方法

      1. 前往RDS实例详情页备份恢复页面,单击OSS备份数据恢复上云按钮。

      2. 数据导入向导页面单击两次下一步,进入3. 数据导入步骤。

        若该页面左下角显示您已授权RDS官方服务账号可以访问您OSS的权限,则表示已授权。否则表示还未授权,单击该页面的授权地址同意授权即可。

        image

    • 所在阿里云账号(主账号)需手动创建权限策略,然后将权限添加到RAM账号中。如何创建权限策略,请参见通过脚本编辑模式创建自定义权限策略

      点击展开查看策略内容

      {
          "Version": "1",
          "Statement": [
              {
                  "Action": [
                      "ram:GetRole"
                  ],
                  "Resource": "acs:ram:*:*:role/AliyunRDSImportRole",
                  "Effect": "Allow"
              }
          ]
      }

限制条件

本方案仅支持全量迁移上云,暂不支持增量迁移上云。

费用说明

本方案中仅会产生OSS的相关费用,详情如下图所示。

image

场景

费用说明

将本地数据备份文件上传至OSS

不产生费用。

备份文件存储在OSS

会产生OSS的存储费用,计费详情请参见OSS定价

将备份文件从OSS迁移至RDS

  • 通过内网迁移至RDS,不产生费用。

  • 通过外网迁移至RDS,OSS会产生外网流出流量的费用,计费详情请参见OSS定价

准备工作

  1. 安装Python2.7.18版本,详情请参见Python官网

  2. 确认Python安装成功并查看版本。

    Windows操作系统

    执行c:\Python27\python.exe -V查看Python版本,若输出内容为Python 2.7.18表示您已安装成功。

    如果提示“不是内部或外部命令”,请在Path环境变量中增加Python的安装路径和pip命令的目录。

    配置Path变量

    Mac、Linux或Unix操作系统

    执行python -V查看Python版本,若输出内容为Python 2.7.18表示您已安装成功。

  3. 选择下述方法之一,安装SDK依赖包:

    方式一:使用pip安装

    pip install aliyun-python-sdk-rds
    pip install oss2

    方式二:使用源码安装

    # 克隆OpenAPI
    git clone https://github.com/aliyun/aliyun-openapi-python-sdk.git
    # 安装阿里云SDK核心库
    cd aliyun-python-sdk-core
    python setup.py install
    # 安装阿里云RDS SDK
    cd aliyun-python-sdk-rds
    python setup.py install
    # 克隆阿里云OSS SDK
    git clone https://github.com/aliyun/aliyun-oss-python-sdk.git
    cd aliyun-oss-python-sdk
    # 安装阿里云OSS2 SDK
    python setup.py install

1. 备份自建SQL Server所有数据库

重要
  • 为保障数据一致性,在执行全量备份期间,请勿写入新的数据,请提前安排以免影响业务运行。

  • 如果您不使用备份脚本来执行备份,备份文件必须按照数据库名称_备份类型_备份时间.bak的格式来命名,例如Testdb_FULL_20180518153544.bak,否则会导致备份报错。

  1. 下载备份脚本

  2. 双击备份脚本,使用Microsoft SQL Server Management Studio(SSMS)客户端打开。SSMS的连接方法,请参见官方文档

  3. 根据业务需求,修改如下参数。

    点击展开查看示例

    SELECT
        /**
        * Databases list needed to backup, delimiter is : or ,
        * empty('') or null: means all databases excluding system database
        * example: '[testdb]: TestDR, Test, readonly'
        **/
        @backup_databases_list = N'[dtstestdata],[testdb]'
        @backup_type = N'FULL',                    -- Backup Type? FULL: FULL backup; DIFF: Differential backup; LOG: Log backup
        @backup_folder = N'C:\BACKUP'              -- Backup folder to store backup files.
        @is_run = 1                                -- Check or run? 1, run directly; 0, just check

    配置项

    说明

    @backup_databases_list

    需要备份的数据库,多个数据库以分号(;)或者半角逗号(,)分隔。

    @backup_type

    备份类型,取值如下:

    • FULL:全量备份。

    • DIFF:差异备份。

    • LOG:日志备份。

    重要

    本方案中,取值需为FULL

    @backup_folder

    备份文件所在的本地目录。如不存在,会自动创建。

    @is_run

    是否执行备份,取值:

    • 1:执行备份。

    • 0:仅执行检查,不执行备份。

  4. 运行备份脚本,数据库将备份至指定的目录中。

    备份脚本执行结果

2. 上传备份文件到OSS

重要

如果OSS中已经创建了Bucket,请检查Bucket是否满足如下要求:

  • 请确保存储备份文件的OSS Bucket存储类型为标准存储。不能是低频访问存储、归档存储、冷归档存储、深度冷归档存储。更多详情,请参见存储类型概述

  • 请确保Bucket未开启数据加密。更多详情,请参见数据加密

  1. 创建存储空间Bucket。

    1. 登录OSS管理控制台

    2. 单击Bucket列表,然后单击创建Bucket

    3. 配置如下关键参数,其他参数可以保持默认。

      重要
      • 创建的存储空间仅用于本次数据上云,且上云后不再使用,因此只需配置关键参数即可,为避免数据泄露及产生相关费用,上云完成后请及时删除。

      • 创建Bucket时请勿开启数据加密。更多详情,请参见数据加密

      参数

      说明

      取值示例

      Bucket 名称

      存储空间名称,全局唯一,设置后无法修改。

      命名规则:

      • 只能包括小写字母、数字和短划线(-)。

      • 必须以小写字母或者数字开头和结尾。

      • 长度必须在3~63字符之间。

      migratetest

      地域

      Bucket所属的地域,如果您通过ECS内网上传数据至Bucket中,且通过内网将数据恢复至RDS中,则需要三者地域保持一致。

      华东1(杭州)

      存储类型

      选择标准存储。本文上云操作不支持其他存储类型的Bucket。

      标准存储

  2. 上传备份文件到OSS。

    说明

    当RDS实例和OSS的Bucket在同一地域时,二者可以通过内网互通,且数据上传速度更快,并且不会产生外网流量费用。因此,在上传备份文件时,建议将文件上传至与目标RDS实例在同一地域的Bucket上。

    本地数据库备份完成后,需要将备份文件上传到您的OSS Bucket中,您可以采用如下方法之一:

    使用ossbrowser工具上传(推荐)

    1. 下载ossbrowser

    2. 以Windows x64操作系统为例,解压下载的oss-browser-win32-x64.zip压缩包,双击运行oss-browser.exe应用程序。

    3. 使用AK登录方式,配置参数AccessKeyIdAccessKeySecret,其他参数保持默认,然后单击登入登录ossbrowser

      说明

      AccessKey用于身份验证,确保数据安全,请妥善保管,如何创建及获取,请参见创建AccessKey

    4. 单击目标Bucket,进入存储空间。进入bucket中

    5. 单击上传图标,选择需要上传的备份文件,然后单击打开,即可将本地文件上传至OSS中。

    使用OSS控制台上传

    说明

    如果备份文件小于5 GB,建议您直接通过OSS控制台上传备份文件。

    1. 登录OSS管理控制台

    2. 单击Bucket列表,然后单击目标Bucket名称。网页进入bucket

    3. 文件列表中,单击上传文件网页上传文件

    4. 您可以将备份文件拖拽至待上传文件区域,也可以单击扫描文件,选择需要上传的备份文件。网页扫描文件

    5. 单击页面下方的上传文件,即可将本地备份文件上传至OSS中。

    使用OSS API分片上传

    说明

    如果备份文件大于5 GB,建议您调用OSS API采用分片上传的方式将备份文件上传到OSS Bucket中。

    本示例以Java项目为例,从环境变量中获取访问凭证代码。运行本代码示例之前,请先配置环境变量。如何配置访问凭证,请参见配置访问凭证。更多示例,请参见分片上传

    import com.aliyun.oss.ClientException;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.common.auth.*;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.OSSException;
    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实例。
            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 metadata = new ObjectMetadata();
                // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
                // 指定该Object的网页缓存行为。
                // metadata.setCacheControl("no-cache");
                // 指定该Object被下载时的名称。
                // metadata.setContentDisposition("attachment;filename=oss_MultipartUpload.txt");
                // 指定该Object的内容编码格式。
                // metadata.setContentEncoding(OSSConstants.DEFAULT_CHARSET_NAME);
                // 指定初始化分片上传时是否覆盖同名Object。此处设置为true,表示禁止覆盖同名Object。
                // metadata.setHeader("x-oss-forbid-overwrite", "true");
                // 指定上传该Object的每个part时使用的服务器端加密方式。
                // metadata.setHeader(OSSHeaders.OSS_SERVER_SIDE_ENCRYPTION, ObjectMetadata.KMS_SERVER_SIDE_ENCRYPTION);
                // 指定Object的加密算法。如果未指定此选项,表明Object使用AES256加密算法。
                // metadata.setHeader(OSSHeaders.OSS_SERVER_SIDE_DATA_ENCRYPTION, ObjectMetadata.KMS_SERVER_SIDE_ENCRYPTION);
                // 指定KMS托管的用户主密钥。
                // metadata.setHeader(OSSHeaders.OSS_SERVER_SIDE_ENCRYPTION_KEY_ID, "9468da86-3509-4f8d-a61e-6eab1eac****");
                // 指定Object的存储类型。
                // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard);
                // 指定Object的对象标签,可同时设置多个标签。
                // metadata.setHeader(OSSHeaders.OSS_TAGGING, "a:1");
                // request.setObjectMetadata(metadata);
    
                // 根据文件自动设置ContentType。如果不设置,ContentType默认值为application/oct-srream。
                if (metadata.getContentType() == null) {
                    metadata.setContentType(Mimetypes.getInstance().getMimetype(new File(filePath), objectName));
                }
    
                // 初始化分片。
                InitiateMultipartUploadResult upresult = ossClient.initiateMultipartUpload(request);
                // 返回uploadId。
                String uploadId = upresult.getUploadId();
                // 根据uploadId执行取消分片上传事件或者列举已上传分片的操作。
                // 如果您需要根据uploadId执行取消分片上传事件的操作,您需要在调用InitiateMultipartUpload完成初始化分片之后获取uploadId。 
                // 如果您需要根据uploadId执行列举已上传分片的操作,您需要在调用InitiateMultipartUpload完成初始化分片之后,且在调用CompleteMultipartUpload完成分片上传之前获取uploadId。
                // System.out.println(uploadId);
    
                // partETags是PartETag的集合。PartETag由分片的ETag和分片号组成。
                List<PartETag> partETags =  new ArrayList<PartETag>();
                // 每个分片的大小,用于计算文件有多少个分片。单位为字节。
                final long partSize = 1 * 1024 * 1024L;   //1 MB。
    
                // 根据上传的数据大小计算分片数。以本地文件为例,说明如何通过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);
                    // 设置分片大小。除了最后一个分片没有大小限制,其他的分片最小为100 KB。
                    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());
                }
    
    
                // 创建CompleteMultipartUploadRequest对象。
                // 在执行完成分片上传操作时,需要提供所有有效的partETags。OSS收到提交的partETags后,会逐一验证每个分片的有效性。当所有的数据分片验证通过后,OSS将把这些分片组合成一个完整的文件。
                CompleteMultipartUploadRequest completeMultipartUploadRequest =
                        new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partETags);
    
                // 如果需要在完成分片上传的同时设置文件访问权限,请参考以下示例代码。
                // completeMultipartUploadRequest.setObjectACL(CannedAccessControlList.Private);
                // 指定是否列举当前UploadId已上传的所有Part。仅在Java SDK为3.14.0及以上版本时,支持通过服务端List分片数据来合并完整文件时,将CompleteMultipartUploadRequest中的partETags设置为null。
                // Map<String, String> headers = new HashMap<String, String>();
                // 如果指定了x-oss-complete-all:yes,则OSS会列举当前UploadId已上传的所有Part,然后按照PartNumber的序号排序并执行CompleteMultipartUpload操作。
                // 如果指定了x-oss-complete-all:yes,则不允许继续指定body,否则报错。
                // headers.put("x-oss-complete-all","yes");
                // completeMultipartUploadRequest.setHeaders(headers);
    
                // 完成分片上传。
                CompleteMultipartUploadResult completeMultipartUploadResult = ossClient.completeMultipartUpload(completeMultipartUploadRequest);
                System.out.println(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 an 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();
                }
            }
        }
    }

3. 执行迁移上云脚本将数据库迁移至RDS

  1. 下载SQL Server迁移上云脚本

  2. 解压后执行如下命令,了解该脚本需要传入的参数信息。

    python ~/Downloads/RDSSQLCreateMigrateTasksBatchly.py -h

    结果如下:

    RDSSQLCreateMigrateTasksBatchly.py -k <access_key_id> -s <access_key_secret> -i <rds_instance_id> -e <oss_endpoint> -b <oss_bucket> -d <directory>

    参数说明如下:

    参数

    说明

    access_key_id

    目标RDS实例所属的阿里云账号的AccessKey ID。

    access_key_secret

    目标RDS实例所属的阿里云账号的AccessKey Secret。

    rds_instance_id

    目标RDS实例ID。

    oss_endpoint

    备份文件所属的存储空间的Endpoint地址。获取方法,请参见存储空间概览

    oss_bucket

    备份文件所属的存储空间名称。

    directory

    备份文件在OSS存储空间中的目录。如果是根目录,请传入/

  3. 执行迁移上云脚本,完成迁移任务。

    本示例以将OSS存储空间(名称为testdatabucket)的Migrationdata目录中所有满足条件的备份文件,全量迁移到RDS SQL Server实例(实例ID为rm-2zesz5774ud8s****)为例。

    python ~/Downloads/RDSSQLCreateMigrateTasksBatchly.py -k LTAIQ**** -s BMkIUhroub******** -i rm-2zesz5774ud8s**** -e oss-cn-beijing.aliyuncs.com -b testdatabucket -d Migrationdata
  4. 在RDS控制台查看迁移任务的执行进度。

    1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。

    2. 根据RDS实例的版本,选择下述操作步骤:

      RDS SQL Server 2008 R2

      单击左侧导航栏的数据上云,您可以查看到所有提交的迁移上云任务。

      说明

      可以单击右上角的刷新来查看迁移上云任务的最新状态。

      RDS SQL Server 2012及以上版本

      单击左侧导航栏的备份恢复,然后单击备份数据上云记录页签。

      说明

      默认会展示最近一周的记录,您可以选择时间范围来查看特定时间段内的上云恢复记录。

视频演示

常见错误

错误提示

原因

解决方法

HTTP Status: 404 Error:InvalidAccessKeyId.NotFound Specified access key is not found. RequestID: XXXXXXXXXXXXXXXXX

调用OpenAPI时使用的AccessKey ID不正确。

传入正确的AccessKey ID和AccessKey Secret,查看方法请参见访问密钥常见问题

HTTP Status: 400 Error:IncompleteSignature The request signature does not conform to Aliyun standards. server string to sign is:......

调用OpenAPI时使用的AccessKey Secret不正确。

RDS engine doesn't support, this is only for RDS SQL Server engine.

本方案仅支持RDS SQL Server,不支持其他引擎。

将RDS SQL Server作为迁移的目标实例。

Couldn't find specify RDS [XXX].

RDS实例ID不存在。

检查传入的RDS实例ID是否正确。

{'status': -2, 'request-id': '', 'details': "RequestError: HTTPConnectionPool(host='xxxxxxxxxxxxxxxxx', port=80): Max retries exceeded with url: /?bucketInfo= (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x10e996490>: Failed to establish a new connection: [Errno 8] nodename nor servname provided, or not known',))"}

Endpoint错误,导致连接失败。

检查传入的Endpoint是否正确,获取方法请参见存储空间概览

{'status': 404,'-id': 'xxxxxxxxx', 'details': {'HostId': 'xxxxxxxxx', 'Message': 'The specified bucket does not exist.', 'Code': 'NoSuchBucket', 'RequestId': 'xxxxxxxx', 'BucketName': 'aaaatp-test-on-ecs'}}

OSS Bucket(存储空间)不存在。

检查传入的OSS Bucket是否正确。

There is no backup file on OSS Bucket [xxxxxx] under [xxxxxxxxx] folder, check please.

OSS Bucket中对应的文件夹不存在或文件夹中没有满足条件的数据库备份文件。

检查OSS Bucket中文件夹是否存在,同时检查该文件夹中是否存在满足条件的数据库备份文件。

Warning!!!!!, [autotest_2005_ent_broken_full_dbcc_failed.bak] is not backup file, filtered.

备份文件的名称不符合规范。

如果您不使用备份脚本来执行备份,备份文件必须按照数据库名称_备份类型_备份时间.bak的格式来命名,例如Testdb_FULL_20180518153544.bak

HTTP Status: 403 Error:Forbidden.RAM The user is not authorized to operate the specified resource, or this operation does not support RAM. RequestID: xxxxx{'status': 403, 'request-id': 'xxxx', 'details': {'HostId': 'atp-test-on-ecs.oss-cn-beijing.aliyuncs.com', 'Message': 'The bucket you visit is not belong to you.', 'Code': 'AccessDenied', 'RequestId': 'xxxx'}}

子账号权限不足。

需要为子账号授予OSS和RDS的读写权限(即AliyunOSSFullAccessAliyunRDSFullAccess权限)。关于授权操作方法,请参见为RAM用户授权

OPENAPI Response Error !!!!! : HTTP Status: <Http Status Code> Error:<Error> <Description>. RequestID: 32BB6886-775E-4BB7-A054-635664****

调用OpenAPI返回了错误信息。

根据错误码和错误信息来分析具体原因,详情请参见OpenAPI错误码

OpenAPI错误码

HTTP Status Code

Error

Description

说明

403

InvalidDBName

The specified database name is not allowed.

非法的数据库名字,不允许使用系统数据库名。

403

IncorrectDBInstanceState

Current DB instance state does not support this operation.

RDS实例状态不正确。例如,实例状态为创建中

400

IncorrectDBInstanceType

Current DB instance type does not support this operation.

不支持的引擎,该功能仅支持RDS SQL Server。

400

IncorrectDBInstanceLockMode

Current DB instance lock mode does not support this operation.

数据库锁定状态不正确。

400

InvalidDBName.NotFound

Specified one or more DB name does not exist or DB status does not support.

数据库不存在。

  • RDS SQL Server 2008R2需要先创建同名数据库。

  • RDS SQL Server 2012及以上版本,要求不能存在同名的数据库。

400

IncorrectDBType

Current DB type does not support this operation.

数据库类型不支持该操作。

400

IncorrectDBState

Current DB state does not support this operation.

数据库状态不正确,例如,数据库在创建中或者正在上云任务中。

400

UploadLimitExceeded

UploadTimesQuotaExceeded: Exceeding the daily upload times of this DB.

上云次数超过限制,每个实例每个库每天不超过20次上云操作。

400

ConcurrentTaskExceeded

Concurrent task exceeding the allowed amount.

上云次数超过限制,每个实例每天上云总次数不超过500次。

400

IncorrectFileExtension

The file extension does not support.

备份文件的后缀名错误。

400

InvalidOssUrl

Specified oss url is not valid.

提供的OSS下载链接地址不可用。

400

BakFileSizeExceeded

Exceeding the allowed bak file size.

数据库备份文件超过限制,最大不超过3TB。

400

FileSizeExceeded

Exceeding the allowed file size of DB instance.

还原备份文件后将超过当前实例的存储空间。

相关API

API

描述

CreateMigrateTask

将OSS上的备份文件还原到RDS SQL Server实例,创建数据上云任务。

CreateOnlineDatabaseTask

打开RDS SQL Server备份数据上云任务的数据库。

DescribeMigrateTasks

查询RDS SQL Server实例备份数据上云任务列表。

DescribeOssDownloads

查询RDS SQL Server备份数据上云任务的文件详情。