在 SSRS 2008R2 SP2 上,10 个以上的报告中只有 2 个无法呈现
Only 2 reports out of >10 fail to render on SSRS 2008R2 SP2
整个报告集在 SSRS 2005 生产中运行良好,在 SSRS 2008 R2 SP2 Dev/UAT 区域中仍然运行良好,但在新的生产服务器上,其中两个报告立即失败(不是超时问题!)并出现以下错误:
An error occurred within the report server database. This may be due to a connection failure, timeout or low disk condition within the database. (rsReportServerDatabaseError)
A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - The specified network name is no longer available.)
在访问数据库(使用单个共享数据源)或查询数据(嵌入 SQL)的方式上,这两个报告与其他报告之间似乎没有任何区别。他们的 SQL 语句在 design/Run 查询模式和 return 中工作得很好,就像在其他报告中一样即时。这些报告在开发机器上的 BIDS 和生产机器上的 ReportBuilder 中也能正常工作。
在我们上传所有报告后,另一份报告出现了几次相同但间歇性的问题,但我现在已经有一个星期无法重现了。
从那时起,我重新创建了一个全新的 SSRS 数据库、数据源,从它正在工作的 UAT 下载报告并上传到新服务器,在那里它甚至在显示参数面板之前一直失败。
尝试了以下但没有成功:
- SSRS 数据库增长大小从默认的 1 MB 增加到 10 MB(有大量 space 用于数据和日志)
- 将服务器的 'max text repl size' 参数增加到 2147483647 或无限 (-1)
- 将用户添加到 RSExecRole(在 UAT 中没有它也能工作)
- 从共享数据源更改为嵌入式并返回
通过打开 SSRS 详细调试,我收集了日志,发现调用报告时,它成功执行了两个数据集之一,然后失败并出现上述错误,而没有在日志中写入更多条目。从详细的日志来看,它似乎甚至没有尝试执行第二个数据集。
除了 space 的 timeout/lack 之外,是否还有其他原因导致此类失败?
在对有问题的 2 个报告和其他报告进行了大量检查后,发现它们非常相似,只有实际的报告数据源不同,我终于获准有额外的时间从头开始重新创建它们。
我一开始只创建参数并将它们的值转储到报告中。然后我添加了其中一个数据集。测试报告仍然有效。其中一个参数原本是基于查询的 multi-select 并且被隐藏了。它用于使用参数值数组查找英语到法语的翻译值。这显然是一个 hack,但见鬼的是,它为这十几份报告工作了 10 多年。一旦我将参数配置为使用可用值的数据集,就会重现上述错误。
因为我从来没有以这种方式设计查找,所以我完全删除了基于查询的隐藏参数,并将使用它进行查找的所有单元格更改为直接在基础数据集上使用 Lookup()
函数。
报告现在可以使用了。我们没有触及其余报告,他们仍在使用 "hack"。去想一想 SSRS 不喜欢这两个的地方。
整个报告集在 SSRS 2005 生产中运行良好,在 SSRS 2008 R2 SP2 Dev/UAT 区域中仍然运行良好,但在新的生产服务器上,其中两个报告立即失败(不是超时问题!)并出现以下错误:
An error occurred within the report server database. This may be due to a connection failure, timeout or low disk condition within the database. (rsReportServerDatabaseError)
A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - The specified network name is no longer available.)
在访问数据库(使用单个共享数据源)或查询数据(嵌入 SQL)的方式上,这两个报告与其他报告之间似乎没有任何区别。他们的 SQL 语句在 design/Run 查询模式和 return 中工作得很好,就像在其他报告中一样即时。这些报告在开发机器上的 BIDS 和生产机器上的 ReportBuilder 中也能正常工作。
在我们上传所有报告后,另一份报告出现了几次相同但间歇性的问题,但我现在已经有一个星期无法重现了。
从那时起,我重新创建了一个全新的 SSRS 数据库、数据源,从它正在工作的 UAT 下载报告并上传到新服务器,在那里它甚至在显示参数面板之前一直失败。
尝试了以下但没有成功:
- SSRS 数据库增长大小从默认的 1 MB 增加到 10 MB(有大量 space 用于数据和日志)
- 将服务器的 'max text repl size' 参数增加到 2147483647 或无限 (-1)
- 将用户添加到 RSExecRole(在 UAT 中没有它也能工作)
- 从共享数据源更改为嵌入式并返回
通过打开 SSRS 详细调试,我收集了日志,发现调用报告时,它成功执行了两个数据集之一,然后失败并出现上述错误,而没有在日志中写入更多条目。从详细的日志来看,它似乎甚至没有尝试执行第二个数据集。
除了 space 的 timeout/lack 之外,是否还有其他原因导致此类失败?
在对有问题的 2 个报告和其他报告进行了大量检查后,发现它们非常相似,只有实际的报告数据源不同,我终于获准有额外的时间从头开始重新创建它们。
我一开始只创建参数并将它们的值转储到报告中。然后我添加了其中一个数据集。测试报告仍然有效。其中一个参数原本是基于查询的 multi-select 并且被隐藏了。它用于使用参数值数组查找英语到法语的翻译值。这显然是一个 hack,但见鬼的是,它为这十几份报告工作了 10 多年。一旦我将参数配置为使用可用值的数据集,就会重现上述错误。
因为我从来没有以这种方式设计查找,所以我完全删除了基于查询的隐藏参数,并将使用它进行查找的所有单元格更改为直接在基础数据集上使用 Lookup()
函数。
报告现在可以使用了。我们没有触及其余报告,他们仍在使用 "hack"。去想一想 SSRS 不喜欢这两个的地方。