本文档介绍如何把用户OSS上的全量备份文件迁移到阿里云RDS SQL Server。

前提条件

  • RDS实例为如下版本:
    • RDS SQL Server 2019标准版
    • RDS SQL Server 2017标准版、企业集群版
    • RDS SQL Server 2012/2016标准版、企业版
    • RDS SQL Server 2012/2016 Web版
    • RDS SQL Server 2012 企业版基础系列
    说明 SQL Server 2008 R2高可用版上云方法请参见全量备份数据上云SQL Server 2008 R2版
  • RDS实例拥有足够的存储空间。如果空间不足,请提前升级实例空间。
  • RDS实例中没有同名的目标数据库。
  • RDS实例已创建高权限账号,详情请参见创建数据库和账号SQL Server 2019/2017/2016/2012
  • 创建与RDS实例同地域的OSS Bucket,详情请参见创建存储空间
  • 执行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.

注意事项

  • 不支持高版本的备份文件往低版本做迁移,例如从SQL Server 2016迁移到SQL Server 2012。
  • 不支持差异备份文件或日志备份文件。
  • 全量备份文件名不能包含@、|等特殊字符,否则会导致上云失败。
  • 授予RDS服务账号访问OSS的权限以后,系统会在访问控制RAM的角色管理中创建名为AliyunRDSImportRole的角色,请勿修改或删除这个角色,否则会导致上云任务无法下载备份文件而失败。如果修改或删除了这个角色,您需要通过数据上云向导重新授权。
  • 在OSS备份数据恢复上云任务没有完成之前,请不要删除OSS上的备份文件,否则会导致上云任务失败。
  • 备份文件名仅支持bak、diff、trn或log为后缀名。如果没有使用本文中的脚本生成备份文件,请使用如下后缀名:
    • bak:表示全量备份文件。
    • diff:表示差异备份文件。
    • trn或者log:表示事务日志备份。

视频演示

备份本地数据库

说明 在对本地数据库做全量备份之前,请确保已停止写入数据。备份过程中新写入的数据将不会被备份。
  1. 下载备份脚本,用SSMS打开备份脚本。
  2. 修改如下参数。
    配置项 说明
    @backup_databases_list 需要备份的数据库,多个数据库以分号或者逗号分隔。
    @backup_type 备份类型。参数值如下:
    • FULL:全量备份
    • DIFF:差异备份
    • LOG:日志备份
    @backup_folder 备份文件所在的本地目录。如不存在,会自动创建。
    @is_run 是否执行备份。参数值如下:
    • 1:执行备份。
    • 0:只做检查,不执行备份。
  3. 执行备份脚本。

上传备份文件到OSS

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

  • 使用ossbrowser工具上传

    推荐使用ossbrowser工具上传备份文件到OSS,详情请参见 ossbrowser

  • 使用OSS控制台上传

    如果备份文件小于5GB,可以直接使用OSS控制台上传,详情请参见使用OSS控制台上传

  • 使用OSS API上传

    您可以使用OSS OpenAPI,通过断点续传的方式上传备份文件到OSS Bucket,详情请参见断点续传

创建数据上云任务

  1. 登录RDS控制台
  2. 选择目标实例所在地域。
    选择地域
  3. 单击目标实例的ID。
  4. 在左侧菜单栏中选择备份恢复
  5. 单击右上角OSS备份数据恢复上云
  6. 单击两次下一步,进入数据导入步骤。
    说明 如果您是第一次使用OSS备份数据恢复上云功能,需要给RDS官方服务账号授予访问OSS的权限,请单击授权地址并同意授权。
  7. 设置如下参数。
    配置项 说明
    数据库名 目标实例上的目标数据库名称。
    说明 数据库名称需要符合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 = SyncExecuteDBCheck
    • 同步执行DBCC:相对于异步执行DBCC,有的用户非常关心DBCC CheckDB的结果,以此来找出用户线下数据库数据一致性错误。此时,建议您选择同步执行DBCC,影响是会拉长打开数据库的时间。此时CreateMigrateTask 中的CheckDBMode = AsyncExecuteDBCheck
  8. 单击确定

请耐心等待上云任务完成,您可以单击刷新查看数据上云任务最新状态。如果上云失败,请根据任务描述提示排查错误,可参考本文的常见错误

查看备份上云记录

您可以在备份恢复页面备份数据上云记录页签内查看备份上云记录,默认会展示最近一周的记录。

上云记录

常见错误

每一条备份上云恢复记录中,都会有任务描述信息,可以通过这些描述信息提示来发现任务失败或报错的原因,常见的错误信息如下:

  • 同名数据库已经存在
    • 错误信息:The database (xxx) is already exist on RDS, please backup and drop it, then try again.
    • 错误原因:为了保证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。
  • 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
    • 错误信息:Not Enough Disk Space, space left xxx MB < bak file xxx MB.
    • 错误原因: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备份数据上云任务不知道需要为哪个用户授权,但是备份文件已经成功还原到目标实例上,所以任务状态是成功的。
    • 解决方法:创建高权限账号,详情请参见创建数据库和账号SQL Server 2019/2017/2016/2012

一张图读懂常见错误信息

相关API

API 描述
CreateMigrateTask 创建数据上云任务
CreateOnlineDatabaseTask 打开数据库
DescribeMigrateTasks 查询数据上云任务列表
DescribeOssDownloads 查看数据上云任务文件详情