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

http://www.cnblogs.com/fcu3dx/archive/2011/12/09/2281481.html

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

   

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

   

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

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

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

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

   

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

   

3Web网站数据库数据。通常包括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

   

下面给出数据迁移示范

   

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

   

先在中转用的Windows 2003上安装IIS6.0(asp选上),并同时安装iismtwebdeploy工具,安装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--&gtIIS6.0--&gtIIS7.5的过程迁移,Web文件直接IIS5.0--&gtIIS7.5过程,这样就把配置与文件最终迁移到IIS7.5,并避免了庞大的WEB文件迁移2次的问题。

   

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



接下来我们使用WebdeployIIS6.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.5DefaultAppPool,后面再参照IIS5.0的配置在IIS7.5上手动配过。找到归档的archive.xml

进行替换并保存。



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



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

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


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

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

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

   

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

   

3Web网站数据库数据。主要示范一下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 R2MSSQL 2008 R2上执行OK,帐号自动创建完毕

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

   

搞定!

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12131609/viewspace-732790/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/12131609/viewspace-732790/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值