Импорт старой базы данных в последнюю версию

В: Если у вас есть старая база данных от установки Discourse версии 2.0, выполненная через экспорт → импорт → 2.9, приведет ли это к ошибке или в процессе импорта предусмотрена процедура конвертации для успешного импорта?

A: Обновление PostgreSQL 13

Ах, спасибо, кажется, это работает, но теперь не удаётся выполнить загрузку при пересборке приложения.

Кажется, там также есть ошибка «discourse database already exists: type error», а также ошибка ruby/gems в предупреждении о загрузке.

Я изучил некоторые ошибки.

Для контекста: эта сборка 2.2b4 (PG10) — это оригинальная конфигурация импорта и сборки, использовавшаяся для переноса данных со старой платформы форумов; насколько мне известно, с тех пор в неё не вносилось никаких обновлений или изменений.

Мое предположение состоит в том, что решение может заключаться в закомментировании некоторых строк, которые используются только для первоначальной миграции/импорта. Где обычно можно найти такие настройки для сборки?

Примечание: Я уже удалил или закомментировал плагины, Let’s Encrypt и строки с версией 2.2b4 в файле app.yml.

Для реальной помощи нужно приложить ваш файл. Если вы видите что-то вроде

  apt get

или что-то связанное с изменением Gemfile, это следует удалить.

Что я, скорее всего, сделал бы (поскольку обновление базы данных прошло успешно) — переименовал бы ваш файл app.yml и запустил discourse-setup (при условии, что данные в вашем текущем файле находятся в shared/standalone). Если хотите, вы можете просто сравнить свой файл с samples/standalone.yml.

Круто, спасибо за подсказки. Я попробую rm app.yml и посмотрю, что произойдёт.

Когда вы говорите «файл», вы имеете в виду ошибки в terminal, в app.yml или в каком-то другом файле?

Дополнительная информация: я запускаю дроплет для обучения и разбирательства, чтобы лучше понять, как поддерживать систему, с бонусом в виде спокойствия при удалении. То есть я не запускал это на живом форуме и не удалял его там :wink:

Когда вчера я отошёл на день, мне пришло в голову, что мне, очевидно, стоит изучить инструкции по импортеру, понять, как он настроен, и проверить, нет ли остатков. Но ваше предложение насчёт app.yml, вероятно, позволяет обойти такие неожиданные проблемы. :sweat_smile:

Хорошо, попробовал всё это — развернул новый дроплет,

  • :white_check_mark: обновил ОС/Docker
  • :white_check_mark: остановил контейнер
  • :white_check_mark: удалил app.yml
  • :white_check_mark: discourse-setup = обновил PG10
  • :cross_mark: сборка не удалась (ошибки выглядят идентично вчерашним сообщениям).

Ошибки, которые я вижу:

1) ОШИБКА: база данных «discourse» уже существует

2022-05-20 10:35:29.889 UTC [42] LOG: система баз данных готова принимать подключения
I, [2022-05-20T10:35:34.789986 #1] INFO – :
I, [2022-05-20T10:35:34.790259 #1] INFO – : > su postgres -c ‘createdb discourse’ || true
2022-05-20 10:35:34.839 UTC [55] postgres@postgres ERROR: база данных «discourse» уже существует
2022-05-20 10:35:34.839 UTC [55] postgres@postgres STATEMENT: CREATE DATABASE discourse;
createdb: ошибка: создание базы данных не удалось: ОШИБКА: база данных «discourse» уже существует

2) «index_poll_options_on_poll_id_and_digest»

I, [2022-05-20T10:29:54.464874 #1] INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate'

2022-05-20 10:29:58.275 UTC [664] discourse@discourse ERROR: дублирующееся значение ключа нарушает уникальное ограничение **"index_poll_options_on_poll_id_and_digest"**

2022-05-20 10:29:58.275 UTC [664] discourse@discourse DETAIL: Ключ (poll_id, digest)=(163, 84b9c1be0d88b6592595e6e16827dbc1) уже существует.

2022-05-20 10:29:58.275 UTC [664] discourse@discourse STATEMENT: INSERT INTO poll_options

(poll_id, digest, html, anonymous_votes, created_at, updated_at)

VALUES

(163, 'e8b71c653ce9b67fbfdeb23956415a45', '&lt;2%', 0, '2019-03-16 12:37:50 UTC', '2019-03-16 12:37:50 UTC'),(163, '19aab1c9ed0e7bf7aff0dc154f3f349a', '3%', 0, '2019-03-16 12:37:50 UTC', '2019-03-16 12:37:50 UTC'),(163, 'ba429f197b4f9f3ce89f4e1fb2e8b009', '4%', 1, '2019-03-16 12:37:50 UTC', '2019-03-16 12:37:50 UTC'),(163, '30eb71c6082b75ca751c3d4e94aa386c', '5%', 0, '2019-03-16 12:37:50 UTC', '2019-03-16 12:37:50 UTC'),(163, '7575912ab29a386e8f6797e280aca664', '6%', 0, '2019-03-16 12:37:50 UTC', '2019-03-16 12:37:50 UTC'),(163, '17950b1d5d660a2e8a078640be0def0a', '7%', 0, '2019-03-16 12:37:50 UTC', '2019-03-16 12:37:50 UTC'),(163, '1c4e675eb7d2d561f16d1afce8330816', '8%', 0, '2019-03-16 12:37:50 UTC', '2019-03-16 12:37:50 UTC'),(163, 'a891f2abb4531189affefe9896df814e', '9%', 0, '2019-03-16 12:37:50 UTC', '2019-03-16 12:37:50 UTC'),(163, 'd7d8f9a60fc4dc25f2e6a986b12e5176', '10%', 0, '2019-03-16 12:37:50 UTC', '2019-03-16 12:37:50 UTC'),(163, '3d5e680f80b95ddbf99490991327349a', '11%', 0, '2019-03-16 12:37:50 UTC', '2019-03-16 12:37:50 UTC'),(163, '84b9c1be0d88b6592595e6e16827dbc1', '12%', 0, '2019-03-16 12:37:50 UTC', '2019-03-16 12:37:50 UTC'),(163, '84b9c1be0d88b6592595e6e16827dbc1', '<blockquote>

<p>12%</p>

</blockquote>', 0, '2019-03-16 12:37:50 UTC', '2019-03-16 12:37:50 UTC')

RETURNING digest, id

rake aborted!

StandardError: Произошла ошибка, эта и все последующие миграции отменены:

ERROR: дублирующееся значение ключа нарушает уникальное ограничение "index_poll_options_on_poll_id_and_digest"

DETAIL: Ключ (poll_id, digest)=(163, 84b9c1be0d88b6592595e6e16827dbc1) уже существует.

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:110:in `exec'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:110:in `async_exec'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mini_sql-1.4.0/lib/mini_sql/postgres/connection.rb:209:in `run'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mini_sql-1.4.0/lib/mini_sql/active_record_postgres/connection.rb:38:in `block in run'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mini_sql-1.4.0/lib/mini_sql/active_record_postgres/connection.rb:34:in `block in with_lock'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mini_sql-1.4.0/lib/mini_sql/active_record_postgres/connection.rb:34:in `with_lock'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mini_sql-1.4.0/lib/mini_sql/active_record_postgres/connection.rb:38:in `run'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mini_sql-1.4.0/lib/mini_sql/postgres/connection.rb:64:in `query_single'

/var/www/discourse/plugins/poll/db/migrate/20180820080623_migrate_polls_data.rb:131:in `block (2 levels) in up'

/var/www/discourse/plugins/poll/db/migrate/20180820080623_migrate_polls_data.rb:87:in `each'

/var/www/discourse/plugins/poll/db/migrate/20180820080623_migrate_polls_data.rb:87:in `block in up'

/var/www/discourse/plugins/poll/db/migrate/20180820080623_migrate_polls_data.rb:64:in `each'

/var/www/discourse/plugins/poll/db/migrate/20180820080623_migrate_polls_data.rb:64:in `up'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:873:in `public_send'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:873:in `exec_migration'

/var/www/discourse/lib/freedom_patches/schema_migration_details.rb:9:in `block in exec_migration'

/var/www/discourse/lib/freedom_patches/schema_migration_details.rb:8:in `exec_migration'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:854:in `block (2 levels) in migrate'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:853:in `block in migrate'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:215:in `with_connection'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:852:in `migrate'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1046:in `migrate'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1360:in `block in execute_migration_in_transaction'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/connection_adapters/abstract/transaction.rb:319:in `block in within_new_transaction'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/connection_adapters/abstract/transaction.rb:317:in `within_new_transaction'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/connection_adapters/abstract/database_statements.rb:316:in `transaction'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/transactions.rb:209:in `transaction'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1411:in `ddl_transaction'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1359:in `execute_migration_in_transaction'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1333:in `each'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1333:in `migrate_without_lock'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1282:in `block in migrate'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1432:in `block in with_advisory_lock'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:215:in `with_connection'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1447:in `with_advisory_lock_connection'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1428:in `with_advisory_lock'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1282:in `migrate'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1117:in `up'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1092:in `migrate'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/tasks/database_tasks.rb:262:in `migrate'

/var/www/discourse/lib/tasks/db.rake:227:in `block (2 levels) in <main>'

/var/www/discourse/lib/distributed_mutex.rb:33:in `block in synchronize'

/var/www/discourse/lib/distributed_mutex.rb:29:in `synchronize'

/var/www/discourse/lib/distributed_mutex.rb:29:in `synchronize'

/var/www/discourse/lib/distributed_mutex.rb:14:in `synchronize'

/var/www/discourse/lib/tasks/db.rake:210:in `block in <main>'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/exe/rake:27:in `<top (required)>'

/usr/local/bin/bundle:25:in `load'

/usr/local/bin/bundle:25:in `<main>'

Caused by:

PG::UniqueViolation: ERROR: дублирующееся значение ключа нарушает уникальное ограничение "index_poll_options_on_poll_id_and_digest"

DETAIL: Ключ (poll_id, digest)=(163, 84b9c1be0d88b6592595e6e16827dbc1) уже существует.

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:110:in `exec'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:110:in `async_exec'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mini_sql-1.4.0/lib/mini_sql/postgres/connection.rb:209:in `run'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mini_sql-1.4.0/lib/mini_sql/active_record_postgres/connection.rb:38:in `block in run'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mini_sql-1.4.0/lib/mini_sql/active_record_postgres/connection.rb:34:in `block in with_lock'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mini_sql-1.4.0/lib/mini_sql/active_record_postgres/connection.rb:34:in `with_lock'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mini_sql-1.4.0/lib/mini_sql/active_record_postgres/connection.rb:38:in `run'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mini_sql-1.4.0/lib/mini_sql/postgres/connection.rb:64:in `query_single'

/var/www/discourse/plugins/poll/db/migrate/20180820080623_migrate_polls_data.rb:131:in `block (2 levels) in up'

/var/www/discourse/plugins/poll/db/migrate/20180820080623_migrate_polls_data.rb:87:in `each'

/var/www/discourse/plugins/poll/db/migrate/20180820080623_migrate_polls_data.rb:87:in `block in up'

/var/www/discourse/plugins/poll/db/migrate/20180820080623_migrate_polls_data.rb:64:in `each'

/var/www/discourse/plugins/poll/db/migrate/20180820080623_migrate_polls_data.rb:64:in `up'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:873:in `public_send'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:873:in `exec_migration'

/var/www/discourse/lib/freedom_patches/schema_migration_details.rb:9:in `block in exec_migration'

/var/www/discourse/lib/freedom_patches/schema_migration_details.rb:8:in `exec_migration'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:854:in `block (2 levels) in migrate'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:853:in `block in migrate'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:215:in `with_connection'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:852:in `migrate'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1046:in `migrate'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1360:in `block in execute_migration_in_transaction'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/connection_adapters/abstract/transaction.rb:319:in `block in within_new_transaction'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/connection_adapters/abstract/transaction.rb:317:in `within_new_transaction'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/connection_adapters/abstract/database_statements.rb:316:in `transaction'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/transactions.rb:209:in `transaction'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1411:in `ddl_transaction'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1359:in `execute_migration_in_transaction'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1333:in `each'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1333:in `migrate_without_lock'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1282:in `block in migrate'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1432:in `block in with_advisory_lock'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:215:in `with_connection'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1447:in `with_advisory_lock_connection'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1428:in `with_advisory_lock'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1282:in `migrate'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1117:in `up'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/migration.rb:1092:in `migrate'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/tasks/database_tasks.rb:262:in `migrate'

/var/www/discourse/lib/tasks/db.rake:227:in `block (2 levels) in <main>'

/var/www/discourse/lib/distributed_mutex.rb:33:in `block in synchronize'

/var/www/discourse/lib/distributed_mutex.rb:29:in `synchronize'

/var/www/discourse/lib/distributed_mutex.rb:29:in `synchronize'

/var/www/discourse/lib/distributed_mutex.rb:14:in `synchronize'

/var/www/discourse/lib/tasks/db.rake:210:in `block in <main>'

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/exe/rake:27:in `<top (required)>'

/usr/local/bin/bundle:25:in `load'

/usr/local/bin/bundle:25:in `<main>'

Tasks: TOP => db:migrate

(Полный трассировочный вывод можно получить, запустив задачу с флагом --trace)

I, [2022-05-20T10:29:58.305849 #1] INFO -- : == 20180820073549 CreatePollsTables: миграция ================================

-- create_table(:polls, {})

-> 0.0172s

-- add_index(:polls, [:post_id, :name], {:unique=>true})

-> 0.0016s

-- create_table(:poll_options, {})

-> 0.0064s

-- add_index(:poll_options, [:poll_id, :digest], {:unique=>true})

-> 0.0018s

-- create_table(:poll_votes, {:id=>false})

-> 0.0067s

-- add_index(:poll_votes, [:poll_id, :poll_option_id, :user_id], {:unique=>true})

-> 0.0013s

== 20180820073549 CreatePollsTables: мигрировано (0.0376s) =======================

Конец

I, [2022-05-20T10:29:58.308710 #1] INFO – : Завершение асинхронных процессов

I, [2022-05-20T10:29:58.308759 #1] INFO – : Отправка INT для HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/13/bin/postmaster -D /etc/postgresql/13/main pid: 42

I, [2022-05-20T10:29:58.308837 #1] INFO – : Отправка TERM для exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 103

2022-05-20 10:29:58.308 UTC [42] LOG: получен запрос на быстрое завершение работы

103:signal-handler (1653042598) Получен SIGTERM, планирование завершения работы…

103:M 20 May 2022 10:29:58.310 # Пользователь запросил завершение работы…

103:M 20 May 2022 10:29:58.310 * Сохранение финального снимка RDB перед выходом.

2022-05-20 10:29:58.310 UTC [42] LOG: прерывание любых активных транзакций

2022-05-20 10:29:58.312 UTC [42] LOG: фоновый рабочий процесс “logical replication launcher” (PID 51) завершился с кодом выхода 1

2022-05-20 10:29:58.312 UTC [46] LOG: завершение работы

2022-05-20 10:29:58.392 UTC [42] LOG: система баз данных остановлена

103:M 20 May 2022 10:29:58.601 * БД сохранена на диск

103:M 20 May 2022 10:29:58.602 # Redis теперь готов к выходу, пока…

FAILED


Pups::ExecError: cd /var/www/discourse && su discourse -c ‘bundle exec rake db:migrate’ завершилась с ошибкой, код возврата #<Process::Status: pid 650 exit 1>

Место возникновения ошибки: /usr/local/lib/ruby/gems/2.7.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn’

exec завершилась с ошибкой с параметрами {“cd”=>“$home”, “hook”=>“db_migrate”, “cmd”=>[“su discourse -c ‘bundle exec rake db:migrate’”]}

загрузка не удалась с кодом выхода 1

**** ЗАГРУЗКА НЕ УДАЛАСЬ ** пожалуйста, прокрутите вверх и поищите более ранние сообщения об ошибках, их может быть несколько.**

./discourse-doctor может помочь диагностировать проблему.

Я многократно запускал discourse doctor, в том числе и сейчас, но не нашёл ничего, что могло бы указать на проблему.

В таком случае просто выполните новую установку, сделайте резервную копию старого сайта и восстановите его на новом сайте.

Ха-ха, это было как раз то, к чему я стремился в своём первом посте.

Если всё так просто, то все мои проблемы решены.

Видите ли, меня беспокоило, что я экспортирую из PG10 в блестящий новый 2.9, который, если я не ошибаюсь, является PG13, и что это может негативно сказаться на базе данных. Я предполагаю, что нет.

Таким образом, в сценарии резервного копирования и восстановления, в данном контексте: достаточно ли административного экспорта/импорта без предварительного обновления старой базы данных, как я пытался делать?

Да, достаточно, но, возможно, вам потребуется исправить проблему в вашей текущей БД перед восстановлением её на версии 2.9.

Вот решение, которое может сработать, но вам нужно будет использовать %84b9c1be0d88b6592595e6e16827dbc1% в качестве value, поскольку именно этот ID опроса вызывает проблему в вашем случае.

Получается, у вас повреждённый индекс? (Я не заметил, но именно это подразумевается в последнем ответе).

Если речь об этом, то можно поискать примеры. В основном вы пытаетесь пересоздать индексы и смотрите, какие из них не восстанавливаются, а затем удаляете (или исправляете, если вы умны) ошибочные записи.

Спасибо, это выглядело многообещающе, но после применения некоторых из этих исправляющих шагов процесс остановился на новом ID опроса + значении.

Хотя это может быть и проблемой, и решением — я думаю, что остановку вызовут все опросы или слишком много из них, а не просто один. Я также основываюсь на заявлении Falco в другой теме:

Это не повреждённый индекс.

Между версиями 2.1 и 2.5 мы перенесли опросы из PluginStore в обычные таблицы. Одна из причин переноса — обеспечение согласованности данных, что как раз и является вашей проблемой.

У вас есть дублирующееся значение в таблице poll_options. Можете ли вы перейти туда и удалить дублирующиеся записи?

Требуется более тщательное расследование.

Всем привет,

У меня та же проблема, что и у @agemo — я получаю точно такую же ошибку, хотя умею работать с базой данных напрямую.

Вот что мне непонятно. Предлагаемое решение — просто удалить записи опросов с дублирующимися значениями в столбце id, но при проверке моей таблицы оказалось, что все эти дублирующиеся записи ссылаются на разные post_id, то есть относятся к разным сообщениям, и также имеют разную метаинформацию, например количество голосов и т. д.

Может кто-нибудь объяснить разницу между старой и новой структурой, чтобы я понял эту ошибку? Для меня удаление опросов не решает проблему, так как это фактически означает удаление данных пользователей.

Спасибо!

Похоже, что индекс повреждён. Можете ли вы перестроить индекс для этой таблицы?

Или, возможно, что-то изменилось, и требуется более сложная миграция. Либо миграция каким-то образом нарушена.

Привет, @pfaffman, рад снова вас видеть. Я уже пользовался вашим сервисом для другого сайта.

  1. Я, безусловно, могу перестроить индекс в этой таблице, но как это поможет с не уникальными данными? Не могли бы вы подробнее объяснить, почему вы всегда начинаете с этого? (Я только что заметил это в ваших ответах)

  2. Миграция была выполнена в версии 2.2b4 — это та версия, где импорт опросов действительно работал.

  3. Правильно ли я понимаю, что в старой таблице post_custom_fields значение poll->options->id на самом деле относится к дайджесту, а не к реальному ID опроса?

  4. Что вообще такое дайджест опроса?

Спасибо за ваш ответ, но простое удаление опросов не решает проблему дублирующихся записей. Я предполагаю, что где-то на раннем этапе импорт из phpBB3 был выполнен некорректно, что привело к созданию этих записей. Они валидны, но имеют дублирующиеся UUID, поскольку исходный импорт не проверял их наличие.

В любом случае, решение для тех, кто столкнётся с этой проблемой, заключается в следующем:

  1. Измените проблемные записи в таблице post_custom_fields, чтобы временно убрать их с пути. Лучше сделать это таким образом, чем ждать несколько минут перестройки, только чтобы увидеть новую ошибку.

update post_custom_fields set name = 'polls' where name = 'polls_bak';
update post_custom_fields set name = 'polls-votes' where name = 'polls-votes_bak';

  1. Запустите приложение перестройки, обновление или любое другое действие, которое пытается выполнить пользователь.

  2. Подключитесь к работающему контейнеру после завершения сборки и запуска.

  3. Верните названия опросов к исходным:

update post_custom_fields set name = 'polls_bak' where name = 'polls';
update post_custom_fields set name = 'polls-votes_bak' where name = 'polls-votes';

  1. Запустите миграцию, вызывающую проблему, вручную внутри контейнера приложения. Обратите внимание, что VERSION — это номер в имени файла миграции.

Сначала отмените миграцию; это ничего не сделает, так как метод down не влияет на базу данных:

rake db:migrate:down VERSION=20180820080623

Запустите миграцию и найдите первую ошибку:

rake db:migrate:up VERSION=20180820080623

  1. Найдите запись в таблице с помощью любого графического интерфейса базы данных для удобства редактирования по UUID, вызывающему проблему:

select * from post_custom_fields where value like '%your_UUID%';

  1. Теперь самая сложная часть. UUID является идентификатором ответа/варианта опроса, поэтому вам нужно изменить этот UUID в строке poll, например, с 731ef6901e968fc3f4e785fcb9e9abe8 на 731ef6901e968fc3f4e785fcb9e9abe9. Крайне маловероятно, что вы найдёте такой же UUID в вашей системе. Однако после этого вам также нужно найти соответствующую запись в poll-votes и изменить её на новый UUID. Таким образом, вы не потеряете ни один голос или ответ.

  2. Снова запустите миграцию и найдите следующую ошибку:

rake db:migrate:up VERSION=20180820080623

  1. Повторяйте этот процесс до завершения миграции, когда все опросы будут перенесены в ваши новые таблицы.

Меня разочаровывает, что никто не потрудился даже ответить и объяснить, что такое UUID и на что он ссылается. Я знаю, что проект с открытым исходным кодом и что прошло много лет с момента последнего коммита, я не жалуюсь, но какая-либо помощь от людей, действительно делающих коммиты в официальный репозиторий, была бы очень кстати.

Проблема решена, так что всё отлично.

Спасибо!

Крутая работа там идёт. :sunglasses: