Solución: Recibe mensajes de error o los datos están dañados después de ejecutar un paquete SSIS que contiene una tarea de flujo de datos en una situación de memoria baja en SQL Server 2005 o en SQL Server 2008

Microsoft distribuye las correcciones de Microsoft SQL Server 2008 como un archivo descargable. Dado que las correcciones son acumulativas, cada nueva versión contiene todas las revisiones y correcciones de seguridad que se incluyeron con la versión de corrección de SQL Server 2008 anterior.

Síntomas

Tenga en cuenta el siguiente escenario:

  • Ejecuta un paquete de SQL Server Integration Services (SSIS) en SQL Server 2005 o en SQL Server 2008.

  • El paquete SSIS contiene una tarea de flujo de datos.

  • Ejecuta el paquete SSIS en un equipo con poca memoria disponible. La condición de memoria insuficiente puede producirse de forma temporal o intermitente.

  • Cuando ejecuta el paquete SSIS, los búferes de datos se escriben en el disco debido a la condición de memoria insuficiente.

En esta situación, puede experimentar uno o varios de los síntomas siguientes:

Síntoma 1

Los datos están dañados antes de que lleguen al destino del flujo de datos. Observa que los datos en el destino del flujo de datos se convierten en los siguientes valores inesperadamente.

  • "" : valores de cadena NULL, en blanco o vacíos
  • 0 : valor cero o valor cero que tiene mayor precisión y escala.
  • 0-0-0 0:0:0 : valor de fecha cero discontinuo

Nota: No recibirá un mensaje de error cuando experimente este síntoma.

Síntoma 2

Recibe uno de los siguientes mensajes de error de conversión de tipo de datos:

Mensaje de error 1

Nota

DTS_E_OLEDBERROR. Error OLE DB. Código de error: 0x80004005.

Hay un registro OLE DB disponible. Fuente: "Microsoft SQL Native Client" Hresult: 0x80004005 Descripción: "Valor de carácter no válido para la especificación de conversión".

Mensaje de error 2

Nota

DTS_E_COLUMNSTATUSERROR. Error con la columna de entrada "ColumnName" (IDnumber) en la entrada "Entrada de destino OLE DB" (IDNumber). El estado de la columna devuelto fue: "Error en la conversión porque el valor de datos desbordó el tipo especificado".

Síntoma 3

Aparece el siguiente mensaje de error de infracción de restricción:

Nota

DTS_E_OLEDBERROR. Error OLE DB. Código de error: 0x80004005.

Hay un registro OLE DB disponible. Fuente: "Microsoft SQL Native Client" Hresult: 0x80004005 Descripción: "La instrucción ha finalizado".

Hay un registro OLE DB disponible. Fuente: "Microsoft SQL Native Client" Hresult: 0x80004005 Descripción: "Infracción de la restricción de CLAVE PRINCIPAL 'PrimaryKeyName'. No se puede insertar una clave duplicada en el objeto 'TableName'".

Además, si vuelve a ejecutar el mismo paquete SSIS cuando hay memoria disponible, este problema no se produce.

Causa

Cuando se envía una notificación de memoria baja al motor de flujo de datos, este último escribe temporalmente los búferes de datos en el disco. Este problema se produce porque los valores de datos se establecen incorrectamente en NULL o cero cuando el motor de flujo de datos escribe búferes de datos en el disco. Por lo tanto, cuando el motor de flujo de datos lee datos de búferes de datos y, a continuación, escribe datos en el destino del flujo de datos, el destino del flujo de datos contendrá valores de datos dañados. Los valores de datos dañados también pueden provocar errores de conversión de tipo de datos o errores de infracción de restricciones.

Resolución

Información sobre la actualización acumulativa

La versión de lanzamiento de SQL Server 2008

La corrección de este problema se publicó por primera vez en la actualización acumulativa 6. Para obtener más información acerca de cómo obtener este paquete de actualizaciones acumulativas para SQL Server 2008, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

971490 Paquete de actualización acumulativa 6 para SQL Server 2008Nota: Dado que las compilaciones son acumulativas, cada nueva corrección contiene todas las revisiones y correcciones de seguridad que se incluyeron con la versión de corrección anterior de SQL Server 2008. Recomendamos que se plantee la posibilidad de aplicar la versión de corrección más reciente que contiene esta revisión. Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

956909 Compilaciones de SQL Server 2008 se publicaron después de SQL Server 2008

SQL Server 2008 Service Pack 1 (SP1)

Importante: Debe instalar esta corrección si ejecuta SQL Server 2008 Service Pack 1 (SP1).

 También se publicó la corrección para este problema en la actualización acumulativa 3 para SQL Server 2008 Service Pack 1. Para obtener más información acerca de este paquete de actualizaciones acumulativas, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

971491 paquete de actualización acumulativa 3 para SQL Server 2008 Service Pack 1Nota Dado que las compilaciones son acumulativas, cada nueva corrección contiene todas las revisiones y correcciones de seguridad que se incluyeron con la versión de corrección anterior de SQL Server 2008. Microsoft recomienda que se plantee la posibilidad de aplicar la versión de corrección más reciente que contenga esta revisión. Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

970365 Compilaciones de SQL Server 2008 que se publicaron después de SQL Server 2008 Service Pack 1
 Las revisiones de Microsoft SQL Server 2008 se crean para Service Pack de SQL Server específicos. Debe aplicar una revisión de SQL Server 2008 Service Pack 1 a una instalación de SQL Server 2008 Service Pack 1. De forma predeterminada, cualquier revisión que se proporcione en un Service Pack de SQL Server se incluye en el siguiente Service Pack de SQL Server.

SQL Server 2005 Service Pack 2 (SP2)

Importante: Debe instalar esta corrección si ejecuta SQL Server 2005 Service Pack 2.

La corrección para este problema se publicó por primera vez en la actualización acumulativa 15 para SQL Server 2005 Service Pack 2. Para obtener más información acerca de este paquete de actualizaciones acumulativas, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

972510 Paquete de actualización acumulativa 15 para SQL Server 2005 Service Pack 2Nota: Dado que las compilaciones son acumulativas, cada nueva corrección contiene todas las revisiones y correcciones de seguridad que se incluyeron con la versión de corrección anterior de SQL Server 2005. Microsoft recomienda que se plantee la posibilidad de aplicar la versión de corrección más reciente que contenga esta revisión. Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

937137 Compilaciones de SQL Server 2005 que se publicaron después de SQL Server 2005 Service Pack 2
Se crean revisiones de Microsoft SQL Server 2005 para Service Pack de SQL Server específicos. Debe aplicar una revisión de SQL Server 2005 Service Pack 2 a una instalación de SQL Server 2005 Service Pack 2. De forma predeterminada, cualquier revisión que se proporcione en un Service Pack de SQL Server se incluye en el siguiente Service Pack de SQL Server.

SQL Server 2005 Service Pack 3 (SP3)

Importante: Debe utilizar esta corrección si ejecuta SQL Server 2005 Service Pack 3.

La corrección para este problema también se presentó en la actualización acumulativa 5 para SQL Server 2005 Service Pack 3. Para obtener más información acerca de este paquete de actualizaciones acumulativas, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

972511 paquete de actualización acumulativa 5 para SQL Server 2005 Service Pack 3Nota Dado que las compilaciones son acumulativas, cada nueva corrección contiene todas las revisiones y correcciones de seguridad que se incluyeron con la versión de corrección anterior de SQL Server 2005. Microsoft recomienda que se plantee la posibilidad de aplicar la versión de corrección más reciente que contenga esta revisión. Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

960598 Compilaciones de SQL Server 2005 que se publicaron después de SQL Server 2005 Service Pack 3
Se crean revisiones de Microsoft SQL Server 2005 para Service Pack de SQL Server específicos. Debe aplicar una revisión de SQL Server 2005 Service Pack 3 a una instalación de SQL Server 2005 Service Pack 3. De forma predeterminada, cualquier revisión que se proporcione en un Service Pack de SQL Server se incluye en el siguiente Service Pack de SQL Server.

Solución alternativa

Para solucionar este problema, resuelva la condición de memoria insuficiente. La cantidad mínima de memoria que puede desencadenar este problema varía de un equipo a otro. Por lo general, esta cantidad oscila entre 32 megabytes (MB) y 64 MB de memoria disponible. Por lo tanto, recomendamos configurar el servidor para asignar más de 64 MB de memoria disponible a SSIS.

La cantidad predeterminada de memoria disponible que señala un evento de notificación de recurso de memoria insuficiente es aproximadamente 32 MB por 4 gigabytes (GB) hasta un máximo de 64 MB por 4 GB. Para obtener más información al respecto, visite el siguiente sitio Web de Microsoft Developer Network (MSDN):

https://msdn.microsoft.com/library/aa366541(vs.85).aspx
        
Sin embargo, es difícil evitar completamente este problema porque la memoria disponible puede fluctuar mucho en los servidores de producción ocupados. Además, la memoria puede disminuir por varias razones dentro de las actividades habituales. Para ayudar a reducir la frecuencia de este problema, utilice uno de los métodos siguientes:

Método 1

Agregue más memoria física al equipo.

Método 2

Ejecute el paquete SSIS en un equipo distinto del equipo que está ejecutando la instancia de SQL Server.

Método 3

Si ejecuta el paquete SSIS en el mismo equipo que ejecuta la instancia de SQL Server, establezca la opción de configuración de memoria máxima del servidor para la instancia en un valor menor para aumentar la memoria disponible en el equipo.

Método 4

Salga de aplicaciones estresantes que consumen mucha memoria al ejecutar paquetes SSIS que contienen tareas de Data Flow.

Método 5

Ejecute paquetes SSIS y las tareas de flujo de datos en serie en lugar de en paralelo para reducir el consumo acumulado de uso de memoria.

Método 6

Utilice el método descrito en la subsección "Cómo supervisar el consumo de memoria para SSIS" en la sección "Más información" para solucionar los problemas de condición de memoria insuficiente y, a continuación, optimizar el uso de memoria para SSIS.

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft que se enumeran en la sección "Aplicable a".

Más información

Más detalles sobre los síntomas

Síntoma 1

Si encuentra valores de datos dañados en el destino del flujo de datos, los valores de datos dañados pueden aparecer como representaciones diferentes según el tipo de datos. Por ejemplo, los siguientes tipos de datos aparecen como representaciones diferentes de valores de datos dañados:

DT_STR = "" Valores de cadena NULOS, en blanco o vacíos
DT_I4 = 0 Valor cero del tipo de datos entero
DT_UI1 = 0 Valor cero del tipo de datos entero sin signo
DT_NUMERIC = 000000000000000000000000000000000000000 Valor cero que tiene mayor precisión y escala.
DT_DBTIMESTAMP = 0-0-0 0:0:0 Valor de fecha cero discontinuo

En la mayoría de los casos, todas las columnas y filas tienen los valores de datos dañados, o una parte importante de las columnas y filas tienen valores de datos dañados. Además, el número total de filas que llegan al destino suele coincidir con el número de filas esperadas en el destino, incluso cuando los datos están dañados. Esto se debe a un problema de búfer. Un búfer completo o un conjunto de búferes en la tarea de flujo de datos en ejecución pueden verse afectados. Según el tamaño del búfer y el tamaño de datos por fila, cada búfer puede contener cientos de filas.

En algunos diseños avanzados, no todas las columnas de la tarea de flujo de datos se ven afectadas. Si los datos se manipulan dentro de la tarea de flujo de datos mediante transformaciones como expresiones, transformación de columna derivada y transformación de búsqueda, algunas columnas de los datos pueden permanecer iguales a sus valores esperados. Esto se debe a que SSIS reemplaza los datos dañados durante la tarea de flujo de datos por esos valores transformados.

En otros diseños avanzados, es posible que se pierdan algunas filas. Debido a la naturaleza flexible de la dirección de datos en los diseños de flujo de datos SSIS, los datos dañados se pueden enrutar a un destino inesperado si el diseño percibe los valores de datos inesperados en la columna condicional. Cuando se usan transformaciones, como las transformaciones de división condicional o las transformaciones de búsqueda, algunas filas pueden perderse cuando la transformación vuelve a enrutar los valores de datos dañados. Por ejemplo, en las transformaciones de búsqueda, si las filas dañadas no coinciden con ningún dato de referencia, se descartarán las filas.

Síntoma 2

Como los valores cero no son valores válidos en algunos tipos de datos, pueden producirse errores de conversión de tipo de datos cuando el proveedor OLE DB convierte los tipos de datos. En ocasiones, también puede producirse un desbordamiento de tipo de datos. Por ejemplo, una columna del tipo de datos datetime tiene un valor "0-0-0 0:0:0". Este valor no válido provocará este tipo de error porque el proveedor OLE DB no puede dar formato a los ceros en un valor de fecha válido para el proveedor OLE DB de SQL Native Client.

Síntoma 3

Las infracciones de restricción pueden producirse porque se insertan valores de clave principal duplicados en el destino del flujo de datos. Por ejemplo, se insertan varios valores cero en una columna del tipo de datos Integer o se insertan varios valores NULL en una columna del tipo de datos varchar. Del mismo modo, se puede infringir la relación de clave externa cuando se insertan valores de clave duplicados en la tabla de destino.

Cómo determinar si se está produciendo este problema

Los siguientes indicadores se pueden utilizar para determinar si se está produciendo este problema:

  • Puede supervisar el contador de búferes en cola para el objeto Pipelineperformance de SQL Server:SSIS para determinar si el motor de flujo de datos escribe búferes de datos en el disco debido a una notificación de recursos de memoria insuficiente.

  • También puede examinar el archivo DTS.tmp ubicado en el directorio temporal que se especifica en la propiedad BufferTempStoragePath de la tarea de flujo de datos. Si observa que el tamaño del archivo de DTS.tmp está aumentando, el motor de flujo de datos está escribiendo búferes de datos en el disco.

  • Si desea determinar si un paquete SSIS existente tiene este problema, puede agregar una transformación de multidifusión a la tarea de flujo de datos en el paquete SSIS para dirigir una copia de los datos a un destino de archivo plano para facilitar la observación.

  • Otro indicador de que la memoria disponible es muy baja es que el siguiente mensaje se registra en el registro de paquetes SSIS:

    Nota

    DTS_I_CANTRELIEVEPRESSURE El administrador de búferes detectó que el sistema no tenía suficiente memoria virtual, pero no pudo intercambiar ningún búfer. Se consideraron 8 búferes y se bloquearon 8. O bien no hay suficiente memoria disponible para la canalización porque no hay suficiente instalada, otros procesos la están usando o hay demasiados búferes bloqueados.

Cómo supervisar el consumo de memoria para SSIS

Supervise la memoria para medir el uso máximo de varios procesos de tiempo de ejecución de SQL Server Integration Services para calcular el uso máximo de memoria

Supervise el uso máximo de memoria de los distintos procesos de SQL Server Integration Services Runtime, como los procesos de DTExec.exe y DTSHost.exe, utilizando el contador de bytes privados del objeto Process en el Monitor de rendimiento.

Cuando los paquetes de SQL Server Integration Services se estén ejecutando, busque el valor máximo para el contador de bytes privados del objeto de proceso en el Monitor de rendimiento. Considere el escenario en el que varios paquetes se ejecutan en paralelo. En este escenario, agregue los valores máximos de todos los procesos que se están ejecutando para obtener el máximo uso de memoria.

Monitorear los procesos externos para encontrar los picos y valles

Supervise el uso máximo de memoria de procesos distintos del servicio SQL Server y el servicio SSIS utilizando el contador de bytes privados del objeto Proceso en el Monitor de rendimiento. Busque los tiempos de uso máximo que pueden causar poca memoria para SQL Server Integration Services. Por ejemplo, considere las horas punta en las que varios usuarios usan el Protocolo de escritorio remoto (RDP) para conectarse al servidor y las horas en que se ejecuta el software de copia de seguridad.

Supervise el uso de memoria de SQL Server para encontrar los picos y valles

Si el mensaje "Uso de páginas bloqueadas para el grupo de búferes" no está presente en el archivo de registro de errores reciente, el contador de bytes privados para el proceso de Sqlservr.exe puede indicar cuánta memoria consumen los servicios SQL Server.

Si el mensaje está presente en el archivo de registro de errores reciente, utilice el contador de memoria total del servidor (KB) del objeto de rendimiento de SQL Server: Memory Manager para medir el uso de memoria del grupo de búferes de SQL Server. Además, use el contador de bytes privados para el proceso de Sqlservr.exe con el fin de buscar las asignaciones de memoria fuera del grupo de búferes (MemToLeave). La suma de los dos valores, el valor de memoria total del servidor (KB) y el valor MemToLeave, es una buena estimación del consumo total de memoria de SQL Server.

El Monitor de rendimiento y el Administrador de tareas no muestran la memoria consumida por estas páginas del grupo de búferes si se cumple una de las siguientes condiciones:

  • Si el derecho de usuario Bloquear páginas en memoria se asigna a la cuenta de inicio del servicio SQL Server.
  • Si la memoria AWE está habilitada.

Nota: Si el derecho de usuario Bloquear páginas en memoria no está asignado a la cuenta de inicio del servicio SQL Server y el AWE no está habilitado, el contador de bytes privados para el proceso de Sqlservr.exe debe indicar la memoria consumida por los servicios SQL para las distintas instancias de SQL Server.

Supervisar el valor mínimo de la memoria disponible en Windows

Para supervisar la memoria disponible en Windows, use uno de los métodos siguientes:

  • El contador de MBytes disponibles en el Monitor de rendimiento.

  • Valor de Memoria física (MB): disponible en la pestaña Rendimiento del Administrador de tareas.

    Nota: En algunos sistemas operativos, la memoria física (MB): gratuita, se etiqueta como memoria física (K): disponible.

Referencias

Para obtener más información acerca de la propiedad MainPipeClass.BufferTempStoragePath, visite el siguiente sitio Web de Microsoft Developer Network (MSDN):

https://msdn.microsoft.com/library/microsoft.sqlserver.dts.pipeline.wrapper.mainpipeclass.buffertempstoragepath.aspx
Para obtener más información acerca de cómo optimizar el rendimiento del servidor mediante las opciones de configuración de memoria, visite el siguiente sitio Web de Microsoft Developer Network (MSDN):

https://msdn.microsoft.com/library/aa178118(sql.80).aspx
Para obtener más información acerca de los contadores del Monitor de rendimiento, visite el siguiente sitio Web de Microsoft:

https://technet.microsoft.com/library/cc768048.aspx
Para obtener más información acerca de cómo utilizar los ámbitos de multidifusión, visite el siguiente sitio web de Microsoft:

https://technet.microsoft.com/library/cc758554(ws.10).aspxPara obtener más información acerca del modelo de servicio incremental para SQL Server, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

935897 Un modelo de servicio incremental está disponible en el equipo de SQL Server para entregar revisiones para problemas detectados

Para obtener más información acerca del esquema de nomenclatura de las actualizaciones de SQL Server, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

822499 Nuevo esquema de nomenclatura de los paquetes de actualización de software de Microsoft SQL Server

Para obtener más información acerca de la terminología relativa a las actualizaciones de software de Microsoft, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

824684 Descripción de la terminología estándar que se usa para describir las actualizaciones de software de Microsoft