云数据库 SQL Server 版支持通过对象存储 TOS 将本地 SQL Server 数据迁移至云上 SQL Server,适用于数据备份、灾难恢复、业务扩展、开发和测试等场景。本文介绍如何通过 TOS 将本地数据库的全量备份数据上传至云数据库 SQL Server 版实例。
云数据库 SQL server 提供两种数据迁移上云的方案,具体如下所示:
方案一:全量备份上云
全量备份上云可以实现一次性数据的迁移上云,但需要长时间的停止业务,将导出的全量备份文件上传至对象存储,然后恢复到目标数据库实例中。
方案二:全量 + 增量备份上云
全量 + 增量备份上云可以持续迁移数据上云,但需要在完成全量备份的基础上,通过多次增量文件恢复,实现迁移过程中业务中断最小化。增量恢复通常需要进行多次增量备份恢复操作。每次恢复后,目标数据库都将处于导入中状态,此时数据库将不可读写。只有完成最后一次增量备份恢复后,数据库才会变为运行中状态。
不同规模的数据库迁移上云场景存在一定的差异,具体如下表所示:
业务中断时长 | 需要迁移的数据库大小(GiB) | 推荐方案 |
---|---|---|
30 min ~ 2 h | < 100 GiB | 方案一 |
≥ 100 GiB | 方案二 | |
2 h ~ 4 h | < 200 GiB | 方案一 |
≥ 200 GiB | 方案二 | |
4 h ~ 8 h | < 500 GiB | 方案一 |
≥ 500 GiB | 方案二 |
说明
如果业务可以接受任意中断时长,则适用于方案一。
如果业务无法接受任意中断时长,则不适用于本文档介绍的迁移方案。
本示例以迁移 100GiB 的数据库,从本地数据中心全量 + 增量的迁移过程为例介绍迁移流程,具体如下表所示:
上云阶段 | 步骤 | 说明 |
---|---|---|
全量阶段 | 准备工作 | 准备工作包括:
|
数据库完全备份 | 开始对线下数据库做 FULL Backup,耗时约 30 分钟。 压缩备份按照 50% 比例计算,备份完成后,备份文件大小约为 50GiB。 | |
上传完全备份至 TOS | 上传 50GiB 备份文件到 TOS Bucket,按公网 10MB/s,耗时约 2 小时。 | |
上云完全备份文件 | 开始在云数据库 SQL Server 版控制台恢复 FULL Backup 文件,耗时约 1 小时。 | |
打开数据库 | 上云完成 | 完成数据库上线,如果选择异步执行数据库控制台操作,上线速度快,耗时约 1 分钟。 |
说明
在进行全量备份迁移上云时,本示例全量备份迁移 100 GiB 的数据上云需要中断应用的时间约为 3 小时 31 分钟。
一次完成的备份迁移阶段如下表所示:
阶段 | 步骤 | 描述 |
---|---|---|
① | 导出数据库全量备份文件备份文件 | 该阶段主要耗时为生成数据库备份文件所需的时间,通常取决于源数据库的配置与大小,具体时间需要您根据源数据库的配置进行预估。 |
② | 上传备份文件至对象存储 TOS 桶 | 对象存储 TOS 不限速,如果您是通过公网访问对象存储 TOS 时,上传下载速度受公网带宽限制。例如:公网带宽为 10MB/s 时,在没有其他因素影响网络的情况下上传的速度为 10MB/s。 |
③ | 通过对象存储 TOS 恢复上云任务全量恢复至目标端云数据 SQL Server 版 | 恢复速度通常约为 100GiB/h。 |
迁移时长 = 阶段 ① 耗时 + 阶段 ② 耗时 + 阶段 ③ 耗时
业务中断时长 = 上传对象存储 TOS + 创建对象存储 TOS 恢复任务
仅支持将低版本的备份文件迁移至高版本数据库实例,不支持将高版本备份文件迁移至低版本。版本限制如下所示:
数据库商用版本:建议从低版本到高版本,例如支持从 Web 版到标准版到企业版。
数据库兼容版本:例如仅支持从 SQL Server 2012 迁移到 SQL Server 2019,不支持从 SQL Server 2019 迁移至 SQL Server 2012。
备份文件名不能包含特殊字符,特殊字符包括 \
、/
、:
、*
、?
、"
、<
、>
、|
、!
、@
、#
、$
、%
、^
、&
、*
、(
、)
、_
、+
、-
和 =
。
在备份数据恢复上云任务没有完成前,请不要删除对象存储 TOS 上的备份文件,否则会导致迁移上云失败。
备份文件的后缀名必须为 bak
、diff
、trn
或 log
,具体如下所示:
bak
:表示全量备份文件。
diff
:表示差异备份文件。
trn
或 log
:表示事务日志备份文件。
说明
如果备份文件的后缀不是上述格式,那么系统可能无法正确识别该文件类型,从而影响后续操作。
在进行生产环境数据库迁移前,建议您先在开发或测试环境进行实际的测试评估。如果需要在生产环境中运行评估,建议在业务低峰期测试,降低业务影响。
云数据库 SQL Server 版数据库迁移,适用于以下场景:
数据备份和灾难恢复:云数据库提供了高效的备份和灾难恢复解决方案。在硬件故障或数据被意外损坏时,可以从云备份中恢复数据。
业务扩展:如果您的业务正在扩展,需要更多的服务器和存储资源来处理数据需求,那么将数据迁移到云数据库可以降低硬件和运维成本,同时云数据库可以根据业务需求进行弹性扩展。
实时业务:云数据库具有高效、快速的处理能力,可以支持大量并发用户的实时访问和查询,非常适合需要实时业务支持的场景。
开发和测试环境:云数据库提供了一个独立的,易于构建和管理的环境,非常适合用作开发和测试环境。
类别 | 说明 |
---|---|
对象存储 TOS |
|
云数据库 SQL Server 版 |
|
其他 |
|
说明
在备份本地文件前,需确保已停止数据的写入,由于新写入的数据不会被备份,导致数据不一致。
在本地 SQL Server 数据库的查询编辑器中,执行以下命令备份全量数据:
BACKUP DATABASE [<db_name>] TO DISK = N'<backup location, e.g. E:\backup\dbname.bak' WITH NOFORMAT, NOINIT, NAME = N'<dbname>-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
修改备份文件的名称为:数据库名_备份类型_时间戳.bak
。
创建存储桶
登录对象存储控制台。
在左侧导航栏单击桶列表,在页面左上方单击创建桶。
设置存储桶参数,部分参数如下表,然后单击确定。
参数 | 说明 |
---|---|
区域 | 需和云数据库 SQL Server 版的实例在同一个地域下。 |
桶策略 | 需设置为公共读。即允许所有人都可以对公共读权限的存储桶进行读取操作。 |
默认存储类型 | 需设置为标准存储。该存储类型适用于频繁被访问。 |
服务端加密 | 需设置为无,不加密。 |
上传数据库备份文件
方式一:(推荐)通过 TOS Browser 上传文件
登录 TOS Browser。关于如何获取 AK 和 SK 的操作步骤,请参见获取 Access Key。
在桶列表页面,单击目标 Bucket。
在目标 Bucket 页面,单击上传文件。
在上传文件控制面板,上传文件后,单击确定。
方式二:通过对象存储 TOS 控制台上传文件
登录对象存储控制台。
在左侧导航栏,单击桶列表。
在桶列表页面,单击目标桶名称。
在文件列表页面,单击上传文件。
在上传文件页面,上传文件后,单击确定。
在顶部菜单栏的左上角,选择实例所属的项目和地域。
在左侧导航栏,单击 TOS 备份恢复列表,进入 TOS 备份恢复列表页。
在 TOS 备份恢复列表页,单击创建 TOS 备份文件恢复任务,进入创建 TOS 备份文件恢复任务页。
在 创建 TOS 备份文件恢复任务页,设置以下参数。
参数 | 说明 |
---|---|
恢复方式 | 默认为自建 TOS 桶且不支持选择。 |
桶名 | 存储备份文件的 TOS 桶的名称。 |
选择备份 | 必填。选择待恢复的备份文件。 说明 仅支持前缀搜索。如果备份文件存放于桶内的某一级文件夹中,则需要逐级输入该文件的路径。最多显示 20 条匹配结果。 |
上云方案 | 可选择打开数据库或不打开数据库。
|
恢复类型 | 选择全量恢复。 |
是否覆盖还原 | 当前仅支持选择否。 |
选择实例 | 选择要恢复到的目标实例。可通过实例名称或实例 ID 进行搜索。 |
待恢复数据库名称 | 填写要恢复的数据库名称,必须与备份文件中数据库名称一致。每次最多可以恢复 20 个数据库。 说明 在恢复类型选择默认恢复时,无需配置该参数。 |
单击提交。
您在完成备份上云操作后,可以查看 TOS 备份恢复任务。具体操作,请参见查看 TOS 备份恢复任务。
通过 TOS 完成本地数据上云后,您还可以通过以下实践来配置 Login 账号、DBLink 连接、Agent Job 来保持和本地体验一致。
Login 账号是云数据库 SQL Server 版的实例级账号,主要用于管理您的服务器和数据库权限。您可以通过以下方式创建和本地相同密码和权限的 Login 账号。具体操作如下所示:
说明
建议您使用方式一创建 Login 账号,因为后续如果线下有相同实例的库通过 TOS 上云, 那么权限会自动关联给此 Login 账号。但方式二后续如果每上一个库, 都需要重新关联一次数据库的用户和实例级别的 Login。
方式一:(推荐方式)通过 T-SQL 创建 Login 账号
登录本地 IDC 实例, 以 SA 权限执行以下脚本命令获取本地实例 Login 账号的创建脚本:
SELECT 'IF (SUSER_ID(N'+QUOTENAME(SP.name,'''')+') IS NULL) BEGIN CREATE LOGIN ' +QUOTENAME(SP.name) +' WITH PASSWORD = ' +CONVERT(NVARCHAR(MAX),SL.password_hash,1)+ ' HASHED,SID=' +CONVERT(NVARCHAR(MAX),SP.sid,1) +' ,DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[' +SP.default_language_name+ '] END;' as CreateLogin FROM sys.server_principals AS SP LEFT JOIN sys.sql_logins AS SL ON SP.principal_id = SL.principal_id WHERE SP.type ='S' AND SP.name NOT LIKE '##%##' AND SP.name NOT LIKE 'NT AUTHORITY%' AND SP.name NOT LIKE 'NT SERVICE%' AND SP.name NOT IN ('rdsadmin','rdsbackup','rdsmirror','public','sa','veyun_user') -- AND SP.name = N'user1'
预期输出:
IF (SUSER_ID('UserName') IS NULL) BEGIN CREATE LOGIN [User1] WITH PASSWORD = {PassWord}... HASHED,SID={SID},CHECK_EXPIRATION = ON, CHECK_POLICY = ON, DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[English] END;
通过 SSMS 或数据库工作台 DBW 连接云上实例。详细操作,请参见连接实例。
执行步骤一的输出,创建和本地实例相同的 Login 账号。
方式二:通过控制台创建 Login 账号
创建和本地实例相同的 Login 账号。详细操作,请参见创建账号。
通过 SSMS 或数据库工作台 DBW 连接云上实例。详细操作,请参见连接实例。
在目标实例中执行以下脚本命令,关联数据库的用户和实例级别的 Login,以确保该账号在当前数据库上的权限和本地数据库的账号权限一致。
declare @DBName nvarchar(200) declare @Login_name nvarchar(200) declare @SQL nvarchar(MAX) set @Login_name = 'TestLogin7' //输入Login名称逐个执行 declare DBName_Cursor cursor for select quotename(name)from sys.databases where database_id > 5 and state = 0 and name not like '%$%' and name <> 'rdsadmin' open DBName_Cursor fetch next from DBName_Cursor into @DBName WHILE @@FETCH_STATUS= 0 begin SET @SQL= N' USE '+ (@DBName)+ ' if exists(select top 1 1 from sys.sysusers where name = '''+ @Login_name +''') begin ALTER USER '+@Login_name+' with login = '+@Login_name+'; end ' print @SQL EXEC (@SQL) fetch next from DBName_Cursor into @DBName end close DBName_Cursor deallocate DBName_Cursor
说明
完成以上操作后,您在云上的实例账号对当前数据库的权限和在线下是相同。
SQL Server 支持通过 DBLink 连接的方式跟外部实例上的数据进行交互,该方式可以帮助您在不同实例间、不同数据库类型的实例间进行数据查询、同步和比较。如果您在本地实例中用到了该服务,在迁移完成后,本地的 DBLink 连接不会自动同步到云上实例中,因此您还需要根据以下提示进行手动同步:
方式一:通过 T-SQL 创建 DBLink 连接
在本地数据库中执行以下命令获取 DBLink 的名称、数据源等信息。
-- 获取链接服务器的基本信息 SELECT srv.name AS linked_server_name, srv.product AS server_product, srv.providername AS provider_name, srv.datasource AS data_source FROM sys.servers AS srv WHERE srv.is_linked = 1; -- 获取链接服务器登录映射信息 SELECT lrmtsrv.name AS linked_server_name, lrmterr.locallogin AS local_login, lrmterr.useself AS uses_self, lrmterr.rmtuser AS remote_user, lrmterr.rmtpassword AS remote_password FROM sys.linked_logins AS lrmterr JOIN sys.servers AS lrmtsrv ON lrmterr.server_id = lrmtsrv.server_id WHERE lrmtsrv.is_linked = 1;
在云上数据库实例中执行上一步骤获取的配置创建相同的 DBLink,示例如下:
-- 示例:在云上创建链接服务器 EXEC sp_addlinkedserver @server = 'RemoteServer', -- 链接服务器名称 @srvproduct = 'SQL Server', -- 服务器产品名称 @provider = 'SQLNCLI11', -- 提供程序名称 @datasrc = 'RemoteServerNameOrIP'; -- 数据源 -- 设置链接服务器的登录映射 EXEC sp_addlinkedsrvlogin @rmtsrvname = 'RemoteServer', @useself = 'FALSE', @locallogin = NULL, -- 本地登录 @rmtuser = 'remoteUsername', -- 远程用户 @rmtpassword = 'remotePassword'; -- 远程用户密码
方式一:通过 SSMS 连接实例创建 DBLink 连接
获取本地实例上的所有 DBLink 连接。
通过 SSMS 连接本地数据库实例。
在左侧导航栏,选择 Server Objects > Linked Servers。
找到目标 DBLink 连接,直接按 Fn+F7。
在弹出的新窗口中,创建脚本复制当前实例上所有的 DBLink 连接。
在云上数据库中创建 DBLink 连接。
通过 SSMS 连接云上数据库实例。
在左侧导航栏,选择 Server Objects > Linked Servers。
将在本地数据库实例中复制的 DBLink 脚本文件复制到云上数据库实例中。
修改 @rmtpassword
上的密码并执行脚本命令,脚本命令的示例如下:
创建的脚本可能包含大量系统默认配置项,但是每个 DBLink 连接仅需保留以下两个关键脚本即可执行成功,同时需要注意重新输入账号连接密码。
USE [master] GO /****** Object: LinkedServer [AAAA] Script Date: 2024/2/18 16:24:40 ******/ EXEC master.dbo.sp_addlinkedserver @server = N'AAAA', @srvproduct=N'AAAA', @provider=N'SQLNCLI', @datasrc=N'PF2L1S4P-DMA\MSSQL_2019_STD' /* For security reasons the linked server remote logins password is changed with ### */ EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'AAAA',@useself=N'False',@locallogin=NULL,@rmtuser=N'veyun_user',@rmtpassword='###' GO
Agent Job 又名 SQL Server 代理服务,可以方便您在实例中快速创建定时任务,进行日常运维和数据处理,因此您需要将本地实例的 Jobs 迁移到云上实例中。具体操作如下所示:
注意
新建 Job 的 Owner 账号十分重要,在云数据库 SQL Server 版上,仅有该 Job 的 Owner 可以看到实例上自己的 Job,别的 Login 账号是看不到且无法操作的,因此建议所有的 Job Owner 是同一个账号方便管理。
获取本地实例 Jobs 的脚本命令文件。
通过 SSMS 连接本地数据库实例。
在左侧导航栏,选择 SQL Server Agent > Jobs。
按 Fn+F7,在 Object Explorer Details 页面,选中所有 Job,右键选择 Script Job as > Create To > New Query Window。
在弹出的窗口中复制 T-SQL 并创建脚本,在复制过程中需要关注以下信息:
修改每个 Job 上的 Owner 账号,例如:@owner_login_name=N'veyun_user'
。
修改每个 Job 上的实例名称,例如:@server=N'实例IP'
、@server_name = N'实例IP'
。
在云上实例中创建 Jobs 脚本命令。
通过 SSMS 连接云上数据库实例。
在左侧导航栏,选择 SQL Server Agent > Jobs。
按 Fn+F7,在 Object Explorer Details 页面,选中所有 Job,右键选择 Script Job as > Create To > New Query Window。
在弹出的窗口中复制本地实例中获取的 Jobs 脚本命令。