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 / 37028
Accepted
Vadim Samokhin
Vadim Samokhin
Asked: 2013-03-20 07:45:49 +0800 CST2013-03-20 07:45:49 +0800 CST 2013-03-20 07:45:49 +0800 CST

VACUUM retornando espaço em disco para o sistema operacional

  • 772

VACUUMgeralmente não retorna espaço em disco para o sistema operacional, exceto em alguns casos especiais.
Dos documentos:

A forma padrão de VACUUMremove versões de linhas inativas em tabelas e índices e marca o espaço disponível para reutilização futura. No entanto, ele não retornará o espaço para o sistema operacional, exceto no caso especial em que uma ou mais páginas no final de uma tabela ficam totalmente livres e um bloqueio de tabela exclusivo pode ser facilmente obtido. Em contraste, VACUUM FULLativamente compacta as tabelas escrevendo uma nova versão completa do arquivo de tabela sem espaço morto. Isso minimiza o tamanho da tabela, mas pode levar muito tempo. Também requer espaço em disco extra para a nova cópia da tabela, até que a operação seja concluída.

A questão é: como esse estado de banco de dados pode one or more pages at the end of a table become entirely freeser alcançado? Isso pode ser feito via VACUUM FULL, mas não tenho espaço suficiente para implementá-lo. Então, existem outras possibilidades?

postgresql postgresql-9.2
  • 1 1 respostas
  • 43749 Views

1 respostas

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2013-03-20T08:22:48+08:002013-03-20T08:22:48+08:00

    Para devolver espaço ao SO, use VACUUM FULL. Enquanto estiver nisso, suponho que você corra VACUUM FULL ANALYZE. Cito o manual :

    FULL

    Seleciona vácuo "completo", que pode recuperar mais espaço , mas leva muito mais tempo e bloqueia exclusivamente a mesa. Esse método também requer espaço em disco extra, pois grava uma nova cópia da tabela e não libera a cópia antiga até que a operação seja concluída. Normalmente, isso só deve ser usado quando uma quantidade significativa de espaço precisa ser recuperada de dentro da tabela.

    Minha ênfase em negrito.

    CLUSTERconsegue isso, também, como um efeito colateral.

    Plain VACUUMnormalmente não atinge seu objetivo ( "uma ou mais páginas no final de uma tabela totalmente gratuita" ). Ele não reordena as linhas e apenas remove as páginas vazias do final físico do arquivo quando surge a oportunidade - como revela sua citação do manual.

    Você pode obter páginas vazias no final do arquivo físico quando você adiciona INSERTum lote de linhas DELETEantes que outras tuplas sejam anexadas. Ou pode acontecer por coincidência se linhas suficientes forem excluídas.

    Há também configurações especiais que podem impedir VACUUM FULLa recuperação de espaço. Ver:

    • Como otimizar uma tabela para atualizações de alta frequência?

    Preparar páginas vazias no final de uma tabela para teste

    A coluna do sistema ctidrepresenta a posição física de uma linha. Você precisa entender essa coluna:

    • Como decomponho o ctid em números de página e linha?

    Podemos trabalhar com isso e preparar uma tabela excluindo todas as linhas da última página:

    DELETE FROM tbl t
    USING (
       SELECT (split_part(ctid::text, ',', 1) || ',0)')::tid     AS min_tid
            , (split_part(ctid::text, ',', 1) || ',65535)')::tid AS max_tid
       FROM   tbl
       ORDER  BY ctid DESC
       LIMIT  1
       ) d
    WHERE  t.ctid BETWEEN d.min_tid AND d.max_tid;
    

    Agora, a última página está vazia. Isso ignora gravações simultâneas. Ou você é o único a escrever nessa tabela ou precisa fazer um bloqueio de gravação para evitar condições de corrida.

    A consulta é otimizada para identificar rapidamente as linhas qualificadas. O segundo número de a tidé o índice da tupla armazenado como unsigned int2e 65535é o máximo para esse tipo ( 2^16 - 1), portanto, esse é o limite superior seguro.

    db<>fiddle aqui (reutilizando uma tabela simples de um caso diferente.)
    Old sqlfiddle

    Ferramentas para medir o tamanho da linha/tabela:

    • Medir o tamanho de uma linha da tabela PostgreSQL

    Disco cheio

    Você precisa de espaço de manobra no disco para qualquer uma dessas operações. Há também a ferramenta da comunidade pg_repackcomo substituto para VACUUM FULL/ CLUSTER. Evita travas exclusivas, mas também precisa de espaço livre para trabalhar. O manual:

    Requer espaço livre em disco duas vezes maior que a(s) tabela(s) e índices de destino.

    Como último recurso, você pode executar um ciclo de despejo/restauração. Isso também remove todo o inchaço das tabelas e índices. Pergunta intimamente relacionada:

    • Eu preciso executar VACUUM FULL sem espaço em disco disponível

    A resposta ali é bem radical. Se sua situação permitir (sem chaves estrangeiras ou outras referências impedindo a exclusão de linhas) e sem acesso simultâneo à tabela), você pode apenas:

    Despeje a tabela em disco conectando de um computador remoto com bastante espaço em disco ( -apara --data-only):

    De um shell remoto, despeje os dados da tabela:

    pg_dump -h <host_name> -p <port> -t mytbl -a mydb > db_mytbl.sql
    

    Em uma sessão pg, TRUNCATEa tabela:

    -- drop all indexes and constraints here for best performance
    TRUNCATE mytbl;
    

    Do shell remoto, restaure para a mesma tabela:

    psql -h <host_name> -p <port> mydb -f db_mytbl.sql
    -- recreate all indexes and constraints here
    

    Agora está livre de quaisquer linhas mortas ou inchaço.

    Mas talvez você possa ter isso mais simples?

    • Você pode liberar espaço suficiente no disco excluindo (movendo) arquivos não relacionados?

    • Você pode VACUUM FULLdiminuir as tabelas primeiro, uma por uma, liberando espaço em disco suficiente?

    • Você pode executar REINDEX TABLEou REINDEX INDEXliberar espaço em disco de índices inchados?

    Faça o que fizer, não seja precipitado . Em caso de dúvida, faça backup de tudo em um local seguro primeiro.

    • 53

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

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