Estou com uma instalação padrão que está tentando restaurar um banco de dados. Está falhando na migração.
ALTER TABLE
Migrando o banco de dados...
EXCEPTION: rake db:migrate
Falha ao migrar o banco de dados.
rake abortado!
StandardError: Ocorreu um erro, esta e todas as migrações posteriores foram canceladas: (StandardError)
PG::DiskFull: ERRO: não foi possível escrever no arquivo "base/pgsql_tmp/pgsql_tmp11009.51": Sem espaço livre no dispositivo
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-mini-profiler-4.0.1/lib/patches/db/pg/alias_method.rb:109:in `exec'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-mini-profiler-4.0.1/lib/patches/db/pg/alias_method.rb:109:in `async_exec'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-8.0.4/lib/active_record/connection_adapters/postgresql/database_state
ments.rb:167:in `perform_query'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-8.0.4/lib/active_record/connection_adapters/abstract/database_stateme
nts.rb:556:in `block (2 levels) in raw_execute'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-8.0.4/lib/active_record/connection_adapters/abstract_adapter.rb:1017:in `block in with_raw_connection'
Há 90GB de dados livres no disco. No disco de origem, o diretório postgres tem apenas 23GB.
Como um banco de dados de 23GB está falhando ao restaurar durante a migração do banco de dados com 90GB livres?
Após a restauração do banco de dados, postgres_data estava com 24G.
Algo na migração fez com que postgres_data inflasse para 91G antes que o disco ficasse cheio e a restauração falhasse. Isso ocorre em uma instalação limpa com as versões do Discourse mostradas acima.
Isso parece ser um bug, então estou recategorizando. Eu também vi isso ao tentar atualizar. Eu pensei que para aquela atualização uma solução seria migrar para um novo servidor, mas agora percebo que isso não funcionará.
Acho que o próximo passo será tentar descobrir qual consulta está causando isso e/ou qual tabela é. Não tenho bem certeza de como fazer isso.
Estou colocando isto no suporte, esta mensagem está vindo diretamente do sistema de arquivos, se o PG acha que não tem espaço, provavelmente não tem espaço porque não foi alocado o suficiente para ele.
Usando du e df, observei o tamanho de postgres_data crescer de 25g para 90g e o espaço no disco ir para (quase) zero antes de falhar.
Acho que preciso encontrar uma maneira de rastrear qual consulta está sendo executada da próxima vez.
Eu vi isso em pelo menos dois sites. Um durante uma atualização e outro durante uma restauração. Ambos tinham mais espaço livre do que o tamanho do banco de dados para começar.
Um monte de migrações reescreve tabelas inteiras, o que pode usar temporariamente mais espaço, e o PostgreSQL também não devolve espaço agressivamente ao sistema.
Se você quiser se aprofundar, você poderia restaurá-lo manualmente para um ambiente de desenvolvimento que esteja no commit de maio de 2025, depois ir para o commit atual e executar as migrações uma por uma e imprimir o espaço antes e depois de cada uma — obviamente com um script .