如何通过物理备份将线下SQL Server迁移到阿里云RDS for SQL Server
简介
物理备份迁移是将SQL Server数据库迁移至阿里云RDS的推荐方法。此方案能够确保数据完整性,同时显著降低迁移过程中的风险及停机时间。相较于逻辑导出导入或第三方工具等其他迁移方式,物理备份还原方法具有更高的效率和可靠性,特别适用于大型数据库或包含特殊对象的数据库迁移场景。
该迁移策略的核心优势在于能够在业务正常运行期间完成大部分迁移工作,仅需在最终切换阶段短暂停机。通过预先还原全量备份,并持续应用差异备份或事务日志备份,可将源数据库与目标RDS实例之间的数据差异控制在最小范围内,为顺利切换提供保障。
整体的迁移流程如下图所示,从线下迁移到RDS,与将数据库从一台机器迁移到另一台机器的整体流程相似。本文将详细介绍各个迁移阶段的操作步骤。
事前准备
迁移Login
迁移SQL Server实例时可以通过微软官方脚本迁移login,该过程最重要的是保证login的sid一致,从而确保数据库级别内User权限一致,链接:
修改RDS白名单
RDS新购之后,先将使用数据库的各方应用白名单开放,该步骤可以提前验证。
可以在应用侧使用RDS DNS地址测试连接,地址如下所示:
在迁移前,应在应用程序服务器通过telnet RDS实例地址 1433命令确认网络连通性。
设置RDS实例参数
可以在RDS控制台,通过“参数管理”设置实例级别的参数,如下图所示。
这两个参数通常值得特别注意:
- max degree of parallelism - 根据CPU核数以及负载类型(OLTP或OLAP)设置合理的并行度,默认为2
- cost threshold for parallelism - 设置查询并行化的代价阈值,建议设置为50
迁移作业
可以通过Management Studio将作业脚本导出的方式迁移作业,这里注意并不是每一个作业都需要导出,通常一些计划任务,备份相关的作业不再需要导出,RDS已经具备了这些基本的PaaS层能力。
数据迁移
数据迁移的最佳实践是通过割接时间窗口之外进行全量数据库迁移,在割接窗口仅进行最小化的差异数据割接,整体流程如下:
数据迁移流程主要包括:
1. 在业务低峰期进行全量备份并还原到RDS
2. 定期进行差异备份或日志备份并还原,缩小差距
3. 在割接窗口内执行最后一次日志备份和还原
4. 将数据库带上线并切换应用连接
备份原实例上的库
可以通过下面脚本做原实例的物理备份操作,参数可以一次性设置多个数据库。
-- SQL Server 数据库备份脚本
-- 参数设置
DECLARE @DatabaseList NVARCHAR(MAX) = N'testdb1,testdbtde,testdb_copyonly'; -- 多个数据库用逗号分隔
DECLARE @BackupPath NVARCHAR(500) = N'D:\Backups\'; -- 备份文件保存路径
DECLARE @IsWebVersion BIT = 0; -- 0=非Web版本(启用压缩),1=Web版本(不启用压缩)
DECLARE @BackupType CHAR(1) = 'L'; -- F=全量备份,D=差异备份,L=日志备份
DECLARE @DateStamp NVARCHAR(20) = CONVERT(NVARCHAR(10), GETDATE(), 112); -- YYYYMMDD格式日期
DECLARE @TimeStamp NVARCHAR(10) = REPLACE(CONVERT(NVARCHAR(5), GETDATE(), 108), ':', ''); -- HHMM格式时间
DECLARE @Databases TABLE (
DatabaseName NVARCHAR(128)
);
-- 解析数据库列表
INSERT INTO @Databases
SELECT LTRIM(RTRIM(value))
FROM STRING_SPLIT(@DatabaseList, ',');
-- 备份选项
DECLARE @BackupOptions NVARCHAR(100);
IF @IsWebVersion = 1
SET @BackupOptions = N'INIT, STATS = 10';
ELSE
SET @BackupOptions = N'COMPRESSION, INIT, STATS = 10';
-- 备份类型前缀
DECLARE @TypePrefix NVARCHAR(10);
IF @BackupType = 'F' SET @TypePrefix = N'FULL_';
ELSE IF @BackupType = 'D' SET @TypePrefix = N'DIFF_';
ELSE IF @BackupType = 'L' SET @TypePrefix = N'LOG_';
-- 备份文件扩展名
DECLARE @FileExtension NVARCHAR(5);
IF @BackupType = 'L' SET @FileExtension = N'.trn';
ELSE SET @FileExtension = N'.bak';
-- 创建并执行备份命令
DECLARE @CurrentDB NVARCHAR(128);
DECLARE @BackupFile NVARCHAR(500);
DECLARE @SqlCommand NVARCHAR(MAX);
DECLARE @BackupDescription NVARCHAR(255);
-- 数据库游标
DECLARE db_cursor CURSOR FOR
SELECT DatabaseName FROM @Databases;
OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @CurrentDB;
WHILE @@FETCH_STATUS = 0
BEGIN
-- 构建文件名 (格式: 类型_数据库名_YYYYMMDD_HHMM.扩展名)
SET @BackupFile = @BackupPath + @TypePrefix + REPLACE(@CurrentDB, ' ', '_') +
N'_' + @DateStamp + N'_' + @TimeStamp + @FileExtension;
-- 构建描述
SET @BackupDescription = CASE
WHEN @BackupType = 'F' THEN '全量备份'
WHEN @BackupType = 'D' THEN '差异备份'
ELSE '日志备份'
END + ' - ' + @CurrentDB + ' - ' +
CONVERT(NVARCHAR(30), GETDATE(), 120);
-- 构建备份命令
IF @BackupType = 'F'
SET @SqlCommand = N'BACKUP DATABASE [' + @CurrentDB + N'] TO DISK = N''' +
@BackupFile + N''' WITH ' + @BackupOptions +
N', NAME = N''' + @BackupDescription + N'''';
ELSE IF @BackupType = 'D'
SET @SqlCommand = N'BACKUP DATABASE [' + @CurrentDB + N'] TO DISK = N''' +
@BackupFile + N''' WITH DIFFERENTIAL, ' + @BackupOptions +
N', NAME = N''' + @BackupDescription + N'''';
ELSE IF @BackupType = 'L'
SET @SqlCommand = N'BACKUP LOG [' + @CurrentDB + N'] TO DISK = N''' +
@BackupFile + N''' WITH ' + @BackupOptions +
N', NAME = N''' + @BackupDescription + N'''';
-- 打印命令(调试用)
PRINT N'正在备份数据库: ' + @CurrentDB;
PRINT @SqlCommand;
-- 执行备份命令
BEGIN TRY
EXEC sp_executesql @SqlCommand;
PRINT N'数据库 [' + @CurrentDB + N'] 备份成功,文件: ' + @BackupFile;
END TRY
BEGIN CATCH
PRINT N'数据库 [' + @CurrentDB + N'] 备份失败: ' + ERROR_MESSAGE();
END CATCH
FETCH NEXT FROM db_cursor INTO @CurrentDB;
END
CLOSE db_cursor;
DEALLOCATE db_cursor;
PRINT N'所有指定的数据库备份完成。';
备份后的文件如图所示
一次全备+一次差异+两次日志备份,通过时间戳和修改时间能确定先后顺序
上传到OSS
将备份文件上传到OSS,如果数据库备份较小,例如小于5GB,可以直接通过阿里云控制台进行,简化操作,如果备份较大,需要通过OSS的客户端或SDK进行。
进行上云恢复
还原全量备份
将备份上传到OSS之后,还原全量备份可以在事前进行。
还原增量或差异备份
还原过程如图,每一个库在还原完成全量之后,通过“备份数据上云记录”追加差异或日志备份。
停机等待上线
原实例禁用写入
原实例禁用所有Login,防止有新增的数据写入,使用下述脚本
注意:下述脚本仅打印,不执行,需要验证SQL后手动执行。
DECLARE @loginName NVARCHAR(128);
DECLARE @sql NVARCHAR(MAX);
DECLARE login_cursor CURSOR FOR
SELECT name
FROM sys.server_principals
WHERE type_desc IN ('SQL_LOGIN', 'WINDOWS_LOGIN', 'WINDOWS_GROUP')
AND is_disabled = 0
AND name NOT IN ('sa');
OPEN login_cursor;
FETCH NEXT FROM login_cursor INTO @loginName;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'ALTER LOGIN [' + @loginName + '] DISABLE;';
PRINT @sql
--EXEC sp_executesql @sql;
FETCH NEXT FROM login_cursor INTO @loginName;
END
CLOSE login_cursor;
DEALLOCATE login_cursor;
禁用所有Login之后,为了避免存在长连接,可以重启原实例的SQL Server。
执行最后一次备份&还原操作
该步骤参考之前的“上传增量文件”,这里不再赘述。
上线数据库
上线数据库本质是对应restore with recovery步骤,操作界面如图,可以看到一致性选择有两个选项,这里建议选择“异步执行DBCC”。
数据库上线之后
更新统计信息
数据库迁移之后,同样的负载会变慢一个比较常见的原因是没有及时更新统计信息,我们可以在数据库中执行SQL更新统计信息,如下所示。
EXEC sp_updatestats;
GO
也可以通过阿里云控制台更新统计信息。
使用阿里云DAS确认瓶颈
上线后使用阿里云DAS进行性能监控,及时发现并优化可能存在的性能瓶颈。如图所示,一些明显有问题的语句,可以很容易定位捕获,并进行针对性的调优。
小结
本文详细介绍了将SQL Server数据库从线下迁移到阿里云RDS的完整流程,主要包括以下几个方面:
- 事前准备:包括迁移Login、修改RDS白名单、设置RDS实例参数及迁移必要的作业
- 数据迁移:通过备份还原方式进行,包括全量备份、差异备份和日志备份的制作与恢复
- 割接切换:在业务低峰期进行最小化停机迁移,包括禁用源库写入、执行最后一次备份还原和上线数据库
- 上线后优化:更新统计信息并使用阿里云DAS进行性能监控
通过遵循本文的物理备份上云流程,可以确保SQL Server数据库迁移到阿里云RDS的过程平稳、高效,最大限度减少业务中断时间,同时保证迁移后的数据库性能达到预期。
迁移后建议持续监控系统性能一段时间,对可能出现的问题进行及时调整,确保业务系统稳定运行。
如何通过物理备份将线下SQL Server迁移到阿里云RDS for SQL Server的更多相关文章
- 阿里云RDS for SQL Server使用的一些最佳实践
了解RDS的概念 这也是第一条,也是最重要的一条,在使用某项产品和服务之前,首先要了解该产品或服务的功能与限制,就像你买一个冰箱或洗衣机,通常也只有在阅读完说明书之后才能利用起来它们的所以功能,以及使 ...
- 强强联合 阿里云 RDS for SQL Server 与 金蝶 K/3 WISE 产品实现兼容适配
强强联合 阿里云 RDS for SQL Server 与 金蝶 K/3 WISE 产品实现兼容适配,原K/3 WISE用户通过简单配置就可以无缝搭配RDS SQL Server使用,不需再费时费力自 ...
- 使用阿里云RDS for SQL Server性能洞察优化数据库负载-初识性能洞察
简介 数据库性能调优通常需要较高数据库水平,并伴随较多的前期准备工作,比如收集各种性能基线.不同种类的性能指标.慢SQL日志等,这通常费时费力且效果一般,当面对多个数据库时总体拥有成本会大幅增加.今天 ...
- 阿里云RDS for SQL Server测试吐槽
最近测试了一下阿里云RDS for SQL Server,有些设计简直就是反人类,让人不得不吐槽一番. 1:控制台创建数据库时,数据库名不能包含大小字母. 如上截图所示,数据库名称不能包含大写字母,好 ...
- 阿里云RDS for SQL Serrver关于权限的一个严重Bug
阿里云RDS for SQL Server的账号管理有不少小Bug,而且有一个很严重的Bug:任何普通账号,都能创建数据库.注意,我这里是说任意普通账号,任意任意普通账号!任意任意普通账号!重要的事情 ...
- 阿里云RDS数据库sql server 导入数据并添加作业小结
在阿里云购买ECS服务器和RDS数据库时,要注意网络类型要一致,最好都是VPC,否则ECS不能在内网访问RDS,只能从外网访问:在RDS控制台左侧,数据库安全性的IP白名单中添加ECS外网IP:在数据 ...
- 阿里云RDS备份 恢复到本地
目录 一.恢复准备 二.具体操作 一.恢复准备 阿里云RDS默认配置了全备份+binlog,可以精准恢复到某个时间点上. 可以下载备份的包到本地,进行本地恢复,要预留好本地的数据库容量和cpu等规格, ...
- 【故障公告】升级阿里云 RDS SQL Server 实例故障经过
昨天晚上,我们使用的阿里云 RDS SQL Server 2008 R2 实例突然出现持续 CPU 100% 问题,后来我们通过重启实例恢复了正常(详见故障公告).但是在恢复正常后发现了新问题,这台 ...
- MongoDB自建和阿里云RDS备份还原
MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功 ...
- 阿里云RDS数据库备份同步到自建库方法(SHELL脚本)
一.背景: 由于阿里云RDS生产库每天都需要备份且拷贝到自建读库,而如果使用阿里云的自动拷贝到只读实例, 费用太高, 故采用自编写同步脚本方法实现. 二.前提: 1). 已开通阿里云RDS, 且开启定 ...
随机推荐
- 记录uniapp上传图片转base64
// 图片转base64 imageToBase64() { return new Promise((reslove, reject) => { uni.getFileSystemManager ...
- Solution Set -「NOIP Simu.」20221010
会不会组题啊? 希望 trash round 少来点. 「Unkown」构造字符串 给定 \(m\) 组形如 \((x,y,z)\), 表示 \(\operatorname{lcp}(S[x: ...
- Solution -「LOCAL」菜
\(\mathscr{Description}\) Private link. 给定 \(N,L,X,Y,K\),求选出 \(0\le a_1\le a_2\le\cdots a_{N-1}\ ...
- CDS标准视图:维护策略描述 I_MaintStrategyTextData
视图名称:维护策略描述 I_MaintStrategyTextData 视图类型:基础视图 视图代码: 点击查看代码 @EndUserText.label: 'Maintenance Strategy ...
- superset 相关视频(建议初学者开始刷2天视频,开眼界)
建议集中一段时间刷视频,不用具体知道怎么操作,先明白能干什么,大概在那里弄,达到什么效果,是否符合自己的预期,然后再根据具体遇到的问题,再找视频 另外,看的时候注意有版本的不同,具体操作时候,版本不同 ...
- linux:lamp环境
关于LAMP LAMP搭建 安装php和Apache 先装php,因为安装php有apache的依赖包 yum install php 启动Apache service httpd start 启动成 ...
- sql server导入表的一些函数使用
truncate table JC_BMDA; insert into JC_BMDA(bh,mc,qdmc,pym,ty) select right('0'+rtrim(convert(varcha ...
- 一个简易socket通信结构
服务端 基本的结构 工作需要又需要用到socketTCP通讯,这么多年了,终于稍微能写点了.让我说其实也说不出个啥来,看了很多的异步后稍微对异步socket的导流 endreceive后 再begin ...
- SQL SERVER巡检脚本
print'----------------------------' print'开始巡检' print'----------------------------' print'1.查看数据库版本信 ...
- Java中的Scanner、BufferedReader 和 StreamTokenizer
1. Scanner 的使用与分析 简介: Scanner 是 Java 中一个用于解析原始类型(如 int.double 等)和字符串的类.它通常从输入流中逐个读取数据并进行解析,支持多种分隔符的使 ...