本文介绍如何通过全量备份文件将自建SQL Server数据库的多个库或所有库全量迁移至阿里云RDS SQL Server。
背景信息
为解决多个数据库迁移上云问题,RDS SQL Server推出了实例级别的数据库迁移上云方案,参见本文操作,您只需将SQL Server实例中所有数据库的完整备份文件上传到OSS Bucket(存储空间)的同一文件夹中,然后执行迁移上云脚本即可。
说明 如果您的上云迁移级别为数据库,即每次只需完成一个数据库迁移上云,SQL Server提供了以下三种基于OSS的数据库上云方案:
前提条件
- 目标端RDS SQL Server实例版本需为:
- RDS SQL Server集群系列(2017企业版、2019企业版)
- RDS SQL Server高可用系列(2008 R2、2012标准版、2012企业版、2016标准版、2016企业版、2017标准版、2019标准版)
- RDS SQL Server基础系列(2012企业基础版、2012Web版、2016Web版)
- 源端数据库需为自建SQL Server。
- 如果是RAM用户执行迁移上云,需为RAM账号授予AliyunOSSFullAccess权限和AliyunRDSFullAccess权限。如何为RAM用户授权,请参见通过RAM对OSS进行权限管理和通过RAM对RDS进行权限管理。
限制条件
本方案仅支持全量迁移上云,暂不支持增量迁移上云。
准备工作
- 安装Python2.7.18版本,详情请参见Python官网。
- 确认Python安装成功并查看版本。
- Windows操作系统
执行
c:\Python27\python.exe -V
查看Python版本,如果输出内容为:Python 2.7.18
表明您已安装成功。如果提示“不是内部或外部命令”,请在Path环境变量中增加Python的安装路径和pip命令的目录。
- Mac、Linux或Unix操作系统
执行
python -V
查看Python版本,如果输出内容为:Python 2.7.18
表明您已安装成功。
- Windows操作系统
- 选择下述方法之一,安装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
- 使用pip安装
- 创建与目标RDS实例相同地域的存储空间(Bucket),详情请参见创建存储空间。说明 如果存储空间已经存在,请跳过本步骤。
- 在目标RDS实例中创建与待迁移数据库名称相同的数据库,保持数据库为空。
- 如果目标实例是RDS SQL Server 2012及以上版本,无需执行本步骤。
- 如果目标实例是RDS SQL Server 2008 R2版本,详情请参见创建数据库和账号(SQL Server 2008 R2)。
- 备份自建SQL Server的所有数据库。警告
- 为保障数据一致性,在执行全量备份期间,请勿写入新的数据,请提前安排以免影响业务运行。
- 如果您不使用备份脚本来执行备份,备份文件必须按照
数据库名称_备份类型_备份时间.bak
的格式来命名,例如Testdb_FULL_20180518153544.bak
,否则会导致备份报错。
- 根据需求选择下述方法,将数据库备份文件上传到OSS的存储空间中。警告 请确保上传的OSS存储空间和RDS实例属于同一地域,既可以提高RDS读取备份文件效率,也可以避免无法下载备份文件导致任务失败。
方法 说明 使用OSS Browser工具上传 推荐使用OSS Browser工具上传备份文件到OSS,详情请参见快速使用ossbrowser。 重要 如果您的自建数据库部署在ECS实例上,且ECS实例的网络为专有网络,那么在使用OSS Browser工具登录时,请用OSS Endpoint的专有网络地址,通过内网上传备份文件到OSS,提升备份文件上传的效率。使用OSS控制台上传 如果备份文件小于5GB,可以直接使用OSS控制台上传,详情请参见控制台上传文件。 使用OSS API上传 如果您有全自动无人干预上云需求,请使用OSS OpenAPI,通过断点续传的方式上传备份文件到OSS Bucket,详情请参见分片上传。
将数据库迁移至RDS
- 下载迁移上云脚本。
- 解压后执行如下命令,了解该脚本需要传入的参数信息。
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存储空间中的目录。如果是根目录,请传入 /
。 - 执行迁移上云脚本,完成迁移任务。
示例:
将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
- 查看迁移任务的执行进度。
常见错误
错误提示 | 原因 | 解决方法 |
---|---|---|
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的读写权限(即AliyunOSSFullAccess和AliyunRDSFullAccess权限)。关于授权操作方法,请参见为RAM用户授权。 |
OPENAPI Response Error !!!!! : HTTP Status: <Http Status Code> Error:<Error> <Description>. RequestID: 32BB6886-775E-4BB7-A054-635664**** | 调用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. | 数据库不存在。
|
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 | 描述 |
---|---|
创建上云任务 | 创建数据上云任务 |
创建打开数据库任务 | 打开数据库 |
查询上云任务列表 | 查询数据上云任务列表 |
查询上云任务文件 | 查看数据上云任务文件详情 |