升级SQL Server的方法归结为几个业务目标:最短的停机时间、最少的花费、最小的风险。
这几个目标通常是无法兼具的,以下每种方法都有利弊,因此根据业务情况选择正确的升级方法非常重要。
首先区别一下SQL Server中的迁移和升级术语,有时这些术语会被互换使用,但它们确实有一些不同之处。
1) 升级SQL Server意味着
2) 迁移可能包括也可能不包括SQL Server的升级,但这意味着将数据库从一个实例移动到另一个实例。
下面我们讨论上面列表中提到的升级方法思路,具体操作方法不一一列出了。
这是迁移期间升级数据库的最基本、最简单的方法,这种升级方法是50G以下的数据库的理想选择。
这其实就是异机全备+还原了,操作方法非常简单,这里略了。
这是在迁移期间升级的另一种基本且简单的方法,但注意它不是推荐的最佳实践方法。思路与前一种方法基本相同,对于较小的数据库,使用“备份和还原”进行升级更加安全可靠。
这不是推荐的迁移数据库的方法,因为您可能会遇到各种类型的问题。例如,如果源与目标之间存在SQL Server排序规则差异,attach可能会失败。如果在新服务器上复制数据库文件的目录没有SQL Server服务帐户的适当权限,则可能会失败。另一个重要原因是,如果在分离数据库并尝试附加之间的时间已经过了一两天,文件可能被误删除。如果服务器重新启动,文件可能会损坏。
假设数据库大于50 GB,并且还有预算限制。在这种情况下,哪种升级方法是合适的?
此方法不能用于迁移,因为所有操作都发生在同一服务器上,因此称为“就地升级”。这是最便宜、最快但却最危险的升级方法,不建议在生产SQL Server使用。
由于是直接升级现有SQL Server实例(所有系统和用户数据库的系统对象都会升级),如果出现任何问题,很可能将无法回滚(虚拟机可以打快照、物理机做存储快照)。预算较低且无法花钱购买硬件和软件许可证的公司可以选择这种方法,但是在升级失败的情况下,回退旧版本的花费很可能更多,并且还需要更多时间。另一个警告是,在就地升级期间,无法添加其他SQL Server功能,只能在安装完成后进行。
假设在sample模式下有一个大型数据库,比如500 GB,在每周日晚进行一次完整备份,并在其他6晚进行差异备份。
此数据库位于SQL Server 2012(源)上,另有一个SQL Server 2017实例(目标),希望升级和迁移源实例。这两个SQL Server位于不同的数据中心,两个数据中心之间的网络带宽为10 GB。进行迁移的唯一可用窗口是星期六早上,期望在2小时内完成迁移,随后进行测试。
假设在实际迁移前几周进行了备份及还原测试,所需时间如下
每周备份和还原信息 |
||||||
星期几 |
备份时间 |
备份类型 |
备份大小 |
备份持续时间 |
复制持续时间 |
恢复持续时间 |
星期日 |
晚上11点 |
全备 |
500 GB |
5小时 |
2小时 |
6小时 |
星期一 |
晚上11点 |
差异备份 |
50 GB |
30分钟 |
20分钟 |
35分钟 |
星期二 |
晚上11点 |
差异备份 |
60 GB |
35分钟 |
22分钟 |
42分钟 |
星期三 |
晚上11点 |
差异备份 |
70 GB |
40分钟 |
24分钟 |
49分钟 |
星期四 |
晚上11点 |
差异备份 |
80 GB |
50分钟 |
26分钟 |
56分钟 |
星期五 |
晚上11点 |
差异备份 |
90 GB |
55分钟 |
28分钟 |
63分钟 |
星期六 |
晚上11点 |
差异备份 |
100 GB |
60分钟 |
30分钟 |
70分钟 |
维护窗口 |
||||||
星期几 |
开始时间 |
时间结束 |
||||
星期六 |
8:00 AM |
10:00 AM |
这种使用差异还原的方法在复杂性较低但数据库很大的情况下工作很简单。
关于回滚策略,如果升级失败,只需将源服务器上的数据库更改回读写模式,应用切回即可。
其实这就是把前面那种手动备份+复制+还原的方法大部分让sqlserver自动做了。
有2个企业版SQL Server 2012实例SQL1和SQL2,操作系统是Windows Server 2012 R2。SQL1到SQL2的数据库DB3(500 GB)设置了事务日志传送。
现在希望将这些企业版SQL Server 2012升级到标准版SQL Server 2017以节省许可成本,还希望利用2017的一些新功能。自SQL Server 2016 SP1以来,微软已在SE中提供了许多EE级功能,例如压缩和数据库快照等。
决定使用当前的日志传送设置进行并排升级。当前的Windows Server 2012 R2操作系统支持SQL Server 2017,因此无需升级操作系统。计划首先升级SQL2,如果出现任何问题,回滚计划是将应用程序切回SQL Server 2012的SQL1实例。
当前生产环境日志传送简图(均为2012 EE):
注意SQL Server 2012 EE无法直接升级到SQL Server 2017 SE,因为这是从高edition降到了低edition 。因此需要在Domain2中安装另一个SQL Server 2017 SE版本的SQL3实例,如果是2012 EE到2017 EE,则不需要。
以下是使用SQL Server日志传送升级和/或迁移数据库的一般步骤:
BACKUP LOG [DB3] TO DISK = 'C:\SQLBackups\DB3.trn' WITH NORECOVERY;
RESTORE LOG DB3 FROM DISK = 'C:\SQL2012\SQL2\LogShip\DB3.trn' WITH RECOVERY
USE [master]
GO
ALTER DATABASE [DB3] SET COMPATIBILITY_LEVEL = 140
GO
RESTORE DATABASE [DB3] WITH RECOVERY;
对于核心数据库,业务要求停机时间最短,例如在5分钟内完成Windows和SQL Server升级。此时应该如何规划?
滚动升级需要至少2个SQL Server实例。升级前,主服务器和从服务器始终保持同步。可用性组(AlwaysOn AG)是进行滚动升级的一种方法,通过此方法,可保证最短的停机时间(用户、作业、链接服务器等在从服务器上都可用并准备就绪)
当应用程序连接到主节点时,进行从节点升级。只要从实例版本不低于与主节点,AG同步就不会断。不过在从节点进行升级时,事务在从服务器上将被阻塞,直到升级完成。当从实例完成升级时,确保从库已应用所有事务(建议设为同步模式)并且两个数据库都处于同步状态,然后再手动故障转移到辅助实例,此步骤可确保故障转移期间零数据丢失。
升级后的辅助节点承担主节点的角色,在旧主节点的版本与新主节点相同之前,事务不会在旧主节点应用。升级完成后,可以选择故障转移回到原主节点。在滚动升级中,应用程序基本不会停止(切换期间有中断)。
有一个业务关键数据库(500 GB),已设置2节点AG(SQLA和SQLB)。这些SQL Server运行在最新的Windows操作系统,版本为SQL Server 2016 SP2。现在需要将它们升级到SQL Server 2017,在升级过程中,需要保证始终有主从同步、同时停机时间最短。
|
SQLA |
SQLB |
SQLC |
AG1 |
Primary |
Secondary (同步) |
Secondary (异步) |
参考
Choosing a SQL Server Upgrade Method - Part 1
SQL Server In-Place Upgrade and Differential Restore Upgrade - Part 2
Side by Side SQL Server Upgrade with Log Shipping - Part 3
Minimizing Downtime for SQL Server Upgrades - Part 4
Differential Database Backups for SQL Server
In-Place Upgrade or Migration – SQLServerCentral
Upgrade availability group replicas - SQL Server Always On | Microsoft Docs