技术开发 频道

迁移变简单 SQL Server2005镜像到2008

  当镜像准备好接受事务时,我们可以配置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

 

  上面谈到的所有这些步骤加起来可能需要5到10分钟的中断时间,如果你准备充分,时间还可以缩短。我的建议是在实施升级前预先告知用户,以便让他们做好升级准备,如果可以的话,最好将你的升级计划讲给大家听,不仅可以将他们觉得升级时间很短,而且还可以增强你们之间的关系。

0
相关文章