从SQL Server 2000迁移到2008之后,来自Classic ASP的间歇“超出当前范围”& IIS6,IIS7

时间:2012-11-23 00:16:28

标签: sql-server-2008 asp-classic iis-7.5

背景:我刚刚完成了将大约50个经典ASP站点从IIS6 / Sever 2003和SQL Server 2000环境迁移到nginx负载均衡器后面的2台机器的新虚拟环境。每台MS机器都运行IIS7.5和SQL Server 2008 R2。他们目前每个人都有6Gb& 2个VCPU。数据库以镜像配置设置(目前没有见证人)。

在测试过程中,所有网站似乎都能正常运行。

一旦实时流量开始流入网站,很快就会发现初始资源分配(2Gb& 1 VCPU太低而且很快增加)。主要问题来自于服务器上大约10个(可能包括最繁忙的)站点发生的间歇性ASP错误。他们将从ASP错误

产生500响应
  

提供商错误'8002000a'超出当前范围。

所有研究都指出数字太大而无法容纳整数变量的原因,有些人提到与SQL Server 2008中RANDNEWINT()的较新实现相比较似乎导致错误的存储过程相对简单,有些只是接受单个VARCHAR参数(在限制范围内)并在表上执行单列选择。大多数人甚至根本不涉及INT,如果他们这样做,那么这些值都在范围内。

错误可以在一台机器上出现一段给定的时间,而在同一时间内,其他服务器不一定会出现错误,但有时会出错。一段时间后,错误将停止发生,这似乎与过度过载的系统资源无关。

ASP到数据库是通过DSN使用SQL Server Client 10驱动程序完成的。代码使用ADODB连接和命令对象。此代码在之前的服务器上已经工作了6年多。数据库设置为兼容模式80(SQL Server 2000)。

任何人都可以了解我应该尝试解决的问题吗?如果我可以分享任何其他信息,具体的代码片段等请告诉我。

更新: 我认为下面的UPDATEUSAGE答案已经得到了它,但遗憾的是它稍后又重新开始了。经过一番思考后,我有以下想法......有两个IIS实例,它们彼此独立,它们都与单个数据库通信,无论它是否是本地的,它们都执行相同的同步代码使用相同语法和有效变量的代码很长一段时间。由于通过IIS执行的ASP是这个等式中唯一不是单点的层,因为这是我的目标。当问题再次出现时,我在机器上重新启动了IIS,显示错误(情况通常是它只发生在两个服务器之一上)。 IIS的重启似乎解决了这个问题。然后它发生在具有不同站点的其他服务器上,再次重新启动IIS似乎可以解决问题。

现在进一步阅读已经引导我进入应用程序池的“托管管道”模式。它们目前设置为“集成”。我做了一些阅读,我想知道是否应将它们设置为经典来模拟IIS6。有没有人对此有任何想法?

非常感谢 埃里克

3 个答案:

答案 0 :(得分:1)

你有没有:

(1)更新使用情况计数器:在早期版本的SQL Server中,表和索引行计数以及页数的值可能会变得不正确。要更正任何无效的行或页数,请在升级后的所有数据库上运行DBCC UPDATEUSAGE

(2)重建所有索引

答案 1 :(得分:1)

我遇到了同样的问题,并将其追踪到我的数据库中的字段定义,我将其定义为一个长整数。我在那里的价值有一些像53435534126262,立即将其更改为文本字段,问题消失

试试??

答案 2 :(得分:0)

我认为将这些问题的发现和解决方案发布到这个问题上可能很有用,因为我发现在网络上没有提到我的相同情况。

我经历了一些步骤,每个步骤似乎都减少了错误的频率但却没有消除它们。首先,我将数据库身份验证方法更改为SQL而不是基于Windows。起初我改变了所有站点以使用相同的登录,但后来我将它们更改为使用唯一登录。

我使用Service Pack 2和累积更新包3更新了SQL Server。

如上所述,上述步骤减少了错误的频率,但没有阻止它们。我开始查看所有站点用来管理数据库连接和存储过程使用的类。我遇到了这句话adocommand.parameters.refresh我读到了它实际上做了什么,当它被调用时,它调用数据库来检索给定存储过程的参数,以便它们可以作为ASP中的对象访问而不是必须以特定顺序给出参数并手动将类型分配给它们。在详细介绍此方法的Microsoft页面上,它有一个小脚注,上面写着

  

在某些情况下,Parameters.refresh会失败或返回不完全正确的信息。在ASP页面上使用时,Parameters.refresh特别容易受到攻击。

这就是它给出的所有内容,我找不到任何其他有关此内容的详细信息。我增加了我的网站上的日志记录,在出错时,输出了什么参数.refresh已经返回。我在一个实例中捕获它,从存储过程返回两个变量,具有正确的名称,但没有正确的变量类型。它们应该是VARCHARINT,但它们都是CURRENCY。当您尝试将字符串分配给CURRENCY时,显然会出现错误。在修复问题之前,我只设法抓住了这个错误的一个实例。

我发现似乎解决问题的唯一方法是使用基于ODBC的驱动程序(DSN或DSNless),并使用带有“PROVIDER”关键字的SQL Native Client OLE DB驱动程序。这具有额外的好处,即当它以前似乎没有工作时,似乎启用了连接池。

更改为驱动程序的一个副作用是存储过程和ASP容易受到存储过程返回的中间结果的影响,如果其中有多个语句并且没有明确设置为SET NOCOUNT ON顶端。我发现可以在数据库实例级别为所有解决此问题的数据库设置NOCOUNT标志,而不是尝试更新1000多个存储过程。

我希望这对某人有所帮助,因为我花了3个星期的时间来追踪这个问题。随意提出任何进一步的问题,如果可以,我会帮忙。

由于 埃里克