Tengo una instalación estándar que está intentando restaurar una base de datos. Está fallando en la migración.
ALTER TABLE
Migrando la base de datos...
EXCEPCIÓN: rake db:migrate
Fallo al migrar la base de datos.
rake abortado!
StandardError: Ha ocurrido un error, este y todas las migraciones posteriores han sido canceladas: (StandardError)
PG::DiskFull: ERROR: no se pudo escribir en el archivo \"base/pgsql_tmp/pgsql_tmp11009.51\": No queda espacio en el 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'
Hay 90 GB de datos libres en el disco. En el disco de origen, el directorio de postgres es de solo 23 GB.
¿Cómo es que una base de datos de 23 GB falla al restaurarse durante la migración de la base de datos con 90 GB libres?
Después de que la base de datos se restaurara, postgres_data tenía 24G.
Algo en la migración hizo que postgres_data se inflara hasta 91G antes de que el disco se llenara y la restauración fallara. Esto es en una instalación limpia con las versiones de Discourse mostradas anteriormente.
Esto parece ser un error, así que estoy recategorizando. También lo he visto al intentar actualizar. Pensé que para esa actualización una solución sería migrar a un servidor nuevo, pero ahora veo que eso no funcionará.
Supongo que lo siguiente que haré será intentar ver qué consulta está causando esto y/o qué tabla es. No estoy muy seguro de cómo proceder con eso.
Estoy poniendo esto en soporte, este mensaje viene directo del sistema de archivos, si PG piensa que no tiene espacio, probablemente no tiene espacio porque no se le ha asignado suficiente.
Usando du y df observé el tamaño de postgres_data mientras crecía de 25g a 90g y el espacio en el disco llegaba a (casi) cero antes de que fallara.
Supongo que necesito encontrar una manera de rastrear qué consulta se está ejecutando la próxima vez.
Lo he visto en al menos dos sitios. Uno con una actualización y otro con una restauración. Ambos tenían más espacio libre que el tamaño de la base de datos para empezar.
Un montón de migraciones reescriben tablas enteras, lo que puede usar temporalmente más espacio, y PostgreSQL tampoco devuelve el espacio al sistema de forma agresiva.
¿Ese foro tiene IA con incrustaciones (embeddings) activada?
Si quieres profundizar, podrías restaurarlo manualmente a un entorno de desarrollo que esté en el commit de mayo de 2025, luego ir al commit actual y ejecutar las migraciones una por una e imprimir el espacio antes y después de cada una — obviamente con un script .