# 从备份恢复Discourse时遇到问题（3.4，数据库相当大）

**URL:** https://meta.discourse.org/t/problem-with-restore-discourse-from-backup-3-4-quite-large-db/346497
**Category:** Support
**Created:** [2025年一月10日 11:08 UTC](https://meta.discourse.org/t/problem-with-restore-discourse-from-backup-3-4-quite-large-db/346497 "2025-01-10T11:08:42Z")
**Posts on this page:** 19
**Page:** 1

<div class="post-metadata">

### Author: ![Dmitry\_Krasnoperov](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dmitry_krasnoperov/32/65079_2.png) [@Dmitry\_Krasnoperov](https://meta.discourse.org/u/Dmitry_Krasnoperov)
#### Post date: [2025年一月10日 11:08 UTC](https://meta.discourse.org/t/problem-with-restore-discourse-from-backup-3-4-quite-large-db/346497/1 "2025-01-10T11:08:42Z")

</div>

你好，  
我们是你们的早期用户之一，自 2015 年起一直使用 Discourse。  
在最近的更新（可能包含 PostgreSQL 更新，也许是 3.4 版本？）之前，一切运行正常。我们在该更新前只有一个备份点。我们决定进行全新安装，然后从该备份恢复。

操作系统：Ubuntu 24.04.1 LTS（最新更新）+ Docker 26.1.3  
尝试将大型 Discourse 备份（44GB，单个站点）恢复到空白容器中。

自动化恢复在数据库迁移时失败，出现以下错误：  
PG::DuplicateColumn: ERROR: column “notification\_level” of relation “user\_chat\_channel\_memberships” already exists (PG::DuplicateColumn)

日志：  
具体来说，在部署 SQL 归档后，迁移停止，因为数据库中的某一列已存在。  
`column "notification_level" of relation "user_chat_channel_memberships" already exists`

> **摘要**
>
> ALTER TABLE  
> ALTER TABLE  
> ALTER TABLE  
> ALTER TABLE  
> ALTER TABLE  
> 正在迁移数据库…  
> 异常：/var/www/discourse/lib/discourse.rb:139:in `exec’: 数据库迁移失败。  
> rake aborted!  
> StandardError: 发生错误，后续所有迁移已取消：(StandardError)
> 
> PG::DuplicateColumn: ERROR: column “notification\_level” of relation “user\_chat\_channel\_memberships” already exists  
> /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)\>’
> 
> 由以下错误引起：  
> ActiveRecord::StatementInvalid: PG::DuplicateColumn: ERROR: column “notification\_level” of relation “user\_chat\_channel\_memberships” already exists (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)\>’
> 
> 由以下错误引起：  
> PG::DuplicateColumn: ERROR: column “notification\_level” of relation “user\_chat\_channel\_memberships” already exists (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)\>’  
> 任务：TOP =\> db:migrate  
> （通过运行任务并添加 --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 `’  
> 正在尝试回滚…  
> 正在回滚…  
> 正在清理…  
> 正在从 discourse\_functions 架构中删除函数…  
> 正在移除临时目录 ‘/var/www/discourse/tmp/restores/default/2025-01-09-180715’…  
> 正在取消暂停 sidekiq…  
> 正在标记恢复为完成…  
> 正在通知“系统”恢复已结束…  
> 完成！  
> [失败]

---

<div class="post-metadata">

### Author: ![Dmitry\_Krasnoperov](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dmitry_krasnoperov/32/65079_2.png) [@Dmitry\_Krasnoperov](https://meta.discourse.org/u/Dmitry_Krasnoperov)
#### Post date: [2025年一月10日 12:16 UTC](https://meta.discourse.org/t/problem-with-restore-discourse-from-backup-3-4-quite-large-db/346497/2 "2025-01-10T12:16:49Z")

</div>

如何修复 SQL 文件以使 `db:migrate` 成功运行？

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [2025年一月10日 13:45 UTC](https://meta.discourse.org/t/problem-with-restore-discourse-from-backup-3-4-quite-large-db/346497/3 "2025-01-10T13:45:28Z")

</div>

旧站点使用的是哪个提交？

出现了一些回归问题，其中一个提交包含了不应包含的迁移。我猜这可能是其中一种情况。

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [2025年一月10日 13:54 UTC](https://meta.discourse.org/t/problem-with-restore-discourse-from-backup-3-4-quite-large-db/346497/4 "2025-01-10T13:54:59Z")

</div>

两个实例上的插件是否完全相同？  
您现有的 Discourse 是基于哪个提交，聊天插件又是基于哪个提交？

---

<div class="post-metadata">

### Author: ![Dmitry\_Krasnoperov](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dmitry_krasnoperov/32/65079_2.png) [@Dmitry\_Krasnoperov](https://meta.discourse.org/u/Dmitry_Krasnoperov)
#### Post date: [2025年一月10日 14:36 UTC](https://meta.discourse.org/t/problem-with-restore-discourse-from-backup-3-4-quite-large-db/346497/5 "2025-01-10T14:36:03Z")

</div>

感谢您的热心参与。SQL转储文件有45GB，处理起来非常耗时。  
我尝试在12月31日运行GUI更新，导致数据库迁移卡住。旧网站自1月6日以来已无法访问，我只有SQL转储文件和保存的媒体上传文件。我正在尝试启动一个新网站并在那里恢复我的数据库。我只运行了YAML中的几个插件：

> **[GitHub - discourse/discourse-vk-auth: Login with vk.com on a Discourse instance](https://github.com/discourse/discourse-vk-auth)**
>
> Login with vk.com on a Discourse instance

> **[GitHub - discourse/discourse-whos-online: A plugin for Discourse which uses the messagebus...](https://github.com/discourse/discourse-whos-online)**
>
> A plugin for Discourse which uses the messagebus to display a live list of active users

> **[GitHub - discourse/discourse-categories-suppressed](https://github.com/discourse/discourse-categories-suppressed)**
>
> Contribute to discourse/discourse-categories-suppressed development by creating an account on GitHub.

> **[GitHub - jannolii/discourse-topic-trade-buttons](https://github.com/jannolii/discourse-topic-trade-buttons)**
>
> Contribute to jannolii/discourse-topic-trade-buttons development by creating an account on GitHub.

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [2025年一月10日 14:45 UTC](https://meta.discourse.org/t/problem-with-restore-discourse-from-backup-3-4-quite-large-db/346497/6 "2025-01-10T14:45:26Z")

</div>

您的备份文件名是什么？（它包含有关上次运行的迁移的信息）

---

<div class="post-metadata">

### Author: ![Dmitry\_Krasnoperov](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dmitry_krasnoperov/32/65079_2.png) [@Dmitry\_Krasnoperov](https://meta.discourse.org/u/Dmitry_Krasnoperov)
#### Post date: [2025年一月10日 14:50 UTC](https://meta.discourse.org/t/problem-with-restore-discourse-from-backup-3-4-quite-large-db/346497/7 "2025-01-10T14:50:30Z")

</div>

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

进行手动恢复时，报告了以下问题（可能也意味着什么）：  
psql:/shared/backups/default/da-stereo-2025-01-06-033732-v20240912212253.sql:842596361: ERROR: 无法创建唯一索引“category\_featured\_topics\_pkey”  
DETAIL: 键 (id)=(14) 重复。  
psql:/shared/backups/default/da-stereo-2025-01-06-033732-v20240912212253.sql:842596928: ERROR: 无法创建唯一索引“incoming\_links\_pkey”  
DETAIL: 键 (id)=(1) 重复。  
psql:/shared/backups/default/da-stereo-2025-01-06-033732-v20240912212253.sql:842596937: ERROR: 无法创建唯一索引“incoming\_referers\_pkey”  
DETAIL: 键 (id)=(1) 重复。  
psql:/shared/backups/default/da-stereo-2025-01-06-033732-v20240912212253.sql:842597117: ERROR: 无法创建唯一索引“post\_hotlinked\_media\_pkey”  
DETAIL: 键 (id)=(1) 重复。  
psql:/shared/backups/default/da-stereo-2025-01-06-033732-v20240912212253.sql:842597378: ERROR: 无法创建唯一索引“sitemaps\_pkey”  
DETAIL: 键 (id)=(2) 重复。  
psql:/shared/backups/default/da-stereo-2025-01-06-033732-v20240912212253.sql:842597693: ERROR: 无法创建唯一索引“upload\_references\_pkey”  
DETAIL: 键 (id)=(8) 重复。

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [2025年一月10日 15:03 UTC](https://meta.discourse.org/t/problem-with-restore-discourse-from-backup-3-4-quite-large-db/346497/8 "2025-01-10T15:03:46Z")

</div>

这很有趣。

- 这些冲突发生在相当琐碎的表上，并且冲突的 ID 较低
- 您的备份来自九月，而 `column "notification_level" of relation "user_chat_channel_memberships" already exists` 迁移来自十月，因此它没有在您之前的实例上运行，并且它是恢复后最早运行的迁移之一。

在我看来，这听起来像是您遇到了其他问题。这是一个标准的安装吗？您之前的实例是标准安装吗？我有一种预感，备份没有在正确的模式下恢复，并且迁移正在针对一个空白实例运行。

---

<div class="post-metadata">

### Author: ![Dmitry\_Krasnoperov](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dmitry_krasnoperov/32/65079_2.png) [@Dmitry\_Krasnoperov](https://meta.discourse.org/u/Dmitry_Krasnoperov)
#### Post date: [2025年一月10日 15:53 UTC](https://meta.discourse.org/t/problem-with-restore-discourse-from-backup-3-4-quite-large-db/346497/9 "2025-01-10T15:53:15Z")

</div>

是的，这是一个标准的 docker 安装，我的原始站点是使用此手册在 2015 年创建的。

有什么可以从 postgres 或 rails 控制台提取的信息来阐明发生了什么吗？

---

<div class="post-metadata">

### Author: ![Dmitry\_Krasnoperov](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dmitry_krasnoperov/32/65079_2.png) [@Dmitry\_Krasnoperov](https://meta.discourse.org/u/Dmitry_Krasnoperov)
#### Post date: [2025年一月11日 14:38 UTC](https://meta.discourse.org/t/problem-with-restore-discourse-from-backup-3-4-quite-large-db/346497/10 "2025-01-11T14:38:29Z")

</div>

谢谢，  
任何提示、技巧或指导都将不胜感激。

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [2025年一月11日 19:23 UTC](https://meta.discourse.org/t/problem-with-restore-discourse-from-backup-3-4-quite-large-db/346497/11 "2025-01-11T19:23:11Z")

</div>

> [@Dmitry\_Krasnoperov](#):
>
> 我只有 SQL 转储

您是指仅 SQL 的 Discourse 备份，还是您以其他方式创建的某个 SQL 转储？

---

<div class="post-metadata">

### Author: ![Dmitry\_Krasnoperov](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dmitry_krasnoperov/32/65079_2.png) [@Dmitry\_Krasnoperov](https://meta.discourse.org/u/Dmitry_Krasnoperov)
#### Post date: [2025年一月12日 09:55 UTC](https://meta.discourse.org/t/problem-with-restore-discourse-from-backup-3-4-quite-large-db/346497/12 "2025-01-12T09:55:29Z")

</div>

Discourse 仅备份。

在家中，我设置了 PostgreSQL，并且我们的数据备份几乎毫无问题地恢复了。  
似乎在 PostgreSQL（位于 Discourse 容器内）中恢复文件时，旧数据库未被删除，这导致冲突，阻止了备份的正确部署。

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [2025年一月12日 12:35 UTC](https://meta.discourse.org/t/problem-with-restore-discourse-from-backup-3-4-quite-large-db/346497/13 "2025-01-12T12:35:53Z")

</div>

这听起来像是理查德说的那样。

最近有一些关于 postgres 的提交，但不确定它们是否已被接受。在再次尝试恢复之前，你可以尝试重新构建。

---

<div class="post-metadata">

### Author: ![Dmitry\_Krasnoperov](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dmitry_krasnoperov/32/65079_2.png) [@Dmitry\_Krasnoperov](https://meta.discourse.org/u/Dmitry_Krasnoperov)
#### Post date: [2025年一月12日 13:54 UTC](https://meta.discourse.org/t/problem-with-restore-discourse-from-backup-3-4-quite-large-db/346497/14 "2025-01-12T13:54:59Z")

</div>

在恢复 sql.gz 存档时，我看到以下内容：  
…  
正在将存档复制到临时目录…  
正在提取转储文件…  
正在验证元数据…  
当前版本：20241224191732  
恢复版本：20240912212253

并且很明显 db:migration 会因帖子 #1 中报告的错误而失败。

我看到 postgres 数据库“discourse”已恢复，其中包含所有必需的表/数据：  
psql (13.18 (Debian 13.18-1.pgdg120+1))  
输入“help”以获取帮助。

```plaintext
discourse=> \dn+
                                  模式列表
        名称 | 所有者 | 访问权限 | 描述
---------------------+-----------+------------------------+------------------------
 backup | discourse | |
 discourse_functions | discourse | |
 public | discourse | discourse=UC/discourse+| 标准公共模式
                     | | =UC/discourse |
(3 行)

discourse=> discourse=> \l
                                  数据库列表
   名称 | 所有者 | 编码 | 排序规则 | ctype | 访问权限
-----------+----------+----------+-------------+-------------+------------------------
 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 行)

```

但 rake 报告它正在使用错误的数据库：

rake db:version

数据库： discourse  
当前版本：20241224191732

如何将 rake 指向 20240912212253？

谢谢

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [2025年一月13日 17:00 UTC](https://meta.discourse.org/t/problem-with-restore-discourse-from-backup-3-4-quite-large-db/346497/15 "2025-01-13T17:00:52Z")

</div>

> [@Dmitry\_Krasnoperov](#):
>
> 在 PostgreSQL（位于 Discourse 容器内）中恢复文件时，似乎没有删除旧数据库，这会导致冲突，从而阻止备份正常部署。

当出现权限问题时，就会发生这种情况。Discourse 在恢复过程中会处理模式，当它没有权限枚举数据库中的表时，事情就会变得糟糕。

虽然我从未遇到过这种情况，但这会不会也是可用磁盘空间的问题？

---

<div class="post-metadata">

### Author: ![thoka](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/thoka/32/115652_2.png) [@thoka](https://meta.discourse.org/u/thoka)
#### Post date: [2025年一月13日 17:10 UTC](https://meta.discourse.org/t/problem-with-restore-discourse-from-backup-3-4-quite-large-db/346497/16 "2025-01-13T17:10:47Z")

</div>

凭直觉：恢复后进行表移动时是否可能发生[超时](https://www.bytebase.com/blog/postgres-timeout/)？

---

<div class="post-metadata">

### Author: ![Dmitry\_Krasnoperov](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dmitry_krasnoperov/32/65079_2.png) [@Dmitry\_Krasnoperov](https://meta.discourse.org/u/Dmitry_Krasnoperov)
#### Post date: [2025年一月14日 06:06 UTC](https://meta.discourse.org/t/problem-with-restore-discourse-from-backup-3-4-quite-large-db/346497/17 "2025-01-14T06:06:37Z")

</div>

感谢提示。

磁盘空间不是问题；我的空间是数据库大小的 6-7 倍。在运行迁移并修复权限之前，我可以尝试手动导入。问题是，究竟必须授予什么权限？

---

<div class="post-metadata">

### Author: ![Dmitry\_Krasnoperov](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dmitry_krasnoperov/32/65079_2.png) [@Dmitry\_Krasnoperov](https://meta.discourse.org/u/Dmitry_Krasnoperov)
#### Post date: [2025年一月14日 11:33 UTC](https://meta.discourse.org/t/problem-with-restore-discourse-from-backup-3-4-quite-large-db/346497/18 "2025-01-14T11:33:08Z")

</div>

我认为您需要按以下方式更新手动脚本：

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;

不需要创建 public schema（并设置所有者），因为较新的 Pg 会从 SQL 备份转储创建 schema。  
但是，表权限必须固定为 discourse 用户，默认情况下它们是 postgres。

现在可以了！感谢大家提供的想法和支持。

---

<div class="post-metadata">

### Author: ![system](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/system/32/443519_2.png) [@system](https://meta.discourse.org/u/system)
#### Post date: [2025年二月13日 11:33 UTC](https://meta.discourse.org/t/problem-with-restore-discourse-from-backup-3-4-quite-large-db/346497/19 "2025-02-13T11:33:20Z")

</div>

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.
