Microsoft 将 Microsoft SQL Server 2008 修复程序作为一个可下载的文件分发。 由于修补程序是累积的,因此每个新版本都包含之前 SQL Server 2008 修补程序版本中包含的所有修补程序和安全修补程序。
症状
请考虑以下情形:
您在 SQL Server 2005 或 SQL Server 2008 中运行 SQL Server Integration Services (SSIS) 包。
SSIS 包包含一个数据流任务。
您在可用内存不足的计算机上运行 SSIS 包。 内存不足情况可能会暂时或间歇性发生。
当您运行 SSIS 包时,由于内存不足的情况,数据缓冲区被写入磁盘。
在这种情况下,可能会遇到以下一个或多个症状:
症状 1
在数据到达数据流目的地之前数据被损坏。 您发现数据流目的地中的数据意外变成了以下值。
- “” : NULL、空白或空字符串值
- 0:零值或具有更高精度和刻度的零值。
- 0-0-0 0:0:0 : 虚线零日期值
注意 遇到此症状时,不会收到错误消息。
症状 2
收到以下数据类型转换错误消息之一:
错误消息 1
注意
DTS_E_OLEDBERROR。 发生 OLE DB 错误。 错误代码: 0x80004005。
OLE DB 记录可用。 源:“Microsoft SQL Native Client” Hresult: 0x80004005 说明:“强制转换规范的字符值无效”。
错误消息 2
注意
DTS_E_COLUMNSTATUSERROR。 在输入“OLE DB 目标输入” (IDNumber) 上,输入列“ColumnName” (IDnumber) 出现错误。 返回的列状态为:“转换失败,因为数据值溢出指定类型。”。
症状 3
收到以下约束冲突错误消息:
注意
DTS_E_OLEDBERROR。 发生 OLE DB 错误。 错误代码: 0x80004005。
OLE DB 记录可用。 源:“Microsoft SQL Native Client” Hresult: 0x80004005 说明:“该语句已终止。”。
OLE DB 记录可用。 源:“Microsoft SQL Native Client” Hresult: 0x80004005 说明:“违反主键约束'PrimaryKeyName'。 无法在对象'TableName'中插入重复键。“.
此外,如果在内存可用的情况下再次运行同一个 SSIS 包,则不会发生此问题。
原因
向数据流引擎发送内存资源不足通知时,数据流引擎会临时将数据缓冲区写入磁盘。 出现此问题的原因是,当数据流引擎将数据缓冲区写入磁盘时,数据值未正确设置为 NULL 或零。 因此,当数据流引擎从数据缓冲区读取数据,然后将数据写入数据流目标时,数据流目标将包含损坏的数据值。 损坏的数据值还可能导致数据类型转换错误或约束冲突错误。
解决方法
累积更新信息
SQL Server 2008 的发行版本
此问题的修补程序首次在累积更新 6 中发布。 有关如何获取 SQL Server 2008 的此累积更新程序包的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
971490 SQL Server 2008 的累积更新程序包 6 注意 由于版本是累积的,因此每个新的修补程序版本都包含之前 SQL Server 2008 修补程序版本中包含的所有修补程序和安全修补程序。 建议应用包含此修补程序的最新修补程序版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
956909 在 SQL Server 2008 发布之后发布的 SQL Server 2008 内部版本
SQL Server 2008 Service Pack 1 (SP1)
重要说明:如果运行的是 SQL Server 2008 Service Pack 1 (SP1) ,则必须安装此修补程序。
此问题的修补程序也已在 SQL Server 2008 Service Pack 1 的累积更新 3 中发布。 有关此累积更新包的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
971491 SQL Server 2008 Service Pack 1 累积更新包 3 注意 由于版本是累积的,因此每个新的修复版本都包含之前 SQL Server 2008 修复版本中包含的所有修补程序和所有安全修补程序。 Microsoft 建议考虑应用包含此修补程序的最新修补程序版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
970365 在 SQL Server 2008 Service Pack 1 发布之后发布的 SQL Server 2008 内部版本
Microsoft SQL Server 2008 修补程序是为特定的 SQL Server Service Pack 创建的。 必须将 SQL Server 2008 Service Pack 1 修补程序应用于 SQL Server 2008 Service Pack 1 的安装。 默认情况下,SQL Server Service Pack 中提供的任何修补程序都包含在下一个 SQL Server Service Pack 中。
SQL Server 2005 Service Pack 2 (SP2)
重要说明:如果运行的是 SQL Server 2005 Service Pack 2,则必须安装此修补程序。
此问题的修补程序首次在 SQL Server 2005 Service Pack 2 的累积更新 15 中发布。 有关此累积更新包的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
972510 SQL Server 2005 Service Pack 2 的累积更新程序包 15 注意 由于版本是累积的,因此每个新的修补程序版本都包含之前 SQL Server 2005 修补程序版本中包含的所有修补程序和所有安全修补程序。 Microsoft 建议考虑应用包含此修补程序的最新修补程序版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
937137 在 SQL Server 2005 Service Pack 2 发布之后发布的 SQL Server 2005 内部版本
Microsoft SQL Server 2005 修补程序是为特定的 SQL Server Service Pack 创建的。 必须将 SQL Server 2005 Service Pack 2 修补程序应用于 SQL Server 2005 Service Pack 2 的安装。 默认情况下,SQL Server Service Pack 中提供的任何修补程序都包含在下一个 SQL Server Service Pack 中。
SQL Server 2005 Service Pack 3 (SP3)
重要说明:如果运行的是 SQL Server 2005 Service Pack 3,则必须使用此修补程序。
此问题的修补程序也在 SQL Server 2005 Service Pack 3 的累积更新 5 中发布。 有关此累积更新包的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
972511 SQL Server 2005 Service Pack 3 的累积更新程序包 5 注意 由于版本是累积的,因此每个新的修补程序版本都包含之前 SQL Server 2005 修补程序版本中包含的所有修补程序和所有安全修补程序。 Microsoft 建议考虑应用包含此修补程序的最新修补程序版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
960598 在 SQL Server 2005 Service Pack 3 发布之后发布的 SQL Server 2005 内部版本
Microsoft SQL Server 2005 修补程序是为特定的 SQL Server Service Pack 创建的。 必须将 SQL Server 2005 Service Pack 3 修补程序应用于 SQL Server 2005 Service Pack 3 的安装。 默认情况下,SQL Server Service Pack 中提供的任何修补程序都包含在下一个 SQL Server Service Pack 中。
解决方法
要解决此问题,请解决内存不足的问题。 可能触发此问题的最小内存量因计算机而异。 通常,此大小介于 32 兆字节 (MB) 和 64 MB 可用内存之间。 因此,我们建议您将服务器配置为向 SSIS 分配超过 64 MB 的可用内存。
指示内存资源不足通知事件的默认可用内存量约为每 4 GB 32 MB (GB,) 最大值为每 4 GB 64 MB。 有关更多信息,请访问下面的 Microsoft Developer Network (MSDN) 网站:
https://msdn.microsoft.com/library/aa366541(vs.85).aspx
但是,很难完全防止此问题,因为在繁忙的生产服务器上可用内存可能会大幅波动。此外,在日常活动中,记忆力可能会因各种原因而减少。 要帮助减少此问题的频率,请使用以下方法之一:
方法 1
向计算机添加更多物理内存。
方法 2
在不同于运行 SQL Server 实例的计算机上运行 SSIS 包。
方法 3
如果在运行 SQL Server 实例的同一台计算机上运行 SSIS 包,请将实例的最大服务器内存配置选项设置为更小的值,以增加计算机上的可用内存。
方法 4
退出运行包含数据流任务的 SSIS 包时消耗大量内存的高压力应用程序。
方法 5
串行而不是并行运行 SSIS 包和数据流任务,以减少内存使用量的累积消耗。
方法 6
使用“详细信息”部分的“如何监视 SSIS 的内存消耗”分节中所述的方法解决内存不足问题,然后优化 SSIS 的内存使用。
状态
Microsoft 已确认在 "适用于" 部分中所列的 Microsoft 产品中存在问题。
详细信息
有关症状的更多详细信息
症状 1
如果在数据流目标中找到损坏的数据值,则损坏的数据值可能会显示为不同的表示形式,具体取决于数据类型。 例如,以下数据类型显示为损坏数据值的各种不同表示形式:
| DT_STR = “” | NULL、空白或空字符串值 |
|---|---|
| DT_I4 = 0 | 整数数据类型的零值 |
| DT_UI1 = 0 | 无符号整数数据类型的零值 |
| DT_NUMERIC = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | 具有更高精度和刻度的零值。 |
| DT_DBTIMESTAMP = 0-0-0 0:0:0 | 零日期值虚线 |
在大多数情况下,所有列和所有行都具有损坏的数据值,或者很大一部分列和行的数据值已损坏。 此外,即使数据损坏,到达目标的行总数通常也与目标处的预期行数相匹配。 这是由缓冲区问题导致的。 正在运行的数据流任务中的整个缓冲区或一组缓冲区可能会受到影响。 根据缓冲区大小和每行的数据大小,每个缓冲区可能包含数百行。
在某些高级设计中,并非数据流任务中的所有列都会受到影响。 如果通过使用表达式、派生列转换和查找转换等转换在数据流任务中操作数据,则数据的某些列可能与其预期值相同。 这是因为 SSIS 会将数据流任务期间损坏的数据替换为那些转换后的值。
在其他高级设计中,某些行可能会丢失。 由于 SSIS 数据流设计中数据方向的灵活性,如果设计在条件列中感知到意外的数据值,则损坏的数据可能会路由到意外的目标。 使用条件拆分转换或查找转换等转换时,当转换重新路由损坏的数据值时,某些行可能会丢失。 例如,在查找转换中,如果损坏的行与任何引用数据都不匹配,则这些行将被丢弃。
症状 2
由于零值在某些数据类型中不是有效值,因此当 OLE DB 提供程序转换数据类型时,可能会发生数据类型转换错误。 有时,可能还会发生数据类型溢出。 例如,日期时间数据类型的列具有“0-0-0 0:0:0”值。 此无效值将导致此类错误,因为 OLE DB 提供程序无法将零格式化为 SQL Native Client OLE DB 提供程序的有效日期值。
症状 3
由于在数据流目标中插入了重复的主键值,因此可能会发生约束冲突。 例如,在整数数据类型的列中插入多个零值,或在 varchar 数据类型的列中插入多个 NULL 值。 同样,在目标表中插入重复的键值时,可能会违反外键关系。
如何确定你是否遇到此问题
可以使用以下指示器来确定您是否遇到此问题:
可以监视 SQL Server:SSIS Pipelineperformance 对象的“缓冲区假脱机”计数器,以确定数据流引擎是否因为内存资源不足通知而将数据缓冲区写入磁盘。
还可以检查位于数据流任务的 BufferTempStoragePath 属性中指定的临时目录中的DTS.tmp文件。 如果您注意到DTS.tmp文件的大小正在增加,则数据流引擎正在将数据缓冲区写入磁盘。
如果您要确定现有 SSIS 包是否存在此问题,可以将多播转换添加到 SSIS 包中的数据流任务,以将数据副本定向到平面文件目标,以便于观察。
可用内存严重不足的另一个指示器是以下消息记录在 SSIS 包日志中:
注意
DTS_I_CANTRELIEVEPRESSURE 缓冲区管理器检测到系统虚拟内存不足,但无法交换任何缓冲区。 考虑了 8 个缓冲区,锁定了 8 个缓冲区。 由于安装的内存不足,管道可用的内存不足,其他进程正在使用它,或者锁定的缓冲区过多。
如何监视 SSIS 的内存消耗
监视内存以测量各种 SQL Server Integration Services 运行时进程的峰值使用,从而计算出最大内存使用量
使用性能监视器中 Process 对象的专用字节计数器监视各种 SQL Server Integration Services 运行时进程(如 DTExec.exe 和 DTSHost.exe 进程)的内存使用峰值。
当 SQL Server Integration Services 包运行时,在性能监视器中查找 Process 对象的专用字节计数器的最大值。 请考虑多个包并行运行的场景。 在此方案中,请将所有正在运行的进程的最大值相加以获得最大内存使用量。
监视外部进程以查找峰值和低谷
使用性能监视器中 Process 对象的专用字节计数器监视除 SQL Server 服务和 SSIS 服务以外的进程的内存使用峰值。 查找可能导致 SQL Server Integration Services 内存不足的峰值使用时间。 例如,考虑多个用户使用远程桌面协议 (RDP) 连接到服务器的高峰时间,并考虑备份软件运行的时间。
监视 SQL Server 内存使用情况,以查找峰值和低谷
如果最近的错误日志文件中未显示消息“为缓冲池使用锁定的页。”,则 Sqlservr.exe 进程的专用字节计数器可以指示SQL Server服务消耗了多少内存。
如果该消息存在于最近的错误日志文件中,请使用 SQL Server:内存管理器性能对象的“服务器内存总量 (KB) ”计数器来测量SQL Server缓冲池的内存使用情况。 此外,对 Sqlservr.exe 进程使用专用字节计数器查找缓冲池外部的内存分配 (MemToLeave) 。 服务器内存总量 (KB) 值和 MemToLeave 值这两个值的总和可以很好地估计总SQL Server内存消耗。
如果满足以下条件之一,则性能监视器和任务管理器不会显示这些缓冲池页面消耗的内存:
- 如果“在内存中锁定页”用户权限分配给了 SQL Server 服务启动帐户。
- 如果启用了 AWE 内存。
注意 如果“在内存中锁定页”用户权限未分配给 SQL Server 服务启动帐户,并且未启用 AWE,则 Sqlservr.exe 进程的专用字节计数器应指示各种 SQL Server 实例的 SQL Services 消耗的内存。
监视 Windows 中可用内存的最小值
若要监视 Windows 中的可用内存,请使用以下方法之一:
性能监视器中的可用兆字节计数器。
“任务管理器”性能“选项卡上的物理内存 (MB) - 可用值。
注意 在某些操作系统中,“物理内存 (MB) - 可用”标记为“物理内存” (K) - 可用。
参考资料
有关 MainPipeClass.BufferTempStoragePath 属性的更多信息,请访问下面的 Microsoft Developer Network (MSDN) 网站:
https://msdn.microsoft.com/library/microsoft.sqlserver.dts.pipeline.wrapper.mainpipeclass.buffertempstoragepath.aspx
有关如何使用内存配置选项优化服务器性能的更多信息,请访问下面的 Microsoft Developer Network (MSDN) 网站:
https://msdn.microsoft.com/library/aa178118(sql.80).aspx
有关性能监视器计数器的详细信息,请访问以下 Microsoft 网站:
https://technet.microsoft.com/library/cc768048.aspx
有关如何使用多播作用域的更多信息,请访问下面的 Microsoft 网站:
https://technet.microsoft.com/library/cc758554(ws.10).aspx有关 SQL Server 增量服务模型的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
935897 可从 SQL Server 团队获取增量服务模型以提供可以解决所报告问题的修补程序
有关 SQL Server 更新的命名架构的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
822499 Microsoft SQL Server 软件更新包的新命名架构
有关软件更新术语的更多信息,请单击下面的文章编号以查看 Microsoft 知识库中的相应文章:
824684 用于描述Microsoft软件更新的标准术语说明