A Microsoft distribui correções do Microsoft SQL Server 2008 como um ficheiro transferível. Como as correções são cumulativas, cada nova versão contém todos os hotfixes e todas as correções de segurança que foram incluídas com o anterior SQL Server 2008 corrigir lançamento.
Sintomas
Tenha em conta o seguinte cenário:
Executar um pacote SQL Server Integration Services (SSIS) no SQL Server 2005 ou no SQL Server 2008.
O pacote SSIS contém uma tarefa de fluxo de dados.
Executar o pacote SSIS num computador com pouca memória disponível. A condição de memória fraca pode ocorrer temporária ou intermitentemente.
Quando executa o pacote SSIS, as memórias intermédias de dados são gravadas no disco devido à condição de pouca memória.
Neste cenário, poderá detectar um ou mais dos seguintes sintomas:
Sintoma 1
Os dados são danificados antes de chegarem ao destino do fluxo de dados. Você descobre que os dados no destino do fluxo de dados se tornam os seguintes valores inesperadamente.
- "" : valores de cadeia NULL, em branco ou vazios
- 0: Valor zero ou valor zero que tenha maior precisão e escala.
- 0-0-0 0:0:0 : Valor de data zero tracejado
Observação Você não receberá uma mensagem de erro quando você enfrentar esse sintoma.
Sintoma 2
Você recebe uma das seguintes mensagens de erro de conversão de tipo de dados:
Mensagem de erro 1
Nota
DTS_E_OLEDBERROR. Ocorreu um erro de OLE DB. Código de erro: 0x80004005.
Está disponível um registo OLE DB. Fonte: "Microsoft SQL Native Client" Hresult: 0x80004005 Descrição: "Valor de caractere inválido para especificação de elenco".
Mensagem de erro 2
Nota
DTS_E_COLUMNSTATUSERROR. Ocorreu um erro com a coluna de entrada "ColumnName" (IDnumber) na entrada "OLE DB Destination Input" (IDNumber). O estado da coluna devolvido era: "A conversão falhou porque o valor de dados excedeu o tipo especificado.".
Sintoma 3
Você recebe a seguinte mensagem de erro de violação de restrição:
Nota
DTS_E_OLEDBERROR. Ocorreu um erro de OLE DB. Código de erro: 0x80004005.
Está disponível um registo OLE DB. Fonte: "Microsoft SQL Native Client" Hresult: 0x80004005 Descrição: "A instrução foi encerrada.".
Está disponível um registo OLE DB. Fonte: "Microsoft SQL Native Client" Hresult: 0x80004005 Descrição: "Violação da restrição PRIMARY KEY 'PrimaryKeyName'. Não é possível inserir chave duplicada no objeto 'TableName'.".
Além disso, se executar o mesmo pacote SSIS novamente quando houver memória disponível, este problema não ocorre.
Causa
Quando uma notificação de poucos recursos de memória é enviada para o mecanismo de fluxo de dados, o mecanismo de fluxo de dados grava buffers de dados no disco temporariamente. Este problema ocorre porque os valores de dados são definidos como NULL ou zero incorretamente quando o motor de fluxo de dados grava memórias intermédias de dados no disco. Portanto, quando o mecanismo de fluxo de dados lê dados de buffers de dados e, em seguida, grava dados no destino de fluxo de dados, o destino de fluxo de dados conterá valores de dados danificados. Os valores de dados danificados também podem resultar em erros de conversão de tipo de dados ou erros de violação de restrição.
Resolução
Informações de atualização cumulativa
A versão de lançamento do SQL Server 2008
A correção para este problema foi lançada pela primeira vez na Atualização Cumulativa 6. Para obter mais informações sobre como obter esse pacote de atualização cumulativa para o SQL Server 2008, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
971490 Pacote de atualização cumulativa 6 para SQL Server 2008Nota Como as compilações são cumulativas, cada nova versão de correção contém todos os hotfixes e todas as correções de segurança que foram incluídas com o lançamento de correção anterior SQL Server 2008. Recomendamos que você considere aplicar o lançamento de correção mais recente que contém esse hotfix. Para mais informações, clique no número de artigo que se segue para ver o artigo na Base de Dados de Conhecimento Microsoft:
956909 As compilações SQL Server 2008 lançadas após o lançamento do SQL Server 2008
SQL Server 2008 Service Pack 1 (SP1)
Importante Tem de instalar esta correção se estiver a executar o SQL Server 2008 Service Pack 1 (SP1).
A correção para este problema também foi lançada na Atualização Cumulativa 3 para SQL Server 2008 Service Pack 1. Para obter mais informações sobre este pacote de atualização cumulativa, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
971491 Pacote de atualizações cumulativas 3 para SQL Server 2008 Service Pack 1Nota Como as compilações são cumulativas, cada nova versão de correção contém todos os hotfixes e todas as correções de segurança que foram incluídas com o SQL Server anterior 2008 corrigir lançamento. A Microsoft recomenda que você considere aplicar o lançamento de correção mais recente que contém esse hotfix. Para mais informações, clique no número de artigo que se segue para ver o artigo na Base de Dados de Conhecimento Microsoft:
970365 As compilações do SQL Server 2008 lançadas após o lançamento do SQL Server 2008 Service Pack 1
Os hotfixes do Microsoft SQL Server 2008 são criados para service packs SQL Server específicos. Tem de aplicar uma correção do SQL Server 2008 Service Pack 1 a uma instalação do SQL Server 2008 Service Pack 1. Por padrão, qualquer hotfix fornecido em um SQL Server service pack é incluído no próximo SQL Server service pack.
SQL Server 2005 Service Pack 2 (SP2)
Importante Tem de instalar esta correcção se estiver a executar o SQL Server 2005 Service Pack 2.
A correção para esse problema foi lançada pela primeira vez na atualização cumulativa 15 para SQL Server 2005 Service Pack 2. Para obter mais informações sobre este pacote de atualização cumulativa, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
972510 Pacote de atualizações cumulativas 15 para SQL Server 2005 Service Pack 2Nota Como as compilações são cumulativas, cada nova versão de correção contém todos os hotfixes e todas as correções de segurança que foram incluídas com o anterior SQL Server 2005 corrigir lançamento. A Microsoft recomenda que você considere aplicar o lançamento de correção mais recente que contém esse hotfix. Para mais informações, clique no número de artigo que se segue para ver o artigo na Base de Dados de Conhecimento Microsoft:
937137 As compilações do SQL Server 2005 lançadas após o lançamento do SQL Server 2005 Service Pack 2
Os hotfixes do Microsoft SQL Server 2005 são criados para service packs SQL Server específicos. Tem de aplicar uma correcção do SQL Server 2005 Service Pack 2 a uma instalação do SQL Server 2005 Service Pack 2. Por padrão, qualquer hotfix fornecido em um SQL Server service pack é incluído no próximo SQL Server service pack.
SQL Server 2005 Service Pack 3 (SP3)
Importante Tem de utilizar esta correcção se estiver a executar o SQL Server 2005 Service Pack 3.
A correção para esse problema também foi lançada na atualização cumulativa 5 para SQL Server 2005 Service Pack 3. Para obter mais informações sobre este pacote de atualização cumulativa, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
972511 Pacote de atualizações cumulativas 5 para SQL Server 2005 Service Pack 3Nota Como as compilações são cumulativas, cada nova versão de correção contém todos os hotfixes e todas as correções de segurança que foram incluídas com o anterior SQL Server 2005 corrigir lançamento. A Microsoft recomenda que você considere aplicar o lançamento de correção mais recente que contém esse hotfix. Para mais informações, clique no número de artigo que se segue para ver o artigo na Base de Dados de Conhecimento Microsoft:
960598 As compilações do SQL Server 2005 lançadas após o lançamento do SQL Server 2005 Service Pack 3
Os hotfixes do Microsoft SQL Server 2005 são criados para service packs SQL Server específicos. Tem de aplicar uma correcção SQL Server 2005 Service Pack 3 a uma instalação do SQL Server 2005 Service Pack 3. Por padrão, qualquer hotfix fornecido em um SQL Server service pack é incluído no próximo SQL Server service pack.
Solução
Para contornar esse problema, resolva a condição de pouca memória. A quantidade mínima de memória que pode desencadear este problema varia de computador para computador. Geralmente, essa quantidade é entre 32 megabytes (MB) e 64 MB de memória disponível. Portanto, recomendamos que você configure o servidor para alocar mais de 64 MB de memória disponível para o SSIS.
A quantidade predefinida de memória disponível que sinaliza um evento de notificação de recurso com pouca memória é de aproximadamente 32 MB por 4 gigabytes (GB) até um máximo de 64 MB por 4 GB. Para obter mais informações, visite o seguinte site da MSDN (Microsoft Developer Network):
https://msdn.microsoft.com/library/aa366541(vs.85).aspx
No entanto, é difícil evitar totalmente esse problema porque a memória disponível pode flutuar muito em servidores de produção ocupados. Além disso, a memória pode diminuir por várias razões dentro das atividades habituais. Para ajudar a reduzir a frequência deste problema, utilize um dos seguintes métodos:
Método 1
Adicione mais memória física ao computador.
Método 2
Execute o pacote SSIS num computador diferente do computador que está a executar a instância do SQL Server.
Método 3
Se executar o pacote SSIS no mesmo computador que está a executar a instância do SQL Server, defina a opção de configuração de memória máxima do servidor para a instância para um valor menor para aumentar a memória disponível no computador.
Método 4
Saia de aplicativos estressantes que consomem muita memória quando você executa pacotes SSIS que contêm tarefas Fluxo de Dados.
Método 5
Execute pacotes SSIS e as tarefas de fluxo de dados em série em vez de em paralelo para reduzir o consumo cumulativo do uso de memória.
Método 6
Use o método descrito na subseção "Como monitorar o consumo de memória para SSIS" na seção "Mais informações" para solucionar a condição de pouca memória e, em seguida, otimizar o uso de memória para SSIS.
Estado
A Microsoft confirmou que se trata de um problema nos produtos Microsoft listados na secção "Aplica-se a".
Mais Informações
Mais detalhes sobre os sintomas
Sintoma 1
Se encontrar valores de dados danificados no destino do fluxo de dados, os valores dos dados danificados podem aparecer como representações diferentes, dependendo do tipo de dados. Por exemplo, os seguintes tipos de dados aparecem como várias representações diferentes de valores de dados danificados:
| DT_STR = "" | Valores de cadeia NULL, em branco ou vazios |
|---|---|
| DT_I4 = 0 | Valor zero do tipo de dados inteiro |
| DT_UI1 = 0 | Valor zero do tipo de dados inteiro não assinado |
| DT_NUMERIC = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | Valor zero com maior precisão e escala. |
| DT_DBTIMESTAMP = 0-0-0 0:0:0 | Valor de data zero tracejado |
Na maioria dos cenários, todas as colunas e linhas têm valores de dados danificados ou uma parte significativa das colunas e linhas têm valores de dados danificados. Além disso, o número total de linhas que chegam ao destino geralmente corresponde ao número de linhas esperadas no destino, mesmo quando os dados estão danificados. Isto é causado por um problema na memória intermédia. Um buffer inteiro ou um conjunto de buffers na tarefa de fluxo de dados em execução pode ser afetado. Dependendo do tamanho do buffer e do tamanho dos dados por linha, cada buffer pode conter centenas de linhas.
Em algumas estruturas avançadas, nem todas as colunas na tarefa de fluxo de dados são afetadas. Se os dados forem manipulados dentro da tarefa de fluxo de dados usando transformações como expressões, transformação de coluna derivada e transformação de pesquisa, algumas colunas dos dados podem permanecer iguais aos seus valores esperados. Isto ocorre porque o SSIS substitui os dados danificados durante a tarefa de fluxo de dados por esses valores transformados.
Noutras estruturas avançadas, algumas linhas podem perder-se. Devido à natureza flexível da direção dos dados nas estruturas de fluxo de dados SSIS, os dados danificados podem ser encaminhados para um destino inesperado se os valores de dados inesperados forem percecionados na coluna condicional pela estrutura. Quando utiliza transformações, como transformações de Divisão Condicional ou transformações de Pesquisa, algumas linhas podem ser perdidas quando a transformação redireciona valores de dados danificados. Por exemplo, nas transformações de Pesquisa, se as linhas danificadas não corresponderem a quaisquer dados de referência, as linhas serão eliminadas.
Sintoma 2
Uma vez que os valores zero não são valores válidos em alguns tipos de dados, poderão ocorrer erros de conversão de tipos de dados quando o fornecedor OLE DB converter tipos de dados. Ocasionalmente, também pode ocorrer um estouro de tipo de dados. Por exemplo, uma coluna do tipo de dados datetime tem um valor "0-0-0 0:0:0". Este valor inválido causará este tipo de erro porque o fornecedor OLE DB não consegue formatar os zeros num valor de data válido para o Fornecedor OLE DB do SQL Native Client.
Sintoma 3
Violações de restrição podem ocorrer porque valores de chave primária duplicados são inseridos no destino do fluxo de dados. Por exemplo, múltiplos valores zero são inseridos numa coluna do tipo de dados número inteiro ou múltiplos valores NULL são inseridos numa coluna do tipo de dados varchar. Da mesma forma, a relação de chave externa poderá ser violada quando valores de chave duplicados são inseridos na tabela de destino.
Como determinar se está a deparar-se com este problema
Os seguintes indicadores podem ser usados para determinar se você está encontrando esse problema:
Você pode monitorar o contador spooled de Buffers para o objeto SQL Server:SSIS Pipelineperformance para determinar se o mecanismo de fluxo de dados grava buffers de dados no disco devido a uma notificação de recurso de pouca memória.
Você também pode examinar o arquivo DTS.tmp localizado no diretório temporário especificado na propriedade BufferTempStoragePath da tarefa de fluxo de dados. Se notar que o tamanho do ficheiro de DTS.tmp está a aumentar, o motor de fluxo de dados está a gravar memórias intermédias de dados no disco.
Se quiser determinar se um pacote SSIS existente tem este problema, pode adicionar uma transformação Multicast à tarefa de fluxo de dados no pacote SSIS para direcionar uma cópia dos dados para um destino de ficheiro simples para facilitar a observação.
Outro indicador de memória disponível muito baixa é que a seguinte mensagem é registrada no log do pacote SSIS:
Nota
DTS_I_CANTRELIEVEPRESSURE O gerenciador de buffer detectou que o sistema estava com pouca memória virtual, mas não conseguiu trocar nenhum buffer. Foram considerados 8 buffers e 8 bloqueados. Ou não há memória suficiente disponível para o pipeline porque não está instalado o suficiente, outros processos estão usando-o ou muitos buffers estão bloqueados.
Como monitorar o consumo de memória para SSIS
Monitore a memória para medir o pico de uso para vários processos do SQL Server Integration Services Runtime para calcular o uso máximo da memória
Monitore o uso de memória de pico dos vários processos de Tempo de Execução do SQL Server Integration Services, como os processos de DTExec.exe e DTSHost.exe, usando o contador de bytes privados do objeto Process no Monitor de Desempenho.
Quando os pacotes do SQL Server Integration Services estiverem em execução, encontre o valor máximo para o contador de bytes privados do objeto Process no Monitor de Desempenho. Considere o cenário em que vários pacotes são executados em paralelo. Nesse cenário, adicione os valores máximos de todos os processos que estão em execução para obter o uso máximo de memória.
Monitore os processos externos para encontrar os picos e vales
Monitore o uso de memória de pico de processos que não sejam o serviço SQL Server e o serviço SSIS usando o contador de bytes privados do objeto Process no Monitor de desempenho. Procure horários de pico de uso que podem causar pouca memória para SQL Server Integration Services. Por exemplo, considere os horários de pico em que vários usuários usam o protocolo RDP (Ambiente de Trabalho Remoto Protocol) para se conectar ao servidor e os horários em que o software de backup está em execução.
Monitore o uso da memória SQL Server para encontrar os picos e vales
Se a mensagem "Usando páginas bloqueadas para pool de buffer." não estiver presente no arquivo Errorlog recente, o contador de bytes privados para o processo de Sqlservr.exe pode indicar quanta memória é consumida pelos serviços de SQL Server.
Se a mensagem estiver presente no arquivo Errorlog recente, use o contador Total Server Memory (KB) do objeto de desempenho SQL Server: Memory Manager para medir o uso de memória do pool de buffers SQL Server. Além disso, use o contador de bytes privados para o processo de Sqlservr.exe para localizar as alocações de memória fora do pool de buffers (MemToLeave). A soma dos dois valores, o valor de memória total do servidor (KB) e o valor de MemToLeave, é uma boa estimativa do consumo total de memória SQL Server.
O Monitor de Desempenho e o Gerenciador de Tarefas não mostram a memória consumida por essas páginas do pool de buffers se uma das seguintes opções for verdadeira:
- Se o direito de utilizador Bloquear Páginas na Memória for atribuído à conta de arranque do serviço SQL Server.
- Se a memória AWE estiver ativada.
Observação Se o direito de usuário Bloquear páginas na memória não estiver atribuído à conta de inicialização do serviço SQL Server e o AWE não estiver habilitado, o contador de bytes privados para o processo de Sqlservr.exe deve indicar a memória consumida pelo SQL Services para as várias instâncias SQL Server.
Monitorize o valor mínimo de memória disponível no Windows
Para monitorizar a memória disponível no Windows, utilize um dos seguintes métodos:
O contador MBytes disponível no Monitor de Desempenho.
A Memória Física (MB) – valor livre no separador Desempenho do Gestor de Tarefas.
Observação Em alguns sistemas operacionais, Memória física (MB) - Livre é rotulada como Memória física (K) - Disponível.
Referências
Para obter mais informações sobre a propriedade MainPipeClass.BufferTempStoragePath, visite o seguinte site da Microsoft Developer Network (MSDN):
https://msdn.microsoft.com/library/microsoft.sqlserver.dts.pipeline.wrapper.mainpipeclass.buffertempstoragepath.aspx
Para obter mais informações sobre como otimizar o desempenho do servidor usando as opções de configuração de memória, visite o seguinte site da Microsoft Developer Network (MSDN):
https://msdn.microsoft.com/library/aa178118(sql.80).aspx
Para obter mais informações sobre os contadores de monitor de desempenho, visite o seguinte site:
https://technet.microsoft.com/library/cc768048.aspx
Para obter mais informações sobre como usar os escopos de multicast, visite o seguinte site:
https://technet.microsoft.com/library/cc758554(ws.10).aspxPara obter mais informações sobre o modelo de manutenção incremental para SQL Server, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
935897 Um modelo de manutenção incremental está disponível na equipe de SQL Server para fornecer hotfixes para problemas relatados
Para obter mais informações sobre o esquema de nomenclatura para atualizações SQL Server, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
822499 Novo esquema de nomenclatura para pacotes de atualização de software do Microsoft SQL Server
Para obter mais informações sobre a terminologia de atualização de software, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
824684 Descrição da terminologia padrão utilizada para descrever as atualizações de software da Microsoft