IIS网站迁移的必备工具和脚本 webdeploy

[ 2018-05-23 15:21:30 | 作者: admin ]
字号: | |
http://www.cnblogs.com/fcu3dx/archive/2011/12/09/2281481.html

这2周一直在给客户做网站迁移项目,搜罗了几个强大的迁移工具和脚本,特别感谢搞存储的吴SIR提供的FASTCOPY工具,使大量的WEB文件的网络拷贝时间大为缩短,加快了工作的进度,谢谢吴SIR!

     

Web网站迁移主要涉及到以下3类数据的迁移(变更程度较小的数据,排在前面,优先迁移)

     

1、Web网站配置数据。包括虚拟站点、虚拟目录、目录权限、应用池等等,必备工具是iismt和webdeploy

.iismt主要用于IIS4.0、IIS5.0、IIS6.0之间的配置数据和Web文件数据的迁移

.webdeploy主要用于IIS6.0、IIS7.0、IIS7.5之间的配置数据和Web文件数据的迁移

不建议降级迁移数据,如从IIS7.0向IIS6.0迁移。相同版本IIS之间可以迁移配置数据。

     

2、Web文件数据。包括网站物理路径下的Web文件数据,由于数据量较大,推荐使用的工具是FastCopy,另外为了使新的Web服务器的虚拟目录对应的物理路径能与源服务器相同,在规划新Web服务器的物理硬盘分区时,盘符和盘的数量要尽可能保持一致,如旧Web服务器虚拟站点的虚拟目录分别在D:、E:、F:、G:盘,那么新Web服务器也要划出这4个分区,相同盘符进行数据拷贝,这样才可以保证在迁移后路径指向的正确性

     

3、Web网站数据库数据。通常包括Web DB数据库,以及DB中的帐号及对应密码和权限的迁移。DB的迁移可以利用数据库自带的备份/还原、分离/附加、停止服务/拷贝附加、数据镜像等方法,在项目中我主要使用了备份/还原的方式。而DB的帐号连同密码、相关权限的迁移,主要用到的工具脚本是sp_help_revlogin

     

上述提到的4个工具都是免费的,它们的下载地址和说明参见以下URL:

     

IIS 6.0 Migration Tool
http://www.microsoft.com/downloads/details.aspx?FamilyID=2aefc3e4-ce97-4f25-ace6-127f933a6cd2&displaylang=en&displaylang=en

     

Web Deploy 1.1
http://www.iis.net/download/webdeploy

     

FastCopy:
http://www.duote.com/soft/259.html

     

sp_help_revlogin
http://support.microsoft.com/kb/246133/zh-cn

     

下面给出数据迁移示范

     

1、Web网站配置数据的迁移。由于webdeploy工具不能支持从IIS5.0(Windows 2000)直接迁移到IIS7.5(Windows 2008 R2),因此只能使用IIS6.0(Windows 2003)进行中转(我使用的是虚拟机),先使用iismt工具将IIS5.0的配置导入到IIS6.0,再使用webdeploy将IIS6.0的配置导入到IIS7.5,操作步骤如下:

     

先在中转用的Windows 2003上安装IIS6.0(将asp选上),并同时安装iismt和webdeploy工具,安装webdeploy时如果提示需要先安装.Net 2.0 SP1

其下载地址:

http://www.microsoft.com/downloads/details.aspx?familyid=79BC3B77-E02C-4AD3-AACF-A7633F706BA5&displaylang=zh-cn

     

在开始/程序菜单中运行iismt命令行窗口,输入以下命令将源服务器节点的IIS5.0的数据直接导入IIS6.0


上述命令参数说明:

192.168.121.111,是源服务器节点,即IIS5.0所在的web服务器IP地址

w3svc/1,是目标服务器节点中IIS6.0的第1个网站(通常就叫"默认Web站点"),如果是导入到第2个网站就填w3svc/2,依此类推

/user administrator,是提交给源服务器进行操作的权限,这里使用管理员帐号

/password xxxxx,是提交给源服务器认证administrator帐号的口令

/configonly,只导入配置,不导入Web文件。这个参数很重要,因为作为中转的Windows 2003没有足够的空间来存储IIS5.0网站的WEB文件,所以配置数据与WEB文件分开迁移,配置数据通过IIS5.0-->IIS6.0-->IIS7.5的过程迁移,Web文件直接IIS5.0-->IIS7.5过程,这样就把配置与文件最终迁移到IIS7.5,并避免了庞大的WEB文件迁移2次的问题。

     

上述命令运行后,对比IIS5.0和IIS6.0,发现除系统环境有关的如IISAdmin、IISHelp等虚拟目录未迁移外,其余的用户配置都完全一致,迁移OK:



接下来我们使用Webdeploy将IIS6.0的配置移往IIS7.5。在中转的Windows 2003上,通过开始/程序,打开Web Deploy命令行,输入下列命令将IIS6.0的配置先导入到一个归档目录c:\archivedir中:


上述命令参数说明:

-verb:sync,同步Web配置及数据(我没有看到类似configonly只导配置的参数),由于前边用iismt的/configonly只导了配置数据,所以就没有Web文件数据,这正是我想要的结果!

-source:metakey=lm/w3svc/2,将IIS6.0本地的第2个虚拟站点的配置导出

-dest:archivedir=c:\archivedir,将IIS6.0导出的配置先归档到c:\archivedir中

     

我们拿先前一个即带有WEB配置又带有WEB文件内容的c:\archivedir来分析一下
很显然,除了虚拟目录的层次结构外,还导入了虚拟目录指向的物理路径下的WEB文件,所以,如果要归档内容的话,要准备好在本机拥有足够的剩余空间。不过,Webdeploy还支持远程直接迁移Web文件数据,只是如果网络太慢或者不稳定,恐怕就不好搞了。而后面介绍FastCopy所支持的断点拷贝特性,对付网络不稳定,那是相当棒的!

     

接下来我们要注意一个事项,如果IIS5.0服务器定义了多个应用池,那么在IIS6.0通过iismt导入过来时就可能由于IIS6.0没有预先定义这些应用池,而将所有的配置指向到IP_Pooled,在使用Webdeploy归档后,我们要及时全部替换掉,可以替换成IIS7.5的DefaultAppPool,后面再参照IIS5.0的配置在IIS7.5上手动配过。找到归档的archive.xml

进行替换并保存。



接下来我们就可以把c:\archivedir下的内容拷贝到Windows 2008 R2,然后安装Webdeploy x64版本(需要先安装OS自带的.NET3.5),再次使用webdeploy命令导入Web配置,这样,就完成了Web配置从IIS5.0-->IIS6.0-->IIS7.5的整个过程。



webdeploy有个好用的-whatif参数,可以在不真实执行操作的情况下对操作过程进行测试,相当于SQL中的调试功能,如果测试没有任何错误信息(红字标明),就可以去掉该参数,执行操作。操作过程中出现一些黄色警告,操作仍可继续,但如果是红色错误,则操作会中止,必须完全解决错误才能再次执行。比如遇到下列错误信息:

必须填加一个encryptPassword参数才能运行正确


上述命令中-source:webserver60中指迁移整个主机节点上的网站,如果主机WEB服务器的版本是IIS6.0,就必须指定webserver60作为参数值。

2、Web文件数据的迁移。使用FastCopy进行,正如本文篇首所示,使用FastCopy几乎可以达到网卡利用率的极限,使用过程中,网络传输速率也达到了以太网理论速度的极限,即100MB网络达到60、70MB的速度,除以10左右,传输速度显示为6MB/秒、7MB/秒的总速率。设置中主要调整的参数是缓存值的调整,如果内存足够大,可以运行多个进程,并把内存尽可能的分配出去,以达到高速传输的目的

当然,如果实际使用过程中速度不高,不要忘了,点到点的传输,取决于中间经过的所有节点的传输速度,这可能包括节点主机、交换机、路由器、防火墙....总的速度总是等于速度最低的那个设备的速度,哥你是知道的。

     

另外,吴SIR告诉我这款软件是小日本开发的(从帮助手册全是日文也可以看得出来),这么好的软件,微软为什么不收购一下呢?如果再配之以现在WIN7/WIN2008的SMB2网络多线程技术,这网上邻居的速度那叫一个HIGH啊!

     

3、Web网站数据库数据。主要示范一下DB帐号的迁移,包括帐号对应的密码、系统权限、数据库权限一块迁移。

注:在迁移帐号前必须先把各个数据库迁移过来,否则数据库权限对不上会执行出错。

     

将下面这段代码存成accountexport.sql脚本(该脚本也可以在上述URL中下载),并放到源Windows 2000服务器的MSSQL2000 Master数据库中运行:

----- Begin Script, Create sp_help_revlogin procedure -----

USE master
GO
IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
     DROP PROCEDURE sp_hexadecimal
GO
CREATE PROCEDURE sp_hexadecimal
         @binvalue varbinary(256),
         @hexvalue varchar(256) OUTPUT
AS
DECLARE @charvalue varchar(256)
DECLARE @i int
DECLARE @length int
DECLARE @hexstring char(16)
SELECT @charvalue = '0x'
SELECT @i = 1
SELECT @length = DATALENGTH (@binvalue)
SELECT @hexstring = '0123456789ABCDEF'
WHILE (@i <= @length)
BEGIN
     DECLARE @tempint int
     DECLARE @firstint int
     DECLARE @secondint int
     SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
     SELECT @firstint = FLOOR(@tempint/16)
     SELECT @secondint = @tempint - (@firstint*16)
     SELECT @charvalue = @charvalue +
         SUBSTRING(@hexstring, @firstint+1, 1) +
         SUBSTRING(@hexstring, @secondint+1, 1)
     SELECT @i = @i + 1
END
SELECT @hexvalue = @charvalue
GO

IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL
     DROP PROCEDURE sp_help_revlogin
GO
CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS
DECLARE @name sysname
DECLARE @xstatus int
DECLARE @binpwd varbinary (256)
DECLARE @txtpwd sysname
DECLARE @tmpstr varchar (256)
DECLARE @SID_varbinary varbinary(85)
DECLARE @SID_string varchar(256)

IF (@login_name IS NULL)
     DECLARE login_curs CURSOR FOR
         SELECT sid, name, xstatus, password FROM master..sysxlogins
         WHERE srvid IS NULL AND name <> 'sa'
ELSE
     DECLARE login_curs CURSOR FOR
         SELECT sid, name, xstatus, password FROM master..sysxlogins
         WHERE srvid IS NULL AND name = @login_name
OPEN login_curs
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd
IF (@@fetch_status = -1)
BEGIN
     PRINT 'No login(s) found.'
     CLOSE login_curs
     DEALLOCATE login_curs
     RETURN -1
END
SET @tmpstr = ''
PRINT @tmpstr
PRINT ''
PRINT 'DECLARE @pwd sysname'
WHILE (@@fetch_status <> -1)
BEGIN
     IF (@@fetch_status <> -2)
     BEGIN
         PRINT ''
         SET @tmpstr = '-- Login: ' + @name
         PRINT @tmpstr
         IF (@xstatus & 4) = 4
         BEGIN -- NT authenticated account/group
             IF (@xstatus & 1) = 1
             BEGIN -- NT login is denied access
                SET @tmpstr = 'EXEC master..sp_denylogin ''' + @name + ''''
                PRINT @tmpstr
             END
             ELSE BEGIN -- NT login has access
                SET @tmpstr = 'EXEC master..sp_grantlogin ''' + @name + ''''
                PRINT @tmpstr
             END
         END
         ELSE BEGIN -- SQL Server authentication
             IF (@binpwd IS NOT NULL)
             BEGIN -- Non-null password
                EXEC sp_hexadecimal @binpwd, @txtpwd OUT
                IF (@xstatus & 2048) = 2048
                    SET @tmpstr = 'SET @pwd = CONVERT (varchar(256), ' + @txtpwd + ')'
                ELSE
                    SET @tmpstr = 'SET @pwd = CONVERT (varbinary(256), ' + @txtpwd + ')'
                PRINT @tmpstr
   EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
                SET @tmpstr = 'EXEC master..sp_addlogin ''' + @name
                    + ''', @pwd, @sid = ' + @SID_string + ', @encryptopt = '
             END
             ELSE BEGIN
                -- Null password
   EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
                SET @tmpstr = 'EXEC master..sp_addlogin ''' + @name
                    + ''', NULL, @sid = ' + @SID_string + ', @encryptopt = '
             END
             IF (@xstatus & 2048) = 2048
                -- login upgraded from 6.5
                SET @tmpstr = @tmpstr + '''skip_encryption_old'''
             ELSE
                SET @tmpstr = @tmpstr + '''skip_encryption'''
             PRINT @tmpstr
         END
     END
     FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd
     END
CLOSE login_curs
DEALLOCATE login_curs
RETURN 0
GO
   ----- End Script. -----
     

运行的结果将生成2个存储过程,我们按下列命令再次运行生成的sp_help_revlogin,就得到了源DB中的所有用户帐号的信息,包括密码的HASH,可能为了安全起见,没有导出sa帐号,以免覆盖目标数据库的sa

将上述输出的结果存成一个accountimport.sql脚本,并注意修改目标服务器上授予登录权限的帐号名,比较输出内容和下图,我已将

-- Login:NBW_SERVER\Administrator

修改为目标服务器等同权限的下述帐号

-- Login:NBWCLUSTER\Administrator


在目标服务器Windows 2008 R2的MSSQL 2008 R2上执行OK,帐号自动创建完毕

查看已创建帐号的数据库权限,与源数据库完全一致,最后,还需要将各个用户登录的默认数据库手动修改一下

     

搞定!
评论Feed 评论Feed: http://blog.xg98.com/feed.asp?q=comment&id=2494

这篇日志没有评论。

此日志不可发表评论。