本文以Azure SQL Database为例,介绍如何使用SQL Server Management Studio(SSMS)将其他云平台上的SQL Server数据库或本地自建的SQL Server数据库迁移到阿里云RDS SQL Server。
前提条件
- 已创建存储空间大于源库的目标RDS SQL Server实例,且实例需满足如下条件: 说明- 建议目标实例存储空间为源库的1.2倍,已有RDS SQL Server实例但存储空间不足时,请及时扩容。 - 实例系列:基础系列、高可用系列(2012及以上版本)、集群系列 
- 实例规格:通用型、独享型(不支持共享型) 
- 计费方式:包年包月或按量付费(不支持Serverless实例) 
- 网络类型:专有网络。如需变更网络类型,请参见更改网络类型。 
- 实例创建时间: - 高可用系列和集群系列实例的创建时间需在2021年01月01日或之后。 
- 基础系列实例的创建时间需在2022年09月02日或之后。 
 说明- 创建时间可在基本信息页内的运行状态中查看。 
 
- 已在本地或ECS实例(专有网络、Windows Server镜像、分配公网IP)中安装SSMS工具。 说明- 本示例以 - SSMS 19.1为例,为您介绍迁移上云的操作步骤。实际操作步骤可能会因SSMS工具的安装位置、版本、设置等因素而有所差异,请以实际情况为准。
注意事项
- 为了避免发生数据不一致的情况,您需要停止源库的数据写入,停止时间取决于待迁移的数据量和实际操作时间。 
- 数据导出的速度主要取决于源库的规格。 
准备工作
- 开启Azure SQL Database的公网访问权限,并在防火墙中允许您本地IP或ECS实例的公网IP访问Azure服务和资源。 说明- 具体操作,请查看Azure官方的相关文档,或联系Azure的技术支持人员。 
- 确认源库中的约束、视图等不会导致数据导出失败。 
- 登录阿里云主账号,在RDS SQL Server实例中创建超级权限账号。 
- 在源和目标库中分别执行 - SELECT name, compatibility_level FROM sys.databases;命令,确认目标库是否兼容源库。
- 为RDS SQL Server实例设置白名单,允许客户端所在的ECS或本地设备访问实例。 说明- ECS通过内网访问RDS SQL Server时,需确保ECS和RDS SQL Server实例位于同一地域的同一VPC下,并将ECS的私网IP添加到RDS SQL Server实例白名单中。 
- 本地设备访问RDS SQL Server时,需将本地设备的公网IP添加到RDS SQL Server实例白名单中。 
 
1. 导出Azure SQL Database数据
暂停在Azure SQL Database写入数据,并导出Azure SQL Database中的数据。
- 进入导出数据的界面。 - 在对象资源管理器中,展开数据库。 
- 右键单击目标库。 
- 选择。 
 说明- 导出数据操作的更多信息,请参见导出数据层应用程序。 
- 单击下一步。 
- 选择需要导出的对象。 - 在导出设置的设置页签中,选择保存到本地磁盘。 
- 单击浏览,选择保存路径和文件名。 
- 在高级页签中,选择需要导出的表。 说明- 若您需要选择其他对象(如触发器和存储过程),请在对象资源管理器中右键单击目标库,然后选择,并根据实际情况,完成后续步骤。更多信息,请参见使用SSMS和BCP迁移SQL Server数据库。 
- 单击下一步。 
 
- 单击完成。 
- 数据导出成功后,单击关闭。 
2. 导入数据到RDS SQL Server
将导出的数据导入到RDS SQL Server中。
- 打开SSMS工具。 
- 在连接到服务器对话框,配置如下信息。 - 配置项 - 说明 - 服务器类型 - 选择为数据库引擎。 - 服务器名称 - 填入RDS SQL Server实例的内网地址或外网地址。获取方法,请参见查看或修改连接地址和端口。 - 身份验证 - 选择为SQL Server 身份验证。 - 登录名 - 填入超级权限账号。 - 密码 - 填入超级权限账号的密码。 
- 单击连接。 
 
- 在对象资源管理器中,右键单击数据库。 
- 选择导入数据层应用程序。 
- 单击下一步。 
- 配置导入设置。 - 选择从本地磁盘导入。 
- 单击浏览,选择从Azure SQL Database中导出的.bacpac文件。 
- 单击下一步。 
 
- 配置数据库设置。 - 在新数据库名称中,填入源库在RDS SQL Server实例中对应的数据库名称。 重要- 建议与Azure SQL Database中的数据库名称一致,否则在业务切换至RDS SQL Server后,可能会导致业务涉及的功能异常。 
- 若您填入的数据库名称在RDS SQL Server实例中已存,可能会导致导入失败或数据不一致。 
 
- 在SQL Server设置区域中,将数据文件路径和日志文件路径修改为E:\SQLDATA\DATA。 
- 单击下一步。 
 
- 单击完成。 
- 数据导入成功后,单击关闭。 
3. 校验数据一致性
数据导入完成后,需要分别在源库和目标库执行如下命令进行校验,源库和目标库返回的结果相同则表示数据一致。
- 查询数据库的数据行数(返回所有业务表数据的总和) 重要- 请确保数据迁移过程中,源表和快照数据无变更,否则可能会导致数据行数不一致。 - USE <数据库名称>; SELECT SUM(b.rows) AS 'RowCount' FROM sysobjects AS a INNER JOIN sysindexes AS b ON a.id = b.id WHERE (a.type = 'u') AND (b.indid IN (0, 1))
- 查询数据大小(返回数据文件大小和空间占比率) - USE <数据库名称>; SELECT a.name [文件名称] ,cast(a.[size]*1.0/128 as decimal(12,1)) AS [文件设置大小(MB)] ,CAST( fileproperty(s.name,'SpaceUsed')/(8*16.0) AS DECIMAL(12,1)) AS [文件所占空间(MB)] ,CAST( (fileproperty(s.name,'SpaceUsed')/(8*16.0))/(s.size/(8*16.0))*100.0 AS DECIMAL(12,1)) AS [所占空间率%] ,CASE WHEN A.growth =0 THEN '文件大小固定,不会增长' ELSE '文件将自动增长' end [增长模式] ,CASE WHEN A.growth > 0 AND is_percent_growth = 0 THEN '增量为固定大小' WHEN A.growth > 0 AND is_percent_growth = 1 THEN '增量将用整数百分比表示' ELSE '文件大小固定,不会增长' END AS [增量模式] ,CASE WHEN A.growth > 0 AND is_percent_growth = 0 THEN cast(cast(a.growth*1.0/128as decimal(12,0)) AS VARCHAR)+'MB' WHEN A.growth > 0 AND is_percent_growth = 1 THEN cast(cast(a.growth AS decimal(12,0)) AS VARCHAR)+'%' ELSE '文件大小固定,不会增长' end AS [增长值(%或MB)] ,a.physical_name AS [文件所在目录] ,a.type_desc AS [文件类型] FROM sys.database_files a INNER JOIN sys.sysfiles AS s ON a.[file_id]=s.fileid LEFT JOIN sys.dm_db_file_space_usage b ON a.[file_id]=b.[file_id] ORDER BY a.[type]
数据一致性校验完成后,您可以将业务切换至RDS SQL Server,并测试业务涉及的功能是否正常。