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 / 46858
Accepted
Bruno
Bruno
Asked: 2013-07-24 05:42:28 +0800 CST2013-07-24 05:42:28 +0800 CST 2013-07-24 05:42:28 +0800 CST

Estratégias do PostgreSQL para lidar com o preenchimento do disco

  • 772

Estou utilizando o PostgreSQL (8.4) para armazenar dados produzidos por uma aplicação que faz inserções frequentes (na estrutura da tabela descrita abaixo).

O banco de dados continua crescendo com o tempo e, como os dados mais recentes são mais relevantes do que os dados mais antigos (neste aplicativo específico), excluir as linhas mais antigas é uma solução razoável (com base em lower idou old input_datetime, que é mais ou menos o mesmo) .

Para evitar que problemas relacionados a este banco de dados (o único banco de dados executado neste servidor) afetem o restante do sistema, coloquei o diretório de dados do PostgreSQL em sua própria partição (ext3, em um sistema Linux). No entanto, quando essa partição fica cheia, isso causa vários problemas.

Estou pensando em excluir dados antigos regularmente (por exemplo, por DELETE FROM data_group WHERE id <= ...meio de um trabalho cron) para lidar com isso.

Em primeiro lugar, meu entendimento VACUUM(conforme realizado pelo vácuo automático, que está ativado) é que, embora não devolva necessariamente o espaço em disco ao sistema operacional (como VACUUM FULLfaria), ele ainda permite que alguns novos dados sejam inseridos no espaço em disco já utilizado (ou seja, os DELETEs não afetam necessariamente o tamanho do arquivo, mas ainda liberam espaço nas próprias estruturas de dados do PostgreSQL). Isso está correto? (Percebi que VACUUM FULLcausou alguns problemas com o próprio aplicativo, provavelmente por causa dos bloqueios que ele usa.)

Nesse caso, também parece que SELECT pg_database_size('my_database')reflete o tamanho usado no disco, o que não necessariamente reflete o que está disponível para inserções posteriores. Existe outra maneira de estimar quanto espaço está disponível para novas inserções?

Além disso, quando é tarde demais e a partição está preenchida em 100%, executar esta DELETEinstrução causa este erro e trava o serviço PostgreSQL:

PANIC: não foi possível gravar no arquivo "pg_xlog/xlogtemp.7810": não há mais espaço no dispositivo

A parada do daemon do PostgreSQL é obviamente um grande problema (e não há outro disco para onde mover o cluster nesta máquina).

Existem estratégias gerais para evitar que esse tipo de problema ocorra (sabendo que o espaço em disco é limitado em uma determinada partição, mas que pode ser aceitável excluir dados mais antigos)? Eu gostaria de automatizar o máximo possível, sem rootou postgres(ou intervenção do administrador do PostgreSQL).


CREATE TABLE data_group (
    id SERIAL PRIMARY KEY,
    name TEXT,
    input_datetime TIMESTAMPTZ
);

CREATE TABLE data_item (
    id SERIAL PRIMARY KEY,
    group_id INTEGER NOT NULL REFERENCES data_group(id) ON DELETE CASCADE ON UPDATE CASCADE,
    position INTEGER NOT NULL,
    data BYTEA
);
postgresql disk-space
  • 1 1 respostas
  • 4119 Views

1 respostas

  • Voted
  1. Best Answer
    dezso
    2013-07-24T06:18:02+08:002013-07-24T06:18:02+08:00

    Por um lado, você pode dar uma olhada em uma das minhas respostas anteriores para ver como você pode manter um tamanho de mesa mais ou menos estável. Lá você encontrará uma solução com gatilhos - claro, isso também pode ser resolvido usando um cron job. No último caso, primeiro verificaria se o número da linha excedeu um certo limite e excluiria as linhas mais antigas ou eliminaria uma partição.

    Por outro lado, como você já percebeu, é preciso cuidar do espaço em disco onde pg_xlogestá. Quando fica cheio, não é tão fácil de recuperar... Mas verificando as configurações do seu banco de dados você pode ter uma estimativa justa de quanto espaço você precisa:

    Sempre haverá pelo menos um arquivo de segmento WAL e normalmente não haverá mais de (2 + checkpoint_completion_target) * checkpoint_segments + 1ou checkpoint_segments + wal_keep_segments + 1 arquivos. Cada arquivo de segmento normalmente tem 16 MB (embora esse tamanho possa ser alterado ao construir o servidor). Você pode usar isso para estimar os requisitos de espaço para o WAL. Normalmente, quando os arquivos de segmento de log antigos não são mais necessários, eles são reciclados (renomeados para se tornarem os próximos segmentos na sequência numerada). Se, devido a um pico de curto prazo na taxa de saída de log, houver mais do que arquivos de 3 * checkpoint_segments + 1segmento, os arquivos de segmento desnecessários serão excluídos em vez de reciclados até que o sistema volte a esse limite.

    Se você não tiver configurado a replicação, o máximo é 3 * checkpoint_segments + 1(vezes 16 MB). Uma configuração típica sem replicação precisará de menos de 10 GB para pg_xlog, eu acho.

    • 4

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