Problema con il ripristino di Discourse da backup (3.4, database abbastanza grande)

Ciao,
siamo uno dei nostri utenti early bird, utilizziamo Discourse dal 2015.
Funziona perfettamente fino all’ultimo aggiornamento incluso quello di Postgres (probabilmente la 3.4?). Abbiamo un punto di backup precedente a questo aggiornamento. Abbiamo deciso di effettuare un’installazione pulita e poi ripristinare da questo backup.

OS: Ubuntu 24.04.1 LTS (aggiornamenti più recenti) + docker 26.1.3
Stiamo tentando di ripristinare un backup Discourse di grandi dimensioni (44 GB, singolo sito) su un contenitore vuoto.

Il ripristino automatizzato fallisce durante la migrazione del database con il seguente errore:
PG::DuplicateColumn: ERRORE: la colonna “notification_level” della relazione “user_chat_channel_memberships” esiste già (PG::DuplicateColumn)

log:
In particolare, la migrazione si interrompe dopo il deploy dell’archivio SQL perché una colonna nel database non è unica.
la colonna "notification_level" della relazione "user_chat_channel_memberships" esiste già

Riepilogo

ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
Migrazione del database in corso…
ECCEZIONE: /var/www/discourse/lib/discourse.rb:139:in `exec’: Migrazione del database fallita.
rake aborted!
StandardError: Si è verificato un errore, tutte le migrazioni successive sono state annullate: (StandardError)

PG::DuplicateColumn: ERRORE: la colonna “notification_level” della relazione “user_chat_channel_memberships” esiste già
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-mini-profiler-3.3.1/lib/patches/db/pg.rb:110:in exec' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-mini-profiler-3.3.1/lib/patches/db/pg.rb:110:in async_exec’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:56:in block (2 levels) in raw_execute' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract_adapter.rb:1004:in block in with_raw_connection’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/concurrency/null_lock.rb:9:in synchronize' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract_adapter.rb:976:in with_raw_connection’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:55:in block in raw_execute' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/notifications/instrumenter.rb:58:in instrument’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract_adapter.rb:1119:in log' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:54:in raw_execute’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/database_statements.rb:538:in internal_execute' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/database_statements.rb:137:in execute’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/query_cache.rb:27:in execute' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:48:in execute’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/schema_statements.rb:629:in add_column' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql/schema_statements.rb:418:in add_column’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration/default_strategy.rb:10:in method_missing' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1059:in block in method_missing’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1025:in block in say_with_time' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/benchmark-0.4.0/lib/benchmark.rb:304:in measure’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1025:in say_with_time' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1048:in method_missing’
/var/www/discourse/plugins/chat/db/migrate/20241003122030_add_notification_level_to_user_chat_channel_memberships.rb:10:in up' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:997:in public_send’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:997:in exec_migration' /var/www/discourse/lib/freedom_patches/schema_migration_details.rb:8:in block in exec_migration’

/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/benchmark-0.4.0/lib/benchmark.rb:304:in measure' /var/www/discourse/lib/freedom_patches/schema_migration_details.rb:8:in exec_migration’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:978:in block (2 levels) in migrate' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/benchmark-0.4.0/lib/benchmark.rb:304:in measure’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:977:in block in migrate' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:415:in with_connection’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:976:in migrate' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1190:in migrate’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1538:in block in execute_migration_in_transaction' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1591:in ddl_transaction’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1537:in execute_migration_in_transaction' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1512:in each’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1512:in migrate_without_lock' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1457:in block in migrate’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1609:in with_advisory_lock' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1457:in migrate’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1264:in up' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1239:in migrate’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/tasks/database_tasks.rb:262:in migrate' /var/www/discourse/lib/tasks/db.rake:259:in block (2 levels) in ’
/var/www/discourse/lib/distributed_mutex.rb:53:in block in synchronize' /var/www/discourse/lib/distributed_mutex.rb:49:in synchronize’
/var/www/discourse/lib/distributed_mutex.rb:49:in synchronize' /var/www/discourse/lib/distributed_mutex.rb:34:in synchronize’
/var/www/discourse/lib/tasks/db.rake:234:in block in <main>' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/exe/rake:27:in <top (required)>’

Causa:
ActiveRecord::StatementInvalid: PG::DuplicateColumn: ERRORE: la colonna “notification_level” della relazione “user_chat_channel_memberships” esiste già (ActiveRecord::StatementInvalid)
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-mini-profiler-3.3.1/lib/patches/db/pg.rb:110:in exec' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-mini-profiler-3.3.1/lib/patches/db/pg.rb:110:in async_exec’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:56:in block (2 levels) in raw_execute' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract_adapter.rb:1004:in block in with_raw_connection’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/concurrency/null_lock.rb:9:in synchronize' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract_adapter.rb:976:in with_raw_connection’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:55:in block in raw_execute' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/notifications/instrumenter.rb:58:in instrument’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract_adapter.rb:1119:in log' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:54:in raw_execute’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/database_statements.rb:538:in internal_execute' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/database_statements.rb:137:in execute’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/query_cache.rb:27:in execute' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:48:in execute’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/schema_statements.rb:629:in add_column' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql/schema_statements.rb:418:in add_column’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration/default_strategy.rb:10:in method_missing' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1059:in block in method_missing’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1025:in block in say_with_time' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/benchmark-0.4.0/lib/benchmark.rb:304:in measure’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1025:in say_with_time' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1048:in method_missing’
/var/www/discourse/plugins/chat/db/migrate/20241003122030_add_notification_level_to_user_chat_channel_memberships.rb:10:in up' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:997:in public_send’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:997:in exec_migration' /var/www/discourse/lib/freedom_patches/schema_migration_details.rb:8:in block in exec_migration’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/benchmark-0.4.0/lib/benchmark.rb:304:in measure' /var/www/discourse/lib/freedom_patches/schema_migration_details.rb:8:in exec_migration’

/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:978:in block (2 levels) in migrate' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/benchmark-0.4.0/lib/benchmark.rb:304:in measure’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:977:in block in migrate' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:415:in with_connection’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:976:in migrate' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1190:in migrate’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1538:in block in execute_migration_in_transaction' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1591:in ddl_transaction’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1537:in execute_migration_in_transaction' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1512:in each’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1512:in migrate_without_lock' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1457:in block in migrate’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1609:in with_advisory_lock' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1457:in migrate’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1264:in up' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1239:in migrate’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/tasks/database_tasks.rb:262:in migrate' /var/www/discourse/lib/tasks/db.rake:259:in block (2 levels) in ’
/var/www/discourse/lib/distributed_mutex.rb:53:in block in synchronize' /var/www/discourse/lib/distributed_mutex.rb:49:in synchronize’
/var/www/discourse/lib/distributed_mutex.rb:49:in synchronize' /var/www/discourse/lib/distributed_mutex.rb:34:in synchronize’
/var/www/discourse/lib/tasks/db.rake:234:in block in <main>' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/exe/rake:27:in <top (required)>’

Causa:
PG::DuplicateColumn: ERRORE: la colonna “notification_level” della relazione “user_chat_channel_memberships” esiste già (PG::DuplicateColumn)
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-mini-profiler-3.3.1/lib/patches/db/pg.rb:110:in exec' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-mini-profiler-3.3.1/lib/patches/db/pg.rb:110:in async_exec’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:56:in block (2 levels) in raw_execute' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract_adapter.rb:1004:in block in with_raw_connection’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/concurrency/null_lock.rb:9:in synchronize' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract_adapter.rb:976:in with_raw_connection’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:55:in block in raw_execute' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/notifications/instrumenter.rb:58:in instrument’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract_adapter.rb:1119:in log' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:54:in raw_execute’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/database_statements.rb:538:in internal_execute' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/database_statements.rb:137:in execute’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/query_cache.rb:27:in execute' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:48:in execute’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/schema_statements.rb:629:in add_column' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql/schema_statements.rb:418:in add_column’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration/default_strategy.rb:10:in method_missing' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1059:in block in method_missing’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1025:in block in say_with_time' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/benchmark-0.4.0/lib/benchmark.rb:304:in measure’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1025:in say_with_time' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1048:in method_missing’
/var/www/discourse/plugins/chat/db/migrate/20241003122030_add_notification_level_to_user_chat_channel_memberships.rb:10:in up' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:997:in public_send’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:997:in exec_migration' /var/www/discourse/lib/freedom_patches/schema_migration_details.rb:8:in block in exec_migration’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/benchmark-0.4.0/lib/benchmark.rb:304:in measure' /var/www/discourse/lib/freedom_patches/schema_migration_details.rb:8:in exec_migration’

/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:978:in block (2 levels) in migrate' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/benchmark-0.4.0/lib/benchmark.rb:304:in measure’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:977:in block in migrate' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:415:in with_connection’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:976:in migrate' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1190:in migrate’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1538:in block in execute_migration_in_transaction' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1591:in ddl_transaction’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1537:in execute_migration_in_transaction' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1512:in each’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1512:in migrate_without_lock' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1457:in block in migrate’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1609:in with_advisory_lock' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1457:in migrate’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1264:in up' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/migration.rb:1239:in migrate’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/tasks/database_tasks.rb:262:in migrate' /var/www/discourse/lib/tasks/db.rake:259:in block (2 levels) in ’
/var/www/discourse/lib/distributed_mutex.rb:53:in block in synchronize' /var/www/discourse/lib/distributed_mutex.rb:49:in synchronize’
/var/www/discourse/lib/distributed_mutex.rb:49:in synchronize' /var/www/discourse/lib/distributed_mutex.rb:34:in synchronize’
/var/www/discourse/lib/tasks/db.rake:234:in block in <main>' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/exe/rake:27:in <top (required)>’
Compiti: TOP => db:migrate
(Vedi traccia completa eseguendo il compito con --trace)
/var/www/discourse/lib/discourse.rb:173:in execute_command' /var/www/discourse/lib/discourse.rb:139:in exec’
/var/www/discourse/lib/discourse.rb:35:in execute_command' /var/www/discourse/lib/backup_restore/database_restorer.rb:153:in migrate_database’
/var/www/discourse/lib/backup_restore/database_restorer.rb:28:in restore' /var/www/discourse/lib/backup_restore/restorer.rb:61:in run’
script/discourse:191:in restore' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/thor-1.3.2/lib/thor/command.rb:28:in run’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/thor-1.3.2/lib/thor/invocation.rb:127:in invoke_command' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/thor-1.3.2/lib/thor.rb:538:in dispatch’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/thor-1.3.2/lib/thor/base.rb:584:in start' script/discourse:345:in <top (required)>’
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/cli/exec.rb:58:in load' /usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/cli/exec.rb:58:in kernel_load’
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/cli/exec.rb:23:in run' /usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/cli.rb:455:in exec’
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/vendor/thor/lib/thor/command.rb:28:in `run’

/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in invoke_command' /usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/vendor/thor/lib/thor.rb:527:in dispatch’
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/cli.rb:35:in dispatch' /usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/vendor/thor/lib/thor/base.rb:584:in start’
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/cli.rb:29:in start' /usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/exe/bundle:28:in block in <top (required)>’
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/friendly_errors.rb:117:in with_friendly_errors' /usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/exe/bundle:20:in <top (required)>’
/usr/local/bin/bundle:25:in load' /usr/local/bin/bundle:25:in
Tentativo di rollback…
Rollback in corso…
Pulizia dei dati…
Rimozione delle funzioni dallo schema discourse_functions…
Rimozione della cartella tmp ‘/var/www/discourse/tmp/restores/default/2025-01-09-180715’…
Riattivazione di sidekiq…
Segnalazione del completamento del ripristino…
Notifica all’unità ‘system’ della fine del ripristino…
Completato!
[FALLITO]

Come correggere un file SQL in modo che db:migrate venga eseguito correttamente?

Su quale commit si trova il vecchio sito?

Ci sono state un paio di regressioni in cui un commit includeva una migrazione che non avrebbe dovuto. La mia ipotesi è che questo sia uno di quei casi.

Hai esattamente lo stesso set di plugin su entrambe le istanze?
Su quale commit si trova la tua installazione di Discourse esistente e su quale commit del plugin chat?

Apprezzo il tuo gentile coinvolgimento. Il dump SQL è di 45 GB, ci vuole un’eternità per lavorarci.
Ho provato a eseguire l’aggiornamento della GUI il 31 dicembre che ha bloccato la migrazione del DB. Il vecchio sito è sparito dal 6 gennaio, tutto ciò che ho è il dump SQL e i caricamenti multimediali salvati. Sto cercando di avviare un nuovo sito e ripristinare il mio DB lì. Sto eseguendo solo pochi plugin nel mio YAML:

Qual è il nome del file di backup? (Contiene informazioni sull’ultima migrazione eseguita)

sitename-2025-01-06-033732-v20240912212253.sql.gz

Durante il ripristino manuale, sono stati segnalati i seguenti problemi (potrebbero significare qualcosa anche questi):
psql:/shared/backups/default/da-stereo-2025-01-06-033732-v20240912212253.sql:842596361: ERRORE: impossibile creare l’indice univoco "category_featured_topics_pkey"
DETTAGLIO: La chiave (id)=(14) è duplicata.
psql:/shared/backups/default/da-stereo-2025-01-06-033732-v20240912212253.sql:842596928: ERRORE: impossibile creare l’indice univoco "incoming_links_pkey"
DETTAGLIO: La chiave (id)=(1) è duplicata.
psql:/shared/backups/default/da-stereo-2025-01-06-033732-v20240912212253.sql:842596937: ERRORE: impossibile creare l’indice univoco "incoming_referers_pkey"
DETTAGLIO: La chiave (id)=(1) è duplicata.
psql:/shared/backups/default/da-stereo-2025-01-06-033732-v20240912212253.sql:842597117: ERRORE: impossibile creare l’indice univoco "post_hotlinked_media_pkey"
DETTAGLIO: La chiave (id)=(1) è duplicata.
psql:/shared/backups/default/da-stereo-2025-01-06-033732-v20240912212253.sql:842597378: ERRORE: impossibile creare l’indice univoco "sitemaps_pkey"
DETTAGLIO: La chiave (id)=(2) è duplicata.
psql:/shared/backups/default/da-stereo-2025-01-06-033732-v20240912212253.sql:842597693: ERRORE: impossibile creare l’indice univoco "upload_references_pkey"
DETTAGLIO: La chiave (id)=(8) è duplicata.

Quindi è interessante.

  • quei conflitti riguardano tabelle piuttosto banali e gli ID in conflitto sono bassi
  • il tuo backup risale a settembre e la migrazione column "notification_level" of relation "user_chat_channel_memberships" already exists è di ottobre, quindi non è stata eseguita sulla tua istanza precedente, ed è una delle prime migrazioni che viene eseguita dopo il ripristino.

Questo mi fa pensare che tu abbia un problema diverso. Si tratta di un’installazione standard? E la tua istanza precedente era un’installazione standard? Ho il sospetto che il backup non venga ripristinato nello schema corretto e che le migrazioni vengano eseguite su un’istanza vuota.

Sì, è una normale installazione di Docker e il mio sito originale è stato creato utilizzando questo manuale nel 2015.

C’è qualcosa che posso estrarre dalla console Postgres o Rails per fare luce su cosa sta succedendo?

Grazie,
Qualsiasi suggerimento, consiglio o indicazione sarà molto apprezzato.

Intendi un backup di Discourse solo SQL o uno dump SQL che hai creato in altro modo?

Backup esclusivo di Discourse.

A casa, ho configurato PostgreSQL e il nostro backup dei dati è stato ripristinato quasi senza problemi.
Sembra che durante il ripristino del file in PostgreSQL (che si trova all’interno del container di Discourse), il vecchio database non venga eliminato, e questo causa un conflitto, impedendo la corretta distribuzione del backup.

Sembra quello che diceva Richard.

Ci sono stati alcuni commit relativi a postgres di recente, anche se non sono sicuro che siano stati accettati. Potresti provare a ricompilare prima di tentare di ripristinare di nuovo.

Quando si ripristina un archivio sql.gz, si osserva quanto segue:

Copia dell’archivio nella directory temporanea…
Estrazione del file di dump…
Validazione dei metadati…
Versione corrente: 20241224191732
Versione ripristinata: 20240912212253

e ovviamente db:migration fallisce con l’errore segnalato nel post #1

Si osserva che il database postgres “discourse” è stato ripristinato con tutte le tabelle/dati richiesti al suo interno:
psql (13.18 (Debian 13.18-1.pgdg120+1))
Digita “help” per aiuto.

discourse=> \dn+
                                  Elenco degli schemi
        Nome         |   Proprietario   |       Privilegi di accesso       |      Descrizione
---------------------+------------------+----------------------------------+------------------------
 backup              | discourse        |                                  |
 discourse_functions | discourse        |                                  |
 public              | discourse        | discourse=UC/discourse +         | schema pubblico standard
                     |                  | =UC/discourse                    |
(3 righe)

discourse=> discourse=> \l
                                  Elenco dei database
   Nome    |  Proprietario | Codifica |   Ordinamento   |    ctype    |       Privilegi di accesso
-----------+---------------+----------+-----------------+-------------+----------------------------------
 discourse | postgres      | UTF8     | en_US.UTF-8     | en_US.UTF-8 | =Tc/postgres +
           |               |          |                 |             | postgres=CTc/postgres +
           |               |          |                 |             | discourse=CTc/postgres
 postgres  | postgres      | UTF8     | en_US.UTF-8     | en_US.UTF-8 |
 template0 | postgres      | UTF8     | en_US.UTF-8     | en_US.UTF-8 | =c/postgres +
           |               |          |                 |             | postgres=CTc/postgres
 template1 | postgres      | UTF8     | en_US.UTF-8     | en_US.UTF-8 | =c/postgres +
           |               |          |                 |             | postgres=CTc/postgres
(4 righe)

ma rake segnala che sta utilizzando il DB sbagliato:

rake db:version

database: discourse
Current version: 20241224191732

Come posso indicare a rake di puntare a 20240912212253?

Grazie

Questo è ciò che accade quando c’è un problema di permessi. Discourse gestisce gli schemi durante il ripristino e quando non ha i permessi per enumerare le tabelle nel database, le cose vanno male.

Anche se non l’ho mai sperimentato, potrebbe anche essere un problema con lo spazio su disco disponibile?

Solo una sensazione: potrebbe esserci un timeout durante gli spostamenti delle tabelle dopo un ripristino?

Grazie per l’indizio.

Lo spazio su disco non è un problema; ho 6-7 volte più spazio della dimensione del DB. Posso provare un’importazione manuale prima di eseguire la migrazione e correggere i permessi. La domanda è, cosa esattamente deve essere concesso?

Penso che tu debba aggiornare lo script manuale in questo modo:

DROP SCHEMA public CASCADE;
CREATE SCHEMA public;
ALTER SCHEMA public OWNER TO discourse;
CREATE EXTENSION IF NOT EXISTS hstore;
CREATE EXTENSION IF NOT EXISTS pg_trgm;
END;

Non è necessario creare lo schema public (e impostare il proprietario), poiché le versioni più recenti di Pg creano lo schema dal backup SQL dump.
Tuttavia, le autorizzazioni delle tabelle devono essere corrette per l’utente discourse, per impostazione predefinita sono postgres.

Ora funziona! Grazie a tutti per le idee e il supporto.