64位操作系统不要安装32位的SQLServer

2023-02-21 00:00:00 报错 运行 应用程序 内存 寻址

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

相关文章