AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 144889
Accepted
Sir Swears-a-lot
Sir Swears-a-lot
Asked: 2016-07-26 15:47:36 +0800 CST2016-07-26 15:47:36 +0800 CST 2016-07-26 15:47:36 +0800 CST

SQL 2016 SQL Server Assertion: File: <pageref.cpp>, line=951 Failed Assertion

  • 772

No momento, estou atualizando nosso data warehouse do SQL 2012 para o SQL 2016. Tenho meus DWs antigos e novos funcionando lado a lado em paralelo.

Meu processo ETL (uma estrutura desenvolvida no SSIS por terceiros) foi executado com êxito por mais de 2 anos em 2012, mas está falhando em 2016. Até agora, os bancos de dados e o processo ETL são idênticos.

Ambos os servidores são máquinas virtuais em execução no VMWare. O servidor antigo é Win 2008 com 24 Gb de RAM. SQL 2012 Padrão Memória máxima definida para 16 Gb. O novo servidor é Win 2012 com 64 Gb de RAM. Desenvolvedor SQL 2016. Memória máxima definida para 50 Gb. O novo DW está executando a v13.0.1601.5 RTM Developer Edition (64 bits).

Ao executar meu processo ETL, as etapas de carregamento que usam uma mesclagem SQL em uma dimensão ou tabela de fatos falham com o seguinte erro.

Texto completo:

DESCRIÇÃO: SQL Server Assertion: File: , line=951 Failed Assertion = 'IS_OFF (BUF_MINLOGGED, m_buf->bstat) || pageModifyType != PageModifyType_Contents || GetPagePtr ()->IsTextPage ()'. Esse erro pode estar relacionado ao tempo. Se o erro persistir após executar novamente a instrução, use DBCC CHECKDB para verificar a integridade estrutural do banco de dados ou reinicie o servidor para garantir que as estruturas de dados na memória não sejam corrompidas.

Conforme recomendado, executei o DBCC e nenhum erro foi encontrado. Eu também reiniciei o SQL. Em seguida, reiniciei o processo ETL e recebi o mesmo erro.

Minhas pesquisas por esse erro mostram que era um erro conhecido no SQL 2008, 2012 e 2014 e corrigido em hotfixes e atualizações cumulativas subsequentes. então estou um pouco surpreso ao vê-lo reaparecer em 2016.

Os links que encontrei dizem que afeta o SSIS ao tentar fazer inserções se o banco de dados estiver no modelo de recuperação Simples ou Bulk Logged. (Estou executando no modelo de recuperação simples)

Uma solução alternativa sugerida é alterar o modelo de recuperação de banco de dados para COMPLETO. Eu tentei isso e funciona, mas não é uma solução para um Data Warehouse.

Alguém mais encontrou isso com 2016?

Alguém pode sugerir soluções alternativas?

Atualizações:

26/07/2016: Apliquei a atualização crítica KB3164398 (v13.0.1708.0) e o problema persiste.

27/07/2016: Apliquei a atualização cumulativa CU1 KB3164674 (v13.0.2149.0).

08/03/2016: Ocorreu um erro durante a noite em nosso menor cubo. CU1 não corrigiu o problema. Hoje relatei o bug no MS Connect e também registrei uma chamada de suporte com a Microsoft.

08/12/2016: MS-Support respondeu inicialmente, mas as respostas foram "Não temos uma solução para isso". O cara do suporte iria discutir isso com seus colegas e me retornaria. 8 dias depois, não tive notícias dele.

Embora eu não tenha uma 'correção', encontramos uma solução alternativa que nos convinha. Veja minha resposta postada.

29/9/2016. Eu apliquei CU2 na semana passada. Na quinta-feira, executamos acidentalmente uma versão antiga da mesclagem, que falhou novamente com o mesmo erro. Então... CU2 também não consertou.

23/01/2017 : Apliquei o 2016 SP1 CU1 e acredito que isso resolveu o problema. Especificamente KB3205964

sql-server sql-server-2016
  • 4 4 respostas
  • 6137 Views

4 respostas

  • Voted
  1. Best Answer
    wBob
    2016-07-28T04:44:37+08:002016-07-28T04:44:37+08:00

    Olhando para o KB, você tem algumas opções/soluções alternativas:

    1. Mude para o modelo de recuperação COMPLETA. Você diz "isso não é muito uma opção para um warehouse", mas na verdade é apenas uma questão de configurar os backups do log de transações regularmente, por exemplo, 15 minutos e depois descartá-los. SSIS/Planos de manutenção têm tarefas de estoque para fazer isso . Você perderá transações registradas em massa, mas nunca achei que elas fizessem uma grande diferença nos tempos de execução, apenas no tamanho do log. Você pode até fazer backup do log para nulo, o que não descreverei aqui. Se você não tiver certeza do que fazer, pergunte ao seu DBA local. O espaço em disco e a retenção de backup do log de transações são problemas mais fáceis de resolver do que erros fatais. Quando esse problema for resolvido, você poderá voltar.
    2. A KB menciona "várias instruções BULK INSERT em uma única transação distribuída". Não está claro na sua pergunta como suas inserções em massa são configuradas. Você está usando o SSIS para executar tarefas 'Execute SQL' que usam oMERGEcomando? O que significa 'multiple BULK INSERTs' aqui? Existe uma maneira de converter sua abordagem em BULK INSERTs únicos, um de cada vez, por exemplo? No SSIS, você pode definir 'MaxConcurrentExecutables' como 1 temporariamente, por exemplo, veja se isso ajuda. Vincule-o a uma variável de configuração para que você possa alterá-lo novamente mais tarde. Obviamente, isso vai desacelerar as coisas, mas você prefere que seu ETL termine em vez de falhar rapidamente. Fazer as coisas em paralelo é um bom padrão e uma força real do SSIS, mas você só pode ir tão rápido quanto seu componente mais lento; digamos que você tenha 10 dimensões que levam um minuto e um fato que leva uma hora, seu ETL termina em uma hora em execução paralela ou 1 hora e 10 minutos em série.
    3. MERGEé bom, mas tem alguns problemas. Você pode considerar a conversão de volta para INSERT/ UPDATE. Além disso, você deve usar HOLDLOCKwith MERGEde acordo com aqui . Você usa essa dica? Faz alguma diferença para este problema se você fizer isso? Tivemos um problema em uma versão inicial do SQL 2014 em que o uso MERGEcom DML ( OUTPUTcláusula) combinável em columnstore causava esse tipo de afirmação - fiz com que retirassem os índices columnstore das dimensões, que eles adicionaram sem me avisar.
    4. Que tipo de tratamento de transação você está fazendo? Às vezes, com ETL, a posição é repetível apenas executando novamente. Às vezes, você precisa que ele falhe e retroceda. Como você implementou isso? Pode ser alterado para que não seja "transação distribuída única"?

    Boa sorte.

    • 2
  2. Sir Swears-a-lot
    2017-01-23T12:40:51+08:002017-01-23T12:40:51+08:00

    Acredito que isso tenha sido resolvido em 2016 SP1 CU1.

    Especificamente por KB3205964

    • 2
  3. Steve Neshausen
    2016-08-01T13:37:52+08:002016-08-01T13:37:52+08:00

    Isso é corrigido aplicando a atualização cumulativa 1 (CU1) para MSSQL2016, consulte o link https://support.microsoft.com/en-us/kb/3164674

    • 1
  4. Sir Swears-a-lot
    2016-08-04T21:10:02+08:002016-08-04T21:10:02+08:00

    Acredito que encontramos outra solução alternativa. Estou postando minha resposta porque acho que pode ser útil e é diferente o suficiente da sugestão de wBob.

    Alteramos a parte insert da instrução merge para que ela seja inserida em uma tabela temporária em vez do destino original.

    Depois que a instrução merge é executada, inserimos da tabela # no destino.

    Não é o ideal, mas pelo menos a mesclagem ainda lida com a complexidade do 'upsert' marcando as linhas que foram retiradas/expiradas.

    Descobrimos que essa é uma compensação aceitável em comparação com reescrever completamente a mesclagem como inserções e atualizações separadas.

    CREATE TABLE #Activity(
    [ETL_ActivitySurrogateKey] [int] IDENTITY(1,1) NOT NULL,
    [Field1] [varchar](255) NULL,
    )
    
    -- Insert statements for procedure here
    INSERT INTO #Activity ( [Field1],2,3,etc )
    
    SELECT [Field1],2,3,etc
    FROM 
    (
        MERGE [DDS_OZ_CC].[dimActivity] AS target 
        USING (
          SELECT [Field1],2,3,etc
          FROM [STAGE_OZ_CC].[Transform_Activity]
          ) as source
        ON
        (
          target.RowIsCurrent = source.RowIsCurrent
             AND target.[Field1] = source.[Field1]
        )
        WHEN MATCHED 
            AND (        
            EXISTS (SELECT target.Level5Id EXCEPT SELECT source.Level5Id)
        )
        THEN
          UPDATE SET 
            ETL_ValidToDateTime = source.ETL_ValidFromDateTime 
           ,ETL_RowIsCurrent = 0 
           ,ETL_LastTouchedBy = source.ETL_LastTouchedBy 
           ,ETL_RowChangeReason = 'SCD2 Retired' 
    
        WHEN NOT MATCHED THEN 
        INSERT 
        (    
         [Field1],2,3,etc
        )
        VALUES (      
          source.[Field1],2,3,etc
        )
           WHEN NOT MATCHED BY SOURCE AND target.ETL_RowIsCurrent = 1
           THEN UPDATE SET
           ETL_RowIsCurrent = 0 
           ,ETL_RowChangeReason = 'Fact Removed' 
           ,ETL_LastTouchedBy = 'Unknown'
    
      OUTPUT
        $action      
          ,source.[Field1],2,3,etc    
    
      ) AS MergeOutput
      (
        action  
        ,[Field1],2,3,etc   
      ) 
    
      WHERE ACTION = 'UPDATE' AND ETL_RowIsCurrent = 1
    
        INSERT INTO [DDS_OZ_CC].[dimActivity]
        ( [Field1],2,3,etc  )
        SELECT [Field1],2,3,etc
        FROM #Activity
    
        END
    
    • 1

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve