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 / 17057
Accepted
Justin Rhyne
Justin Rhyne
Asked: 2012-04-26 12:31:08 +0800 CST2012-04-26 12:31:08 +0800 CST 2012-04-26 12:31:08 +0800 CST

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

  • 772

Eu tenho uma mesa que está ocupando cerca de 90% do espaço do hd em nosso servidor. Eu decidi soltar algumas colunas para liberar espaço. Mas preciso devolver o espaço ao SO. O problema, porém, é que não tenho certeza do que acontecerá se eu executar VACUUM FULL e não houver espaço livre suficiente para fazer uma cópia da tabela.

Entendo que VACUUM FULL não deve ser usado, mas achei que era a melhor opção nesse cenário.

Todas as idéias seriam apreciadas.

Estou usando o PostgreSQL 9.0.6

postgresql delete
  • 5 5 respostas
  • 44681 Views

5 respostas

  • Voted
  1. exhuma
    2015-10-15T03:55:38+08:002015-10-15T03:55:38+08:00

    Método com pouco ou nenhum tempo de inatividade (impacto mínimo para o usuário)


    NOTA: Eu testei isso em 9.1. Eu não tenho nenhum servidor 9.0 por aqui. Tenho certeza de que funcionará no 9.0.


    CUIDADO (conforme observado nos comentários de @erny):

    Note that high CPU load due to I/O operations may be expected.
    

    Você pode fazer isso praticamente sem tempo de inatividade usando um tablespace temporário. O tempo de inatividade será na forma de bloqueios exclusivos. Mas apenas na mesa você está aspirando. Portanto, tudo o que acontecerá é que as consultas dos clientes simplesmente aguardarão a aquisição do bloqueio se acessarem a tabela em questão. Você não precisa fechar as conexões existentes.

    Uma coisa para estar ciente, porém, é que mover a mesa e o vácuo completo precisarão esperar por um bloqueio exclusivo primeiro!


    Primeiro, você obviamente precisa de algum armazenamento adicional. Como Stéphanemencionado nos comentários, isso precisa ser pelo menos duas vezes maior que a tabela em questão, como VACUUM FULLuma cópia completa. Se você tiver sorte e puder adicionar um disco dinamicamente à máquina, faça isso. Na pior das hipóteses , você pode simplesmente conectar um disco USB (embora arriscado e lento)!

    Em seguida, monte o novo dispositivo e disponibilize-o como tablespace:

    CREATE TABLESPACE tempspace LOCATION '/path/to/new/folder';
    

    Você pode listar os tablespaces facilmente usando:

    \db
    

    Verifique novamente o tablespace atual da sua tabela (você precisa saber para onde movê-lo de volta):

    SELECT tablespace FROM pg_tables WHERE tablename = 'mytable';
    

    Se for NULL, estará no tablespace padrão:

    SHOW default_tablespace;
    

    Se for assimNULL , provavelmente será pg_default(verifique os documentos oficiais caso seja alterado).

    Agora mova a tabela sobre:

    ALTER TABLE mytable SET TABLESPACE tempspace;
    COMMIT;  -- if autocommit is off
    

    Aspire:

    VACUUM FULL mytable;
    

    Mova de volta:

    -- assuming you are using the defaults, the tablespace will be "pg_default".
    -- Otherwise use the value from the SELECT we did earlier.
    ALTER TABLE mytable SET TABLESPACE pg_default;
    COMMIT;  -- if autocommit is off
    

    Remova o espaço temporário:

    DROP TABLESPACE tempspace;
    
    • 29
  2. Best Answer
    Craig Efrein
    2012-04-28T02:14:40+08:002012-04-28T02:14:40+08:00

    Como você não tem espaço suficiente para executar um vacumm ou reconstruir, você sempre pode reconstruir seus bancos de dados postgresql restaurando-os. Restaurar os bancos de dados, tabelas e índices liberará espaço e desfragmentará. Depois, você pode configurar a manutenção automatizada para limpar seus bancos de dados regularmente.

    1 Faça backup de todos os bancos de dados em seu servidor postgresql

    Você desejará fazer backup de todos os seus bancos de dados em uma partição que tenha espaço suficiente. Se você estava no Linux, você pode usar o gzip para compactar ainda mais o backup para economizar espaço

    su - postgres
    pg_dumpall | gzip -9 > /some/partition/all.dbs.out.gz
    

    2 Faça backup de seus arquivos de configuração

    cp /path/to/postgresql/data_directory/*.conf /some/partition/
    

    3 Pare o Postgresql

    pg_ctl -D /path/to/postgresql/data_directory stop
    

    4 apague o conteúdo do diretório de dados

    rm -Rf /path/to/postgresql/data_directory/*
    

    5 Execute initdb para reinicializar seu diretório de dados

    initdb -D /path/to/postgresql/data_directory
    

    6 Restaurar arquivos de configuração

    cp /some/partition/*.conf /path/to/postgresql/data_directory/*.conf 
    

    7 Inicie o Postgresql

    pg_ctl -D /path/to/postgresql/data_directory start
    

    8 Restaure o dump de todos os bancos de dados que você criou

    gunzip /some/partition/all.dbs.out.gz
    psql -f /some/partition/all.dbs.out
    
    • 28
  3. Roger Dahl
    2017-09-17T01:15:01+08:002017-09-17T01:15:01+08:00

    Rapido e sujo:

    • Parar Postgres
    • Mova o diretório principal do banco de dados para outro disco onde haja espaço suficiente para limpar
    • No local original de main, adicione um link simbólico para o novo local
    • Vácuo
    • Exclua o link simbólico e mova o diretório principal de volta para seu local original
    • Iniciar Postgres

    Por exemplo,:

    $ service postgresql stop $ mv /var/lib/postgresql/9.5/main /mnt/bigdisk $ ln -sr /mnt/bigdisk/main /var/lib/postgresql/9.5 $ vacuumdb --all --full $ rm /var/lib/postgresql/9.5/main $ mv /mnt/bigdisk/main /var/lib/postgresql/9.5 $ service postgresql start

    • 6
  4. Gunther
    2017-02-12T04:35:18+08:002017-02-12T04:35:18+08:00

    Se você tiver espaço em disco para fazer um dump e restaurar, deverá ter espaço em disco para fazer um vácuodb --full. O problema é que o vácuodb --full fará uma cópia de todo o arquivo de dados. Então, o que você pode fazer é:

    1. copie os arquivos que contêm a tabela enorme para uma unidade diferente, por exemplo, uma unidade maior e mais lenta.
    2. faça links simbólicos do local original para o novo local na outra unidade.
    3. execute vacuodb --full, agora ele deve ler os dados do outro disco e gravar a tabela final no disco de dados original.
    • 2
  5. mivk
    2022-04-14T01:47:47+08:002022-04-14T01:47:47+08:00

    Depois de usar a resposta do exhuma acima para mover o tablespacede muitas tabelas para um disco diferente, o seguinte pode ser útil para:

    • Aspire todas as mesas, uma de cada vez.
    • Para todas as tabelas movidas, mova-as tablespacede volta para o padrão pg_default.

    Executar vacuumdbem todas as mesas, uma de cada vez

    db=my_database
    psql -U postgres -d $db -tA -c "SELECT table_name
      FROM information_schema.tables WHERE table_schema='public'" \
    | while read -r tbl; do
        echo "==Table $tbl"
        vacuumdb -U postgres -d $db -t "\"$tbl\"" --full --verbose 2>&1 
      done \
    | tee -a vacuum-$db.log
    

    Salvar comandos para voltar todas as tabelas movidas

    Isso encontra todas as tabelas que usam um tablespace"tempspace" nomeado e grava em um arquivo os comandos SQL para movê-los de volta parapg_default

    psql -U postgres -d $db -tA -c "SELECT tablename from pg_tables WHERE tablespace='tempspace';" \
    | while read -r tbl; do
        echo "ALTER TABLE \"$tbl\" SET tablespace pg_default;"
      done \
    >my_pg_restore_tblspc.sql
    

    Por fim, execute os comandos SQL no arquivo

    psql -U postgres -d "$db" -a -f my_pg_restore_tblspc.sql
    
    • 1

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 ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 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

    Como selecionar a primeira linha de cada grupo?

    • 6 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
    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
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +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