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 / 290316
Accepted
Riley Major
Riley Major
Asked: 2021-04-23 13:27:28 +0800 CST2021-04-23 13:27:28 +0800 CST 2021-04-23 13:27:28 +0800 CST

O SQL Server 2008 R2 sempre falha com um erro de nível de gravidade 20 com certa manipulação de texto grande?

  • 772

Quando executamos isso em nossas instâncias do SQL Server 2008 R2, sempre causa um erro de gravidade 20. Ele não tem esse problema em nossas instâncias do SQL Server 2016.

Consulta:

DECLARE @v varchar(MAX) = REPLICATE(CONVERT(varchar(max),'a'),524289);
SELECT @v = @v FROM(SELECT 1 AS a) AS b;

Resultado:

Location:    tmpilb.cpp:3256
Expression:  fNoReaderWriterConflict
SPID:        90
Process ID:  1576
Location:    tmpilb.cpp:3306
Expression:  fNoReaderWriterConflict
SPID:        90
Process ID:  1576
Msg 3624, Level 20, State 1, Line 4
A system assertion check has failed. Check the SQL Server error log for details. Typically, an assertion failure is caused by a software bug or data corruption. To check for database corruption, consider running DBCC CHECKDB. If you agreed to send dumps to Microsoft during setup, a mini dump will be sent to Microsoft. An update might be available from Microsoft in the latest Service Pack or in a QFE from Technical Support. 
Msg 0, Level 20, State 0, Line 0
A severe error occurred on the current command.  The results, if any, should be discarded.

SELECT @@VERSION:

Microsoft SQL Server 2008 R2 (SP3) - 10.50.6000.34 (X64) 
    Aug 19 2014 12:21:34 
    Copyright (c) Microsoft Corporation
    Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)

SQLDump0002.txt (do servidor de não produção):

Computer type is Intel(R) Xeon(R) CPU           E5430  @ 2.66GHz.                                                
Bios Version is DELL   - 1                                                                                       
Phoenix ROM BIOS PLUS Version 1.10 2.5.0                                                                         
8 X64 level 8664, 2 Mhz processor (s).                                                                           
Windows NT 6.1 Build 7601 CSD Service Pack 1. 

Memory                               
MemoryLoad = 87%                     
Total Physical = 32762 MB            
Available Physical = 4058 MB         
Total Page File = 65524 MB           
Available Page File = 27332 MB       
Total Virtual = 8388607 MB           
Available Virtual = 8355194 MB       
**Dump thread - spid = 0, EC = 0x00000003EF7E5F00                                                       

 

Isso é um bug nesta versão do SQL Server 2008 R2?

Atualizações:

  • Isso produz um conjunto de arquivos relacionados ao despejo de memória. As seções legíveis para leigos basicamente repetem o resultado do erro acima.
  • Reconhecemos que o SQL Server 2008 R2 é antigo e não tem suporte. Estaremos atualizando.
  • Já resolvemos esse problema definindo a variável de texto grande fora de uma instrução SELECT.
  • Estávamos curiosos se isso acontecia em outros ambientes e queríamos que isso fosse documentado publicamente caso acontecesse com outra pessoa.
sql-server-2008-r2 errors
  • 2 2 respostas
  • 126 Views

2 respostas

  • Voted
  1. Josh Darnell
    2021-04-24T03:36:51+08:002021-04-24T03:36:51+08:00

    Não há realmente nenhum banco de dados envolvido. Você pode ver que não atinge nenhuma mesa. Mas sim, executamos isso "em" vários bancos de dados e executamos CHECKDB neles apenas para ter certeza.

    O banco de dados envolvido é tempdb (ID do banco de dados 2). É aí que o valor das variáveis ​​LOB é escrito. Você pode ver isso olhando no sys.dm_db_task_space_usageDMV (se sua consulta não estiver falhando com um erro, ou seja):

    Captura de tela dos resultados do SSMS mostrando 208 alocações de tempdb para esta consulta

    Meu contexto de banco de dados de dados para essa consulta era "mestre", mas observe que database_id na consulta resulta em tempdb.

    Assim, você pode verificar se há corrupção no tempdb. Esse banco de dados é recriado toda vez que o servidor é reiniciado, então eu ficaria surpreso se você tivesse corrupção persistente lá. A menos que você esteja tendo problemas de disco, nesse caso você deverá ver consistentemente erros no log de eventos "Sistema" do Windows que indicam corrupção.


    Dito isso, também é muito possível que seja um bug no SQL Server 2008 R2 SP3. Há pelo menos um hotfix não relacionado à segurança para esse SP ( KB3033860 ). Os erros mencionados não parecem corresponder à sua situação, mas podem estar relacionados (são falhas de afirmação).

    Infelizmente, como o SQL Server 2008 R2 está sem suporte, isso não será corrigido, mesmo que seja um bug. Sua melhor aposta é tentar contornar o problema ou atualizar.

    • 7
  2. Best Answer
    Paul White
    2021-04-25T02:18:10+08:002021-04-25T02:18:10+08:00

    Isso se reproduz para mim no Microsoft SQL Server 2008 R2 (SP2) build 10.50.4000. Parece ter sido corrigido algum tempo depois do SP3. O problema foi relatado no Connect (e posteriormente migrado para a voz do usuário, para que o link funcione).

    Você precisa de mais de 512 KB de dados no LOB e uma atribuição de variável que leia da mesma variável, sem realizar nenhum cálculo.

    Por exemplo:

    -- No error at 512KB
    DECLARE @v varchar(max) = REPLICATE(CONVERT(varchar(max), 'a'), 512 * 1024);
    SET @v = (SELECT @v);
    
    -- Assertion failure at 512KB + 1
    DECLARE @v varchar(max) = REPLICATE(CONVERT(varchar(max), 'a'), 512 * 1024 + 1);
    SET @v = (SELECT @v);
    

    A instrução quase executa sem erro. O SQL Server executa todos os cálculos corretamente e até atribui @v a @v sem problemas. A asserção ocorre quando o SQL Server está fechando a instrução, gravando o valor final de @v de volta na referência de variável fornecida @v. Ele faz isso como se @v fosse um parâmetro para a instrução de atribuição. Se isso soa complexo, é porque é. A atribuição de variável é um pouco hack, com alguns comportamentos legados estranhos. Não invejo aqueles que têm que manter esse código com todas as suas peculiaridades.

    A asserção não ocorre com valores de 512 KB ou abaixo porque o SQL Server usa uma classe ILockBytes (ILB) na memória CInMemIlbpara manipular a operação. Você deve ter notado ILB na mensagem de asserção (tmpilb.cpp). Mais de 512 KB, o SQL Server usa CMainIlbem vez disso, que verifica outros leitores usando o identificador de blob ao gravar. Atribuir @v a si mesmo sem modificação significa que esta verificação falha.

    Entre as muitas soluções possíveis, duas que se enquadram naturalmente nas observações acima são:

    1. Atribuir a uma variável diferente
    2. Faça um cálculo

    Exemplos são mostrados abaixo. Nenhum dos dois produz a afirmação errônea:

    -- Assign to a different variable
    DECLARE @v varchar(max) = REPLICATE(CONVERT(varchar(max), 'a'), 512 * 1024 + 1);
    DECLARE @v2 varchar(max);
    SET @v2 = (SELECT @v);
    
    -- Perform a calculation
    DECLARE @v varchar(max) = REPLICATE(CONVERT(varchar(max), 'a'), 512 * 1024 + 1);
    SET @v = (SELECT @v + '');
    

    Curiosamente, a mesma afirmação ressurgiu recentemente em uma correção do SQL Server 2019 para repositório de consultas e polybase.

    • 7

relate perguntas

  • Propriedades de redução automática, criptografia e modelo de recuperação no SQL Server 2008 R2

  • A instalação autônoma do cluster do SQL Server 2008 R2 falha com o erro - "Caracteres ilegais no caminho".

  • Migração de banco de dados grande

  • plano de manutenção executado pelo agente

  • Randomizando o conteúdo da tabela e armazenando-o de volta na tabela

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