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 / 45934
Accepted
Cougar9000
Cougar9000
Asked: 2013-07-09 09:07:34 +0800 CST2013-07-09 09:07:34 +0800 CST 2013-07-09 09:07:34 +0800 CST

Limpeza do armazenamento de versões do TempDB

  • 772

Pelo que posso descobrir, o armazenamento de versões limpará apenas as versões anteriores à transação ativa mais antiga. Descrição: O banco de dados de transações mais antigo é específico ou o SQL Server manterá todas as versões, independente do banco de dados, se houver uma transação mais antiga ainda ativa, ponto final?

Histórico - SQL Server 2005 SP4 Enterprise hospedando cerca de 40 bancos de dados. Atualmente, o TempDB é de 102 GB, o armazenamento de versão é de cerca de 98 GB. Um dos aplicativos hospedados na instância do banco de dados tem uma transação aberta de 40 dias com base em sys.dm...database_transactions. Dois grandes bancos de dados separados tiveram uso extremamente pesado no mês passado e vimos um crescimento consistente do TempDB coincidindo com essas operações. Esperávamos algum crescimento. Não esperávamos que continuasse crescendo. Pergunta: As versões armazenadas no armazenamento de versões do TempDB desses dois bancos de dados separados ainda estão lá porque um terceiro banco de dados independente tem uma conexão de 40 dias e mostra um transaction_state aberto?

Perfmon counters: O armazenamento de versões está crescendo continuamente nas poucas horas que acompanhei esta manhã. A taxa de geração de versão AVG é de cerca de 30 kb/s, a taxa de limpeza de versão é de 0 kb/s.

Muito espaço deixado para o TempDB, há cerca de 300 GB de arquivos de dados totais para todos os bancos de dados do usuário, o TempDB cresceu em média 350 MB por dia para cada um de seus 8 arquivos de dados desde a última reinicialização. Esse comportamento é anormal e a investigação revelou o armazenamento de versão grande

Respostas para perguntas de comentários para não ter uma seção de comentários longa:

P: Por que crescimento automático no tempdb? R: O TempDB é configurado para inicializar em um tamanho que consideramos apropriado para a maior parte do tempo. Permitimos o crescimento automático para lidar com atividades anormais do banco de dados. Também monitoramos o crescimento automático.

P: Como você sabe que a transação está ativa e não apenas uma conexão ativa? A: transaction_state diz ativo em sys.dm_tran_active_snapshot_database_transactions e outras coisas. O Activity Monitor diz que cada conexão tem 1 transação aberta.

P: Por que seu aplicativo é tão estúpido? R: É de terceiros. Um dos muitos nesta instância. Não sei se o comportamento é anormal ou facilmente corrigido.

RESOLUÇÃO

A(s) transação(ões) aberta(s) impede(m) qualquer limpeza do armazenamento de versão, então Jon estava certo, a limpeza do armazenamento de versão é feita independentemente dos bancos de dados. O fechamento das transações ofensivas permitiu o início da limpeza do armazenamento de versão. A teoria atual por trás do porquê é de Jon Seigel

O armazenamento de versão só pode limpar versões com base na transação ativa mais antiga em toda a instância, para oferecer suporte ao uso de isolamento de instantâneo em nível de transação em vários bancos de dados simultaneamente.

Se alguém souber com certeza ou puder provar isso, por favor, faça

Pergunta referenciada: encontre-transações-que-estão-preenchendo-a-loja-de-versão

Documentos referenciados:
TempDB 2005 WP
Teratrax tuning tempDB
Idera Desmistifique Tempdb

sql-server sql-server-2005
  • 2 2 respostas
  • 12831 Views

2 respostas

  • Voted
  1. Paul White
    2013-12-15T19:12:24+08:002013-12-15T19:12:24+08:00

    O banco de dados de transações mais antigo é específico ou o SQL Server manterá todas as versões, independentemente do banco de dados, se houver uma transação mais antiga ainda ativa, ponto final?

    O SQL Server garante que ele mantenha todas as versões de linha que possam ser necessárias.

    • O armazenamento de versão é compartilhado entre todos os bancos de dados da instância.
    • O armazenamento de versão é composto por várias unidades de armazenamento (ASUs) "append only".
    • Uma nova ASU é criada a cada minuto, se necessário.
    • Um novo ASU não é criado se nenhuma versão de linha for gerada.
    • O ASU atual é associado a uma transação quando ela é iniciada.
    • Uma transação continua a gravar versões de linha no mesmo ASU até ser concluída.
    • Um ASU geralmente contém versões de linha de várias sessões, bancos de dados, tabelas e índices.
    • Versões de linhas individuais não são removidas - apenas ASUs completos são.
    • Um ASU só é removido quando o SQL Server pode garantir que ele não seja mais necessário.
    • A limpeza da ASU é executada por um encadeamento em segundo plano que é ativado a cada minuto.

    Para expandir esse último ponto, uma ASU só pode ser removida quando:

    1. Todas as transações destinadas a esse ASU foram concluídas.
    2. Todas as transações que podem precisar de versões desse ASU foram concluídas.
    3. Todas as ASUs anteriores foram removidas.

    Para obter mais detalhes, consulte os seguintes recursos:

    Uso de recurso de controle de versão de linha - MSDN
    Trabalhando com tempdb no SQL Server 2005

    Uma série de artigos de blog de Sunil Argawal da equipe do SQL Server Storage Engine:

    Básico da loja de
    versões Estrutura lógica da
    loja de versões Crescimento da loja de versões e remoção de versões obsoletas

    • 7
  2. Best Answer
    Jon Seigel
    2013-07-09T15:17:46+08:002013-07-09T15:17:46+08:00

    (Observação: esta não é uma resposta 100% certa e não tenho referências, então deixe-me saber se você pode provar o contrário.)

    O armazenamento de versão só pode limpar versões com base na transação ativa mais antiga em toda a instância , para oferecer suporte ao uso de isolamento de instantâneo em nível de transação em vários bancos de dados simultaneamente. Isso simplesmente não funcionaria se as versões "antigas" de um banco de dados fossem limpas no meio da transação de instantâneo de outro banco de dados.

    Portanto, se houver uma transação aberta muito antiga, o armazenamento de versão não será capaz de limpar até que a transação seja confirmada ou revertida.

    • 5

relate perguntas

  • 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

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • 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

    Conceder acesso a todas as tabelas para um usuário

    • 5 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
    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
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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