3

背景:我刚刚完成了将大约 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 与 2000 相比的新实现的一些相关性RANDNEWINT()似乎导致错误的存储过程相对简单,其中一些简单到接受单个VARCHAR参数(在限制范围内)并在表上执行单列选择。大多数甚至根本不涉及INTs,如果涉及,则值在范围内。

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

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

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

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

进一步阅读现在让我了解了应用程序池的“托管管道”模式。它们当前设置为“集成”。我做了一些阅读,我想知道是否应该将它们设置为经典以模拟 IIS6。有人对此有更多想法吗?

非常感谢埃里克

4

3 回答 3

1

你是否:

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

(2) 重建所有索引

于 2012-11-23T00:24:44.693 回答
1

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

试试看??

于 2014-10-06T23:13:18.403 回答
0

我认为发布我的发现和解决这个问题的方法可能会很有用,因为我在网上找不到任何地方提到我遇到的相同情况。

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

我用服务包 2 和累积更新包 3 更新了 SQL Server。

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

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

这就是它所提供的全部内容,我找不到有关此的任何其他细节。我增加了我网站上的日志记录,以便在出错时输出 parameters.refresh 返回的内容。我在一个实例中发现了它,它从存储过程中返回了两个变量,名称正确,但变量类型不正确。他们本来应该是 aVARCHAR和 anINT但他们都回来了CURRENCY。显然,当您尝试将字符串分配给CURRENCY. 在解决问题之前,我只设法捕获了一个错误实例。

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

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

我希望这对某人有所帮助,因为我花了 3 周时间来追踪这个问题,这令人难以置信。如有任何进一步的问题,请随时提出,如果可以,我会提供帮助。

谢谢埃里克

于 2013-01-07T09:39:59.503 回答