RDS SQL Server 2012、2014、2016、2017和2019版提供了增量上云功能,将上云期间的业务中断时间控制在分钟级别,大大缩短了业务中断时间。

前提条件

  • RDS实例为如下版本:
    • RDS SQL Server集群系列(2017企业版、2019企业版)
    • RDS SQL Server高可用系列(2012标准版、2012企业版、2014标准版、2014企业版、2016标准版、2016企业版、2017标准版、2019标准版)
    • RDS SQL Server基础系列(2012企业基础版、2012Web版、2016Web版)
  • OSS Bucket与RDS实例需要处于相同地域,关于如何创建OSS Bucket,详情请参见创建存储空间
  • 数据库恢复模式为FULL。
    说明 增量备份数据上云时,数据库的恢复模式必须是FULL模式,恢复模式是Simple模式时,不允许做事务日志备份,而差异备份文件有可能会很大,导致增量上云的时间很长。
  • RDS实例拥有足够的存储空间。如果空间不足,请提前升级实例空间。
  • RDS实例中没有同名的目标数据库。
  • RDS实例已创建高权限账号,具体操作,请参见创建数据库和账号(SQL Server 2012、2014、2016、2017和2019)
  • 执行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.

背景信息

RDS SQL Server增量数据上云适用于以下场景:
  • 基于备份文件物理迁移至RDS SQL Server,而不是逻辑迁移。
    说明
    • 物理迁移是指基于文件的迁移,逻辑迁移是指将数据生成DML语句写入RDS SQL Server。
    • 物理迁移可做到数据库迁移后和本地环境100%一致。逻辑迁移无法做到100%一致,例如索引碎片率、统计信息等。
  • 对业务停止时间敏感,需要控制在分钟级别。
    说明 如果您对业务停止时间不敏感(如2小时),当数据库小于100G时,建议您通过全量备份文件上云,具体操作,请参见 全量备份数据上云(SQL Server 2012、2014、2016、2017和2019)

本文将介绍基于用户OSS空间上的完全备份文件加上日志备份(或者差异备份文件),实现用户线下SQL Server数据库增量迁移到RDS SQL Server。

注意事项

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

操作流程举例

根据上图增量上云案例,按时间维度,解释如下。

上云阶段 步骤 说明
全量阶段 Step1. 00:00之前 完成准备工作,包括:
  • 完成DBCC CheckDB检查。
  • 关闭本地环境备份系统。
  • 修改数据库为FULL恢复模式。
Step2. 00:01 开始对线下数据库做FULL Backup,耗时近1小时。
Step3. 02:00 上传备份文件到OSS Bucket,耗时近1小时。
Step4. 03:00 开始在RDS控制台恢复FULL Backup文件,耗时19小时。
增量阶段 Step5. 22:00 开始数据库增量LOG备份上云,完成LOG备份并上传至OSS,耗时约20分钟。
Step6. 22:20 完成LOG Backup上云,耗时约10分钟。
Step6. 22:30
  • 重复Step5~6,不断Backup LOG、上传到OSS、增量上云LOG备份文件,确保最后一个Backup LOG文件尽量小(500MB以下)。
  • 停止本地应用对数据库的写入操作,再做一个LOG Backup,最后一次增量上云。
打开数据库 Step8. 22:34 完成了最后一个LOG Backup文件增量上云操作,耗时4分钟,开始将数据库上线。
Step9. 22:35 数据库上线完毕,如果选择异步执行DBCC操作,上线速度快,耗时1分钟。

从整个的动作流程和时间轴来看,用户需要停止应用的时间非常的短,仅在最后一个LOG Backup之前停止应用写入即可。在本例中整个应用停止的时间控制在5分钟内。

视频演示

备份本地数据库

  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实例列表,在上方选择地域,然后单击目标实例ID。
  2. 在左侧菜单栏中选择备份恢复
  3. 单击页面上方的OSS备份数据恢复上云
  4. 数据导入向导页面,单击两次下一步,进入数据导入步骤。
    说明 如果您是第一次使用OSS备份数据恢复上云功能,需要给RDS官方服务账号授予访问OSS的权限,请单击 授权地址并同意授权,否则会因权限问题导致 OSS Bucket下拉列表为空。
  5. 设置如下参数。
    配置项 说明
    数据库名 目标实例上的目标数据库名称,即数据导入RDS实例之后的数据库名,必须和备份中的数据库名不同。
    说明 数据库名称需要符合SQL Server官方限制。
    OSS Bucket 选择备份文件所在的OSS Bucket。
    OSS子文件夹名 备份文件所在的子文件夹名字。
    OSS文件列表 单击右侧放大镜按钮,可以按照备份文件名前缀模糊查找,会展示文件名、文件大小和更新时间。请选择需要上云的备份文件。
    上云方案 选择不打开数据库
    • 打开数据库(只有一个全量备份文件):全量上云,适合仅有一个完全备份文件上云的场景。此时CreateMigrateTask中的BackupMode = FULL并且IsOnlineDB = True
    • 不打开数据库(还有差异备份或日志文件):增量上云,适合有完全备份文件加上日志备份(或者差异备份文件)上云的场景,此时CreateMigrateTask 中的BackupMode = UPDF 并且IsOnlineDB = False
  6. 单击确定

请耐心等待上云任务完成,您可以单击刷新查看数据上云任务最新状态。

导入差异或日志备份文件

SQL Server本地数据库全量备份上云完成后,接下来需要导入差异备份或者日志备份文件。

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
  2. 在左侧菜单栏中选择备份恢复,单击备份数据上云记录页签。
  3. 在任务列表中找到待导入备份文件的记录,在右侧单击上传增量文件,选择增量文件后单击确认
    说明
    • 如果您有多个日志备份文件,请使用同样的方法逐个生成上云任务。
    • 请在上传增量文件时,尽量保证最后一个备份文件的大小不超过500MB,以此来缩短增量上云的时间开销。
    • 在最后一个日志备份文件生成前,请停止本地数据库所有的写入操作,以保证线下数据库和RDS SQL Server上的数据库数据一致。

打开数据库

导入文件后RDS SQL Server中的数据库会处于In Recovery或者Restoring状态。高可用版本会是In Recovery状态,单机版会是Restoring状态,此时的数据库还无法进行读写操作,需要打开数据库。

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
  2. 在左侧菜单栏中选择备份恢复,单击备份数据上云记录页签。
  3. 在任务列表中找到待导入备份文件的记录,在右侧单击打开数据库
  4. 选择数据库的打开方式,单击确定
    说明 打开数据库一致性检查有以下两种方式:
    • 异步执行DBCC:在打开数据库的时候系统不做DBCC CheckDB,会在打开数据库任务结束以后,异步执行DBCC CheckDB操作,以此来节约打开数据库操作的时间开销(数据库比较大,DBCC CheckDB非常耗时),减少您的业务停机时间。如果您对业务停机时间要求非常敏感,且不关心DBCC CheckDB结果,建议使用异步执行DBCC。此时CreateMigrateTask 中的CheckDBMode = AsyncExecuteDBCheck
    • 同步执行DBCC:相对于异步执行DBCC,有的用户非常关心DBCC CheckDB的结果,以此来找出用户线下数据库数据一致性错误。此时,建议您选择同步执行DBCC,影响是会拉长打开数据库的时间。此时CreateMigrateTask 中的CheckDBMode = SyncExecuteDBCheck

查看上云任务备份文件详情

您可以在备份恢复页面备份数据上云记录页签内查看备份上云记录,单击对应任务最右侧的查看文件详情,将展示对应任务所有关联的备份文件详情。

常见错误

全量备份数据上云中常见错误部分请参见全量备份数据上云SQL Server 2012、2014、2016、2017、2019版本常见错误。用户在增量上云过程中,还有可能会遇到下面的错误:

  • 数据库打开失败
    • 错误信息:Failed to open database xxx.
    • 错误原因:线下SQL Server数据库启用了一些高级功能,如果用户选择的RDS SQL版本不支持这些高级功能,会导致数据库打开失败。例如本地SQL Server数据库是企业版,启用了数据压缩(Data Compression)或者分区(Partition),OSS上云到RDS SQL Server Web版,就会报告这个错误。
    • 解决方法:
      • 在本地SQL Server实例上禁用高级功能,重新备份后,再使用OSS上云功能。
      • 购买与线下SQL Server实例相同版本的RDS SQL Server。
  • 数据库备份链中LSN无法对接
    • 错误信息:The log in this backup set begins at LSN XXX, which is too recent to apply to the database.RESTORE LOG is terminating abnormally.
    • 错误原因:在SQL Server数据库中,差异备份或者日志备份能够成功还原的前提是,差异或者日志备份的LSN必须与上一次还原的备份文件LSN能够对接上,否则就会报告这个错误。
    • 解决方法:请选择对应的LSN备份文件进行增量备份文件上云,您可以按照备份文件备份操作时间先后顺序进行增量上云操作。
  • 异步DBCC Checkdb失败
    • 错误信息:asynchronously DBCC checkdb failed: CHECKDB found 0 allocation errors and 2 consistency errors in table 'XXX' (object ID XXX).
    • 错误原因:备份文件还原到RDS SQL Server上,上云任务系统会异步做DBCC CheckDB检查,如果检查不通过,说明本地数据库中已经有错误发生。
    • 解决方法:
      • 在RDS SQL Server上执行:
        DBCC CHECKDB (DBName,REPAIR_ALLOW_DATA_LOSS)
        说明 使用该命令修复错误的过程,可能会导致数据丢失。
      • 在本地使用如下命令修复错误后重新进行增量上云。
        DBCC CHECKDB (DBName,REPAIR_ALLOW_DATA_LOSS)
  • 完全备份文件类型
    • 错误信息:Backup set (xxx) is a Database FULL backup, we only accept transaction log or differential backup.
    • 错误原因:在增量上云RDS SQL Server过程中,全量备份文件还原完毕后,就只能再接受日志备份文件或者是差异备份文件。如果用户再次选择了全量备份文件,就会报告这个错误。
    • 解决方法:选择日志备份文件或者差异备份文件。
  • 数据库个数超出最大限制数
    • 错误信息:The database (xxx) migration failed due to databases count limitation.
    • 错误原因:当数据库达到数量限制以后再做上云操作,任务会失败报告这个错误。
    • 解决方法:迁移上云数据库到其他的RDS SQL Server,或者删除不必要的数据库。

相关API

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