Atualmente, estou atualizando nosso data warehouse do SQL 2012 para o SQL 2016. Tenho o DW antigo e o novo 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 é o Win 2008 com 24 GB de RAM. SQL 2012 Std. Mem máx. Definido como 16 GB. O novo servidor é o Win 2012 com 64 GB de RAM. Desenvolvedor do SQL 2016 Mem máx. Definido como 50 GB. O novo DW está executando a v13.0.1601.5 RTM Developer Edition (64 bits).
Durante a execução do meu processo ETL, as etapas de carregamento que usam uma SQL Merge em uma dimensão ou tabela de fatos falham com o seguinte erro.
Texto completo:
DESCRIÇÃO: Asserção do SQL Server: Arquivo:, line = 951 Asserção com falha = 'IS_OFF (BUF_MINLOGGED, m_buf-> bstat) || pageModifyType! = PageModifyType_Contents || GetPagePtr () -> IsTextPage () '. Este erro pode estar relacionado ao tempo. Se o erro persistir após a execução da 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 estejam 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 para esse erro mostram que era um erro conhecido no SQL 2008, 2012 e 2014 e corrigido nos hotfixes subsequentes e atualizações cumulativas. então estou um pouco surpreso ao vê-lo reaparecer em 2016.
Os links que encontrei dizem que isso afeta o SSIS ao tentar fazer inserções se o banco de dados estiver no modelo de recuperação Simples ou Registrado em Massa. (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 é muita solução para um Data Warehouse.
Alguém mais encontrou isso em 2016?
Alguém pode sugerir soluções alternativas?
Atualizações:
26/7/2016: apliquei a Atualização crítica KB3164398 (v13.0.1708.0) e o problema ainda existe.
27/7/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 ligação de suporte com a Microsoft.
08/12/2016: O suporte da MS respondeu inicialmente, mas a resposta foi "Não temos uma solução para isso". O cara do suporte discutia isso com seus colegas e voltava para mim. 8 dias depois, não tive notícias dele.
Embora eu não tenha uma 'correção', encontramos uma solução alternativa adequada para nós. Veja minha resposta postada.
29/9/2016. Eu apliquei o CU2 na semana passada. Na quinta-feira, acidentalmente executamos uma versão antiga da mesclagem que falhou novamente com o mesmo erro. Então .. CU2 também não o corrigiu.
23/1/2017 : apliquei a CU1 2016 do SP1 2016 e acredito que isso tenha resolvido o problema. Especificamente KB3205964
fonte
Acredito que isso foi resolvido no 2016 SP1 CU1.
Especificamente por KB3205964
fonte
Isso é corrigido aplicando a atualização cumulativa 1 (CU1) para o MSSQL2016, consulte o link https://support.microsoft.com/en-us/kb/3164674
fonte
Acredito que encontramos outra solução alternativa. Estou postando minha resposta, pois acho que pode ser útil, e é diferente o suficiente da sugestão do wBob.
Alteramos a parte de inserção da instrução de mesclagem para que ela seja inserida em uma tabela temporária em vez do destino original.
Depois que a instrução de mesclagem é executada, inserimos a partir da #table no destino.
Não é o ideal, mas pelo menos a mesclagem ainda lida com a complexidade do 'upsert', marcando linhas que foram aposentadas / expiradas.
Concluímos que esse é um compromisso aceitável, em comparação com a reescrita completa da mesclagem como inserções e atualizações separadas.
fonte