买了个三核,却不能用老数据库 , 实在很郁闷,昨晚通宵尝试,仍不能解决。今天继续尝试,终于第一次成功安装 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 有没有提供支持)。
Virtual PC 设置硬件虚拟化
之前 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 用这个方法无效。
可以参照下面的图片,找到设置的地方。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
0 ExtJS 给textfield赋值的方法总结 var value=”值”; (1) fs.form.findField(id/name).setValue(value); (2) Ext.get(id/name).setValue(value); (3)…