64位操作系统不要安装32位的SQLServer
64位操作系统不要安装32位的SQLServer,主要原因就是无法充分使用内存。
这里主要通过我遇到的一个案例进行讲解:
首先查看数据库服务器里的应用程序日志,查看到大量的报错。
这里的报错是:
升级策略卸载了AppDomain以确保应用程序的一致性。访问关键资源时内存不足,曾经运行该线程的应用程序域已卸载。
分析:
概念解释:
AppDomain是CLR的运行单元,它可以加载Assembly、创建对象以及执行程序。
AppDomain是CLR实现代码隔离的基本机制
而数据库里运行CLR,是需要单独分配一部分内存
这一部分内存叫MemToLeave,被称为MemToLeave的原因是由于SQL Server虽然大部分内存被用于缓冲区,但还需要一些连续的内存用于SQL CLR,linked server,backup buffer等操作
小结:上面的错误应该是SQLserver中分配给CLR运行的内存不充足导致的。
那么问题来了?我们现在看下图,数据库服务器的可用内存还有26G,而且数据库设置的大内存远远大于其实际使用的。那么为什么SQLServer不去使用更多的内存?
原因是:虽然操作系统是SQLServer2012 64位的,但SQLServer应用是32位的。而且版本是SQLServer2012
解释:
由于32位的SQL Server使用的是VAS进行地址分配,因此寻址空间被限制在4GB,这4GB还要有一半分给Windows,使得Buffer Pool多只能用到2G的内存,这使得32位SQL Server即使有多余的物理内存,也无法使用。
解决办法之一是通过减少Windows默认占用的2G到1G,使得SQL Server可以使用的内存变为3G。这个可以通过在Windows Server 2008中的命令行键入 BCDEdit set设置increaseuserva选项,设置值为3072MB,对于Windows Server 2003来说,需要在boot.ini中加上/3gb启动参数。
但这个办法能使用的内存也大只有3G,还是不够。而且用户的服务器是64位的,所以没有必要开启这个
另一种办法是使用AWE(AddressWindow Extension)分配内存。AWE通过计算机物理地址扩展(Physical Address Extension PAE),增加4位,使得32位的CPU寻址范围增加到2的36次方,也就是64GB。基本解决了寻址范围不够的问题。
但问题是SQLServer2012取消了这个开启Awe这个选项。
下图是SQLServer2008R2开启AWE的位置,而SQLServer2012没有
下面是32位SQLServer在各种操作系统下所能使用的大的内存:
解决办法:
就是安装64位SQLServer2012
结论:
32位的SQLServer运行在64位的操作系统上无法充分使用内存空间。
由于SQLCLR需要锁定内存空间,当应用程序的并发较大时,SQLCLR操作很多时,就会出现上述报错。由于内存空间不足,就会出现卸载AppDomain然后去装载新的应用程序域的问题。
本文来源https://www.modb.pro/db/61013
相关文章