SQL Server数据库升级失败怎么办

升级SQL Server并不是一个原子事务,也就是说可能发生升级成功了一半,这个时候既不能回滚也不能重做。除了卸载重装,或者改注册表重新升级,好像也没有更好的办法。

最近遇到了一个数据库升级失败的案例,从SQLServer 2008R2 SP3升级到SQLServer2016SP1, 升级过程中无法通过账号”MSOLAP$SQL2008″连接Analysis Services,结果便是升级失败。后来检查连接失败的原因是因为SQL Browser服务没有启动,且SQL Browser服务的启动账号是本地账号,启动且改为admin的账号就可以了。建议在升级之前,试试用SSMS连接analysis service,如果成功再尝试升级,否则先解决此问题再升级。

连接到实例,查看数据库版本还是SQL Server 2008 R2 Sp3。尝试重新升级,但是除了shared feature, 并没有检测到需要升级的实例。

1.1 升级数据库实例到SQLServer2016SP1
1.2 升级数据库实例到SQLServer2016SP1

尝试通过control panel–>Uninstall program去卸载SQL Server 2016, 同样也找不到对应的实例。Repair数据库实例也没有任何效果。难道除了卸载SQL Server 2008 R2就没有更好的办法了吗?

通常来说,安装或者升级SQLServer数据库实例就是创建一堆文件然后在注册表里修改一些东西。数据库升级时没有检测到需要升级的实例说明某些文件或者注册表信息被修改了,卸载时没有查看到对应的数据库版本,说明这些修改并没有完成。从这两方面着手,尝试解决问题。

首先在安装路径下,看到新的路径已经生成。

1.3 数据库实例安装路径

然后注册表里,HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server目录下,新的键值已经生成,但是内容并不完整。将这些新生成的包含13的目录和注册表重新命名,比如MSSQL13.SQL2008_old。重新升级,这次能检测到此实例,且升级成功后,生成了新的目录和注册表键值。查看数据库的版本,已经到了SQLServer2016SP1。我们可以在确认数据库没有问题,业务能正常运行后删除这些标记为old的目录和注册表键值。

1.4 数据库实例注册表信息

我们可能观察到,此处reporting service还是没有升级成功,既没有生成新的注册表和文件目录,通过sql sever2016的安装介质升级和卸载均找不到此服务。最后通过安装sql server 2016 SP1的reporting service,并迁移reporting service解决了该问题。

不推荐通过改注册表的方式来解决问题,如果我们在安装前有操作系统的备份,可以在升级失败后直接回滚到升级前的状态,再次升级,但是对于一些单机版的数据库实例,没办法进行操作系统备份,或者需要较小的停机时间,可以尝试次方法。