Ho un’installazione standard che sta tentando di ripristinare un database. Fallisce durante la migrazione.
ALTER TABLE
Migrating the database...
EXCEPTION: rake db:migrate
Failed to migrate database.
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled: (StandardError)
PG::DiskFull: ERROR: could not write to file "base/pgsql_tmp/pgsql_tmp11009.51": No space left on device
/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'
Ci sono 90 GB di spazio libero sul disco. Sul disco di origine, la directory postgres è solo 23 GB.
Come può un database da 23 GB fallire il ripristino durante la migrazione del database con 90 GB liberi?
Dopo che il database è stato ripristinato, postgres_data era di 24G.
Qualcosa nella migrazione ha fatto sì che postgres_data salisse a 91G prima che il disco si riempisse e il ripristino fallisse. Questo è su un’installazione pulita con le versioni di Discourse mostrate sopra.
Questo sembra proprio un bug, quindi sto ricategorizzando. L’ho visto anche quando ho provato ad aggiornare. Pensavo che per quell’aggiornamento una soluzione sarebbe stata passare a un nuovo server, ma ora vedo che non funzionerà.
Immagino che la prossima cosa da fare sarà provare a vedere quale query sta causando questo e/o quale tabella sia. Non sono del tutto sicuro di come procedere.
Sto inserendo questo nel supporto, questo messaggio proviene direttamente dal file system, se PG pensa di non avere spazio, probabilmente non ha spazio perché non ne è stato allocato abbastanza per esso.
Usando du e df ho osservato la dimensione di postgres_data crescere da 25g a 90g e lo spazio sul disco arrivare a (quasi) zero prima che fallisse.
Immagino di dover trovare un modo per tracciare quale query è in esecuzione la prossima volta.
L’ho visto su almeno due siti. Uno durante un aggiornamento e uno durante un ripristino. Entrambi avevano più spazio libero della dimensione del database all’inizio.
Un mucchio di migrazioni riscrive intere tabelle, il che può temporaneamente utilizzare più spazio, e PostgreSQL non restituisce aggressivamente lo spazio al sistema.
Se vuoi addentrarti nel tunnel, potresti ripristinarlo manualmente in un ambiente di sviluppo che si trova al commit di maggio 2025, quindi passare al commit corrente ed eseguire le migrazioni una per una e stampare lo spazio prima e dopo ciascuna — ovviamente con uno script .