当镜像准备好接受事务时,我们可以配置principle了。
回到我们的SQL Server 2005实例,现在我们可以告诉NEEDTOUPGRADE已经成为端口5023上的伙伴。
ALTER DATABASE NEEDTOUPGRADE SET PARTNER= N'TCP://Servername:5023'
我们没有使用witness,在principle SQL Server 2005实例上,运行下面的命令关闭实例:
ALTER DATABASE NEEDTOUPGRADE SET SAFETY OFF
结束升级
为了完成升级,我们需要故障转移镜像,但这时会有个问题,当镜像失效时,SQL Server 2008将处于暂停模式,这是因为我们的镜像是单向的,简单说就是可以从2005到2008应用事务日志,但从2008到2005就不行,因此我们一直强调在故障转移之前先做备份,即使是处于暂停状态,镜像数据库的所有功能仍然有效,你可以验证应用程序,并允许用户重新登录。
清理
要移除镜像,在SQL Server 2008实例上运行:
ALTER DATABASE NEEDTOUPGRADE SET PARTNER OFF
移除镜像,清除升级镜像的配置信息,将数据库真正升级到655,但不用删除端点,你可以使用下面的命令验证数据库版本的变化:
SELECT DATABASEPROPERTY('NEEDTOUPGRADE','version')
接下来我们可以使用下面的命令将兼容级别设为100:
ALTER DATABASE NEEDTOUPGRADE SET COMPATIBILITY_LEVEL = 100
最后一步是修复NEEDTOUGPRADE数据库上可能存在的孤儿登录会话,这对于普通用户而言可能有点难度,如果你使用了SQL身份验证,可能还得重设密码,如果使用的是Windows身份验证,只需要完成孤儿登录会话,不需要修改密码,使用下面的脚步可以修复孤儿登录进程:
SET NOCOUNT ON
USE AdventureWorks
GO
DECLARE @loop INT
DECLARE @USER sysname
IF OBJECT_ID('tempdb..#Orphaned') IS NOT NULL
BEGIN
DROP TABLE #orphaned
END
CREATE TABLE #Orphaned (UserName sysname, UserSID VARBINARY(85),IDENT INT IDENTITY(1,1))
INSERT INTO #Orphaned
EXEC SP_CHANGE_USERS_LOGIN 'report';
IF(SELECT COUNT(*) FROM #Orphaned) > 0
BEGIN
SET @loop = 1
WHILE @loop <= (SELECT MAX(IDENT) FROM #Orphaned)
BEGIN
SET @USER = (SELECT UserName FROM #Orphaned WHERE IDENT = @loop)
IF(SELECT COUNT(*) FROM sys.server_principals WHERE [Name] = @USER) <= 0
BEGIN
EXEC SP_ADDLOGIN @USER,'password'
END
EXEC SP_CHANGE_USERS_LOGIN 'update_one',@USER,@USER
PRINT @USER + ' link to DB user reset';
SET @loop = @loop + 1
END
END
SET NOCOUNT OFF
USE AdventureWorks
GO
DECLARE @loop INT
DECLARE @USER sysname
IF OBJECT_ID('tempdb..#Orphaned') IS NOT NULL
BEGIN
DROP TABLE #orphaned
END
CREATE TABLE #Orphaned (UserName sysname, UserSID VARBINARY(85),IDENT INT IDENTITY(1,1))
INSERT INTO #Orphaned
EXEC SP_CHANGE_USERS_LOGIN 'report';
IF(SELECT COUNT(*) FROM #Orphaned) > 0
BEGIN
SET @loop = 1
WHILE @loop <= (SELECT MAX(IDENT) FROM #Orphaned)
BEGIN
SET @USER = (SELECT UserName FROM #Orphaned WHERE IDENT = @loop)
IF(SELECT COUNT(*) FROM sys.server_principals WHERE [Name] = @USER) <= 0
BEGIN
EXEC SP_ADDLOGIN @USER,'password'
END
EXEC SP_CHANGE_USERS_LOGIN 'update_one',@USER,@USER
PRINT @USER + ' link to DB user reset';
SET @loop = @loop + 1
END
END
SET NOCOUNT OFF
上面谈到的所有这些步骤加起来可能需要5到10分钟的中断时间,如果你准备充分,时间还可以缩短。我的建议是在实施升级前预先告知用户,以便让他们做好升级准备,如果可以的话,最好将你的升级计划讲给大家听,不仅可以将他们觉得升级时间很短,而且还可以增强你们之间的关系。