Solução alternativa de Limpeza Congelada do Ghost do SQL Server necessária

15

Eu tenho várias tabelas com quantidade de linhas entre 5M e 1.5G

Cada tabela possui seu campo BLOB, cujo tamanho varia de 100 bytes a 30 MBytes e que é armazenado como 'tipos de valores grandes fora da linha' = ON

As tabelas são armazenadas em diferentes grupos de arquivos com 3 a 4 arquivos, cada um em disco diferente, em LUNs diferentes, em SAN muito rápida.

Todos os dias, essas tabelas aumentam para 5-100 Gb de tamanho e com linhas de 600k a 1,5M

Após um certo período de tempo , que varia de 2 semanas a 6 meses, algumas das linhas são excluídas ou movidas para arquivar o banco de dados, portanto - não há nenhuma linha nas tabelas de trabalho com mais de 6 meses.

Configuração atual do servidor:

  • O mecanismo do servidor SQL é 2008 R2 SP1 Enterprise @ 24 núcleos e @ 64Gb de RAM
  • O SQL Server é executado com sinalizadores de inicialização extras:

-T 3640; (Elimina o envio de mensagens DONE_IN_PROC para o cliente para cada instrução no procedimento armazenado. Isso é semelhante à configuração da sessão de SET NOCOUNT ON, mas quando definida como um sinalizador de rastreamento, todas as sessões do cliente são tratadas dessa maneira)

-T 1118; (Alterna alocações no tempDB de 1pg por vez (para as primeiras 8 páginas) em uma extensão.)

-T 2301; (Permite otimizações avançadas que são específicas para consultas de suporte a decisões. Esta opção se aplica ao processamento de suporte a decisões de grandes conjuntos de dados)

-T 1117; (Aumenta todos os arquivos de dados de uma só vez, caso contrário, alterna-se.)

-E; (Aumenta o número de extensões alocadas para cada arquivo em um grupo de arquivos. Esta opção pode ser útil para aplicativos de armazém de dados que possuem um número limitado de usuários executando indexações ou varreduras de dados)

-T 834; (Faz com que o SQL Server use alocações de páginas grandes do Windows para a memória alocada para o buffer pool, http://msdn2.microsoft.com/en-us/library/aa366720.aspx , http://support.microsoft. com / kb / 920093 )

  • O SQL Server usa grandes extensões de página
  • SQL Server utiliza a opção de inicialização rápida de arquivos
  • AUTOSHRINK está DESLIGADO para todos os bancos de dados

O problema é que, a partir de algum momento de disponibilidade do servidor (de alguns dias a meses), o GHOST CLEANUPprocesso se recusa a realizar limpezas forçadas e simplesmente faz o trabalho usual - limpa várias páginas em alguns segundos ( which is seen thru Extended Events), o que não é adequado , porque não é possível limpar todas as linhas excluídas

O problema persiste desde os tempos do SQL Server 2005 RTM Enterprise

Como tentei resolver o problema:

  • Tentou forçar operações de verificação em índices agrupados das tabelas
  • Tentou forçar operações de DIGITALIZAÇÃO, que envolvem todo o conteúdo da coluna BLOB em índices agrupados das tabelas
  • sistema sp_clean_db_free_space & sp_clean_db_file_free_space
  • página limpa dbcc manualmente (@dbid, @fileid, @page) para todos os arquivos e páginas no banco de dados
  • recriações de índice clusterizado e reorganização
  • recriando banco de dados
  • DBCC FORCEGHOSTCLEANUP

  • Quando executo a consulta:

    select * 
    from sys.dm_db_index_physical_stats(db_id(), object_id('ProblemTable'), 1, 0, 'detailed')

    Vejo milhões e dezenas de milhões de registros fantasmas, mas apenas para o tipo de unidade de alocação LOB_DATA

As únicas coisas que ajudam:

  • parar o servidor com o comando SHUTDOWN ou reiniciar todo o host - ajuda, após a reinicialização, o processo GHOST CLEANUP executar algumas horas e limpar todos os registros fantasmas
  • DBCC SHRINKFILE com opção EMPTYFILE - mover todos os dados de um arquivo para outro ou arquivos recém-criados limpa os registros fantasmas somente nesse arquivo - o problema é que eu realmente odeio operações de redução. E isso leva de 3 a 4 dias para UM arquivo

a questão - existe alguma maneira programática (preferível) ou de manutenção para forçar o GHOST CLEANUP sem tempo de inatividade do servidor, porque o tempo de inatividade do servidor custa muito, e até inaceitável - é de milhares a dezenas de milhares de dólares por hora

Foram notados problemas semelhantes aos meus:

E o mesmo está aqui:

Oleg Dok
fonte

Respostas:

12

Por fim, a Microsoft reconheceu o problema como um bug: http://support.microsoft.com/kb/2622823

Resumidamente: é fixado em

  • Sql Server 2008 SP3 CU4
  • Sql Server 2008 R2 CU10
  • Sql Server 2008 R2 SP1 CU4

No Sql Server 2012 SP1, não estou enfrentando o problema há mais de um ano de tempo de execução.

Oleg Dok
fonte
3

Esse é o tipo de pergunta que deve ser enviada ao CSS para que eles possam resolver o problema com você. Você provavelmente tem garantia de software e um contrato de suporte. Se você não gastar algumas centenas de dólares, não deve ser um grande negócio se reiniciar a instância custar milhares de dólares por hora.

Você já tentou permitir que o banco de dados fechasse e fosse colocado online? Isso fará com que a recuperação de falhas seja executada e poderá chutar a limpeza de fantasmas.

Você está escrevendo para a mesa com frequência? Com frequência eu quero dizer o tempo todo?

Quanto ao MSKB 932115, você vê os registros fantasmas sendo deixados apenas em todos os arquivos ou está limpando o primeiro arquivo no grupo de arquivos?

Por que o uso de -T1117 e o arquivo instant init?

Mrdenny
fonte
1. Definitivamente vou ao suporte da MS. 2. Se eu fechar o banco de dados, ele aumentará cerca de 10 a 30 minutos rolando o transporte para frente e para trás, o que é inaceitável. 3. O GC está em execução, mas não está processando entradas LOB off-line excluídas. 4. Gravação em tabelas com desempenho constante, dependendo da hora do dia, de 20 a 600 gravações por segundo e o tempo todo. 5. O primeiro arquivo do DB não está em uso - ele não possui tabelas grandes e é usado apenas como armazenamento do sistema - portanto, simplesmente não há registros fantasmas.
Oleg Dok
com -T1117, eu só quero espalhar toda a carga entre vários arquivos, em vez disso, quando resta apenas um arquivo do grupo de arquivos, onde ainda existe espaço livre - ele começa a desacelerar nos LATCHes do PFS, o init instant file minimiza o tempo de crescimento do arquivo, porque um incremento é definido para 10-50 Gb por turno. Não posso simplesmente definir os arquivos o maior possível, porque é completamente imprevisível - quais arquivos obterão seus dados hoje e em que volume. É mais simples pedir aos administradores da SAN que adicionem mais espaço do que prever em quem devo adicionar o espaço.
Oleg Dok