买了个三核,却不能用老数据库 , 实在很郁闷,昨晚通宵尝试,仍不能解决。今天继续尝试,终于第一次成功安装 Sql Server 2000 的 SP4,并正常运行。网上完全找不到解决方案,微软对于安装 Sql Server 2005 的 Workaround 倒是有,但是 Sql Server 2000 的 SP4 完全没有提及。可能我这篇是目前的第一篇解决方法。
我尝试过 VMWare 、VirtualBox 、Virtual PC , 只能安装 Sql Server 2000 并不打补丁,不打补丁的时候能够运行,因为这时候的 Sql Server 2000 没有支持多核,所以没机会出错。但是从 SP3 开始就提供了多核心处理器的支持,也因此 SP3/SP4 就出现了问题。VMWare 虽然支持设置 CPU 数量,但是无论 CPU 数量设置为单还是双,均不能解决,而 VirtualBox 和 VirtualPC 只能模拟单 CPU,亦不能避免该问题。在查看日志之后,发现 Sql Server 2000 SP4 的多核心检测里出现了断言失败:
numSMT & (numSMT - 1) == 0
SMT 是 Simultaneous Multithreading,同时多线程。我想禁用 host 系统的核心能不能让同时多线程的数量减少?于是我在 host 系统只开启一个核心,期望能让这句断言通过,可是仍然不行。到底是什么令 SMT 断言失败?经过一番研究,我得到一个结论,无论核心只开启多少个,Sql Server 2000 SP4 对 SMT 数的检测是不受操作系统对核心开启或关闭的影响的(或许硬件关闭的方式会起作用,但是 BIOS 没有提供该功能,无法测试)。
以下是我的猜测:
-
SMT 数的检测过程,是通过读取 CPU 的一个属性数据直接获得一个数字,无论操作系统是否利用其中一个核心,该值在 CPU 出厂的时候已经设置为固定值(或者是 CPU 根据硬件开启的核心数量给出固定值),在 Sql Server 查询 SMT 数时,虚拟机直接将检测指令发给实际 CPU 的,所以虚拟机里的系统得到的结果仍然是三核的 SMT 数。上面的断言是在检测 numSMT 是否为 2 的次方,因此只能出现 2、4、8、16、32、64……等等这样的数字才能断言成功,三核可以支持三条指令并行,自然在检测 SMT 时不会给出一个是 2 的次方的数。
所以我朝着这个方向一直尝试,希望有方法能影响 SMT 数的检测结果。不过结果全部失败,无论是 VMWare、或是 VirtualBox,还是 VirtualPC,都直接将 CPU 的型号报告给虚拟机本身,当我每次在虚拟机里装完系统看到 CPU 型号时,我就大失所望了。当然我没有忘记尝试,无数次的尝试结果均以失败告终。
但是后来,我想起了 SVM,我的 CPU 支持 SVM 技术,Secure Virtual Machine,我的理解是用于为虚拟机程序提供硬件支持,以加速虚拟机程序的虚拟化程序。既然问题出在 CPU 给出的数据,而 SVM 又是提供了虚拟化的支持,那么说明至少在虚拟过程中,CPU 本身会对虚拟对象进行特殊处理,即是说这时候 CPU 会知道自己要提供的数据是用于虚拟化的,所以也许结果会有不同。当然,这一切我完全不了解,但是我推测大概是这样。所以我开始找找看有没有办法利用 SVM。
我用的是 Vista Home Premium,安装 Virtual PC 2007 SP1 的时候提示我的系统不受支持,不过所幸运行是正常的,而 Virtual PC 2007 SP1 里面有个启用硬件加速虚拟化的选项:Hardware Virtualization,我将该选项打开,看看能不能被成功利用(VMWare 6.0.1 和目前最新的 VirtualBox 2.0.0 没有这个选项,不知道最新的 VMWare 有没有提供支持)。
之前 Vritual PC 里面的 Windows XP 在安装 Sql Server 2000 SP4 的过程中失败并异常退出了,Sql Server 从此无法启动,但是这一次进入系统之后却正常启动了 Sql Server 2000。其实我在研究这个问题的时候头已经很晕了,完全没有去期待或注意这个事情,但是当我不小心看到 Sql Server 的服务管理器图标显示为“运行”状态时,我吃了一惊。接着我重新安装 SP4(因为之前是中途异常中止的,一些升级步骤没有成功完成),一路很顺利,再重启一下虚拟机里的系统,一切正常,打开数据库检查,一切完好,哈哈,就 是这么解决的。如果此时再关闭硬件虚拟化,则 Sql Server 重新回到不能启动的状态,重新打开又能启动了,所以该选项需要一直打开。该方法也只适用于将 Sql Server 2000 SP4 安装在虚拟机中,不能安装在实体主机。不 过类似老数据库、老开发工具(Delphi、VB6之类的,甚至.net 2002/2003),如非特别情况,我也建议使用虚拟机的系统来安装,这样不用担心新老程序共存是否会出问题。而每次重装系统之后直接安装好虚拟机,重 新打开虚拟机系统就能使用这些老工具,减少很多麻烦。这些老软件的硬件需求都很低,运行于虚拟机中对系统并不会有明显负担。
以下是关于 Sql Server 2005 和三核兼容性如何解决的方法:
我的 Sql Server 2005 是装在 VMWare 中的另外一个 Windows Server 2003 系统的,并且已经升级到 SP2,Sql Server 2005 SP2 支持三核,所以在我换三核之后,直接使用原来的虚拟机系统并没有遇到什么问题,但是网上很多人都安装不了,因为未升级之前的 Sql Server 2005 同样有类似 Sql Server 2000 SP4 的问题。我搜索了微软的知识库,找到了一篇文章,说该问题确实存在,而且不是存在于升级 Server Pack 的过程(如果只是不能升级 Server Pack,至少数据库还能启动),而是存在于安装 Sql Server 2005 本身,即是说,连安装都成问题了,谈何启动和升级。但是有个 Workaround,使用的方法此我前面的尝试方法之一类似,但是我的方法对 Sql Server 2000 SP4 无效,难道该方法对 2005 有效?不清楚,我没有尝试,因为我不需要重新安装。可是升级到 SP2 的 Sql Server 2005 能兼容三核 CPU 是事实,否则我的 Sql Server 2005 也已经出问题了。
方法大致是这样:通过 msconfig 工具,在 boot.ini 的高级设置里将操作系统利用 CPU 核心的数量限制为 2 的次方。XP 里是 NUMPROC 选项,Vista、Server 2003 是处理器数量选项,比如 1、或者 2(就是不要 3 啦)。然后重新启动系统,安装 Sql Server 2005,这时安装过程可以顺利通过,然后暂时不要改回来,等安装完 SP2 之后,再用 msconfig 工具重新改回正常启动,这样就能正常使用了。我估计 Sql Server 2005 是通过操作系统间接获取 CPU 属性,因此才能使用这个方法,因为 Sql Server 2000 SP4 用这个方法无效。
可以参照下面的图片,找到设置的地方。
Vista 设置 CPU 核心数量 |
XP 设置 CPU 核心数量 |
恢复正常启动 |
更新:
VMWare 6.5 已经支持硬件虚拟化 ,同样能正常安装 SQL Server 2000 SP4,SQL Server 2005 应该也没问题了。
转自:http://miller.rotatingscrew.com/post/2008/09/09/phenom-install-sql-server-2000-sp4-success.aspx
黑色头发:http://heisetoufa.iteye.com/