本文以Azure SQL Database为例,介绍如何使用SQL Server Management Studio(SSMS)将您本地自建或其他云的SQL Server数据库迁移到RDS SQL Server。
前提条件
已创建存储空间大于源库的目标RDS SQL Server实例,且RDS SQL Server实例需满足如下条件:
说明建议目标RDS SQL Server实例的存储空间是源的1.2倍。
如需新建RDS SQL Server实例,请参见创建RDS SQL Server实例;若您已有RDS SQL Server实例但存储空间不足,可以增加存储空间,请参见变更配置。
实例系列:基础系列、高可用系列(2012及以上版本)、集群系列
实例规格:通用型、独享型(不支持共享型)
计费方式:包年包月或按量付费(不支持Serverless实例)
网络类型:专有网络。如需变更网络类型,请参见更改网络类型。
实例创建时间:
高可用系列和集群系列实例的创建时间需在2021年01月01日或之后。
基础系列实例的创建时间需在2022年09月02日或之后。
说明创建时间可在基本信息页内的运行状态中查看。
已在本地安装SSMS工具。
说明您也可以创建专有网络、Windows Server镜像、分配公网IP的ECS实例,并在ECS实例中安装SSMS工具。ECS实例的创建方法,请参见创建ECS实例。
注意事项
为了避免发生数据不一致的情况,您需要停止源库的数据写入,停止数据写入的时间取决于待迁移的数据量和实际操作的时间。
数据导出的速度主要取决于源库的规格。
准备工作
开启Azure SQL Database的公网访问权限,并在防火墙中允许您本地IP或ECS实例的公网IP访问Azure服务和资源。
说明具体操作,请查看Azure官方的相关文档,或联系Azure的技术支持人员。
确认源库中的约束、视图等不会导致数据导出失败。
在RDS SQL Server实例中,创建超级权限账号。
说明您需登录阿里云主账号后才能创建超级权限账号。创建方法,请参见创建SA权限的数据库账号。
在源和目标库中分别执行
SELECT name, compatibility_level FROM sys.databases;
命令,确认目标库是否兼容源库。是否兼容的判断标准,请参见兼容性级别。为RDS SQL Server实例设置白名单,允许客户端所在的ECS或本地设备访问RDS SQL Server实例。具体操作,请参见设置白名单。
说明如果使用ECS通过内网访问RDS SQL Server,ECS和RDS SQL Server实例需要位于同一个地域的同一VPC下,然后将ECS的私网IP添加到白名单。
如果使用本地设备访问RDS SQL Server,则将本地设备的公网IP添加到白名单。
操作步骤
实际操作步骤可能会因SSMS工具的安装位置、版本、设置等因素而有所差异,请以实际情况为准。本示例以SSMS 19.1
为例,为您介绍迁移上云的操作步骤。
暂停在Azure SQL Database写入数据。
导出Azure SQL Database中的数据。
使用SSMS工具连接Azure SQL Database。
说明具体操作,请参见连接和查询数据库。
进入导出数据的界面。
在对象资源管理器中,展开数据库。
右键单击目标库。
选择
。
说明导出数据操作的更多信息,请参见导出数据层应用程序。
单击下一步。
选择需要导出的对象。
在导出设置的设置页签中,选择保存到本地磁盘。
单击浏览,选择保存路径和文件名。
在高级页签中,选择需要导出的表。
说明若您需要选择其他对象(如触发器和存储过程),请在对象资源管理器中右键单击目标库,然后选择更多信息,请参见使用SSMS和BCP迁移SQL Server数据库。
,并根具实际情况,完成后续步骤。单击下一步。
单击完成。
数据导出成功后,单击关闭。
将导出的数据导入到RDS SQL Server。
使用SSMS工具连接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。
单击下一步。
单击完成。
数据导入成功后,单击关闭。
校验数据一致性。
数据导入完成后,需要分别在源库和目标库执行如下命令进行校验,源库和目标库返回的结果相同则表示数据一致。
查询数据库的数据行数(返回所有业务表数据的总和)
重要请确保数据迁移过程中,源表和快照数据无变更,否则可能会导致数据行数不一致。
use <dbname>; 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 <dbname>; 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,并测试业务涉及的功能是否正常。