本文档介绍如何通过全量备份文件将自建SQL Server数据库的多个库或所有库全量迁移至阿里云RDS SQL Server。

前提条件

RDS实例为如下版本:
  • RDS SQL Server集群系列(2017企业集群版)
  • RDS SQL Server高可用系列(2008 R2、2012标准版、2012企业版、2014标准版、2016标准版、2016企业版、2017标准版、2019标准版)
  • RDS SQL Server基础系列(2012企业基础版、2012Web版、2016Web版)

背景信息

RDS SQL Server为您提供了三种基于OSS的数据库上云方案:

以上三种数据库上云方案迁移的级别为数据库,即每次只能完成一个数据库迁移上云。如果SQL Server实例需要迁移的数据库数量较多,上述迁移方案将不再适用。

为解决多个数据库迁移上云问题,RDS SQL Server推出了实例级别的数据库迁移上云方案,您只需将SQL Server实例中所有数据库的完整备份文件上传到OSS Bucket(存储空间)的同一文件夹中,然后执行迁移上云脚本即可。

注意事项

  • 本方案仅支持全量迁移上云,暂不支持增量迁移上云。
  • 如果需要使用子账号执行迁移上云,请为子账号授予OSS和RDS的读写权限(即AliyunOSSFullAccessAliyunRDSFullAccess权限)。关于授权的操作方法,请参见为RAM用户授权

准备工作

  1. 安装Python2.7.10版本,详情请参见Python官网
  2. 确认Python安装成功并查看版本。
    • Windows操作系统

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

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

      配置Path变量
    • Mac、Linux或Unix操作系统

      执行python -V查看Python版本,如果输出内容为:Python 2.7.10表明您已安装成功。

  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
  4. 创建与目标RDS实例相同地域的存储空间(Bucket),详情请参见创建存储空间
    说明 如果存储空间已经存在,请跳过本步骤。
  5. 在目标RDS实例中创建与待迁移数据库名称相同的数据库,保持数据库为空。
  6. 备份自建SQL Server的所有数据库。
    警告
    • 为保障数据一致性,在执行全量备份期间,请勿写入新的数据,请提前安排以免影响业务运行。
    • 如果您不使用备份脚本来执行备份,备份文件必须按照数据库名称_备份类型_备份时间.bak的格式来命名,例如Testdb_FULL_20180518153544.bak
    1. 下载备份脚本
    2. 双击备份脚本,使用Microsoft SQL Server Management Studio(SSMS)客户端打开。
    3. 根据业务需求,修改下述参数。
      配置项 说明
      @backup_databases_list 需要备份的数据库,多个数据库以分号或者逗号分隔。
      @backup_type 备份类型,取值:
      • FULL:全量备份。
      • DIFF:差异备份。
      • LOG:日志备份。
      注意 本案例中,取值需为FULL
      @backup_folder 备份文件所在的本地目录。如不存在,会自动创建。
      @is_run 是否执行备份,取值:
      • 1:执行备份。
      • 0:仅执行检查,不执行备份。

      示例:

      python脚本配置示例
    4. 运行备份脚本,数据库将备份至指定的目录中。
      备份脚本执行结果
  7. 根据需求选择下述方法,将数据库备份文件上传到OSS的存储空间中。
    警告 请确保上传的OSS存储空间和RDS实例属于同一地域,既可以提高RDS读取备份文件效率,也可以避免无法下载备份文件导致任务失败。
    方法 说明
    使用OSS Browser工具上传 推荐使用OSS Browser工具上传备份文件到OSS,详情请参见OSS Browser
    注意 如果您的自建数据库部署在ECS实例上,且ECS实例的网络为专有网络,那么在使用OSS Browser工具登录时,请用OSS Endpoint的专有网络地址,通过内网上传备份文件到OSS,提升备份文件上传的效率。
    使用OSS控制台上传 如果备份文件小于5GB,可以直接使用OSS控制台上传,详情请参见使用OSS控制台上传
    使用OSS API上传 如果您有全自动无人干预上云需求,请使用OSS OpenAPI,通过断点续传的方式上传备份文件到OSS Bucket,详情请参见断点续传

将数据库迁移至RDS

  1. 下载迁移上云脚本
  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>
    表 1. 参数说明
    参数 说明
    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-2zesz5774ud**** -e oss-cn-beijing.aliyuncs.com -b testdatabucket -d Migrationdata
  4. 查看迁移任务的执行进度。
    1. 登录RDS控制台
    2. 选择目标实例所在地域。
      选择地域
    3. 单击目标实例ID。
    4. 根据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返回了错误信息。 根据错误码和错误信息来分析具体原因,详情请参见表 2
表 2. 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 创建数据上云任务
CreateOnlineDatabaseTask 打开数据库
DescribeMigrateTasks 查询数据上云任务列表
DescribeOssDownloads 查看数据上云任务文件详情