구버전 데이터베이스를 최신 버전으로 가져오기

Q: Discourse 설치에서 가져온 오래된 DB가 v2.0 버전이라면, export - import > 2.9 순서로 진행할 때 실패하는지, 아니면 import 기능에 성공적인 가져오기를 위한 변환 과정이 내장되어 있는가?

A: PostgreSQL 13 업데이트

아, 감사합니다. 그 방법이 작동하는 것 같긴 한데, 이제 앱을 다시 빌드할 때 부트스트랩이 실패합니다.

부트스트랩 경고에서 “discourse database already exists: type error” 오류와 함께 ruby/gems 오류도 발생하는 것 같습니다.

일부 오류 메시지를 확인해 보았습니다.

참고로, 이 2.2b4 빌드(PG10)는 다른 오래된 포럼 플랫폼에서 데이터를 가져오기 위해 원래 사용되었던 초기 가져오기 설정 및 빌드입니다. 제가 아는 한, 이후로 업데이트나 변경 사항이 전혀 없었습니다.

제 생각에는 원래 마이그레이션/가져오기에만 사용되던 몇몇 줄을 어딘가에서 주석 처리하는 것이 해결책일 수 있습니다. 빌드에서 이러한 커스터마이징을 보통 어디에서 찾을 수 있나요?

참고: 이미 app.yml에서 플러그인, Let’s Encrypt 및 2.2b4 버전 관련 줄을 삭제하거나 주석 처리했습니다.

실제로 도움을 받으려면 파일을 포함시켜야 합니다. 다음과 같은 내용을 보게 된다면

  apt get

또는 Gemfile 수정에 관한 내용이 있다면, 그 부분은 제거해야 합니다.

(데이터베이스 업그레이드가 성공적으로 완료되었다고 가정할 때) 제가 할 것이라면 app.yml을 이름 변경한 후 discourse-setup을 실행하는 것입니다(현재 파일의 데이터가 shared/standalone에 있다고 가정). 또한 파일을 samples/standalone.yml과 비교해 볼 수도 있습니다.

좋아요, 조언 감사해요. rm app.yml을 시도해서 결과를 보고 할게요.

'파일’이라고 하셨을 때, terminal의 오류를 말씀하시는 건가요, 아니면 app.yml이나 다른 파일을 말씀하시는 건가요?

추가 정보 - 학습과 문제를 해결하기 위해 드롭레트를 하나 띄워보고 있어요. 이렇게 하면 유지보수 방법을 더 잘 이해할 수 있고, 실수해도 마음 편히 다시 시작할 수 있는 장점이 있거든요. 즉, 이걸 라이브 포럼에서 실행하거나 지우진 않았어요 :slight_smile:

어제 하루를 마무리하고 자리를 떴을 때, 당연히 임포터 설명서를 확인해서 설정이 어떻게 되어 있는지, 잔여물이 있는지 살펴봐야 한다는 생각이 들었어요. 하지만 app.yml에 대한 당신의 제안은 그런 우회적인 문제를 피할 수 있을 것 같아요. :sweat_smile:

좋아요, 전부 시도해 봤습니다 - 새 드롭렛을 생성하고,

  • :white_check_mark: OS/Docker 업데이트
  • :white_check_mark: 컨테이너 중지
  • :white_check_mark: app.yml 삭제
  • :white_check_mark: discourse-setup 실행 = PG10 업그레이드
  • :x: 재구축 실패 bootstrap (어제의 에러 메시지와 동일해 보입니다.)

확인할 수 있는 에러들:

1) ERROR: database “discourse” already exists

2022-05-20 10:35:29.889 UTC [42] LOG: database system is ready to accept connections
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: database “discourse” already exists
2022-05-20 10:35:34.839 UTC [55] postgres@postgres STATEMENT: CREATE DATABASE discourse;
createdb: error: database creation failed: ERROR: database “discourse” already exists

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: duplicate key value violates unique constraint **"index_poll_options_on_poll_id_and_digest"**

2022-05-20 10:29:58.275 UTC [664] discourse@discourse DETAIL: Key (poll_id, digest)=(163, 84b9c1be0d88b6592595e6e16827dbc1) already exists.

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: An error has occurred, this and all later migrations canceled:

ERROR: duplicate key value violates unique constraint "index_poll_options_on_poll_id_and_digest"

DETAIL: Key (poll_id, digest)=(163, 84b9c1be0d88b6592595e6e16827dbc1) already exists.

/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: duplicate key value violates unique constraint "index_poll_options_on_poll_id_and_digest"

DETAIL: Key (poll_id, digest)=(163, 84b9c1be0d88b6592595e6e16827dbc1) already exists.

/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

(See full trace by running task with --trace)

I, [2022-05-20T10:29:58.305849 #1] INFO -- : == 20180820073549 CreatePollsTables: migrating ================================

-- 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: migrated (0.0376s) =======================

End

I, [2022-05-20T10:29:58.308710 #1] INFO – : Terminating async processes

I, [2022-05-20T10:29:58.308759 #1] INFO – : Sending INT to 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 – : Sending TERM to 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: received fast shutdown request

103:signal-handler (1653042598) Received SIGTERM scheduling shutdown…

103:M 20 May 2022 10:29:58.310 # User requested shutdown…

103:M 20 May 2022 10:29:58.310 * Saving the final RDB snapshot before exiting.

2022-05-20 10:29:58.310 UTC [42] LOG: aborting any active transactions

2022-05-20 10:29:58.312 UTC [42] LOG: background worker “logical replication launcher” (PID 51) exited with exit code 1

2022-05-20 10:29:58.312 UTC [46] LOG: shutting down

2022-05-20 10:29:58.392 UTC [42] LOG: database system is shut down

103:M 20 May 2022 10:29:58.601 * DB saved on disk

103:M 20 May 2022 10:29:58.602 # Redis is now ready to exit, bye bye…

FAILED


Pups::ExecError: cd /var/www/discourse && su discourse -c ‘bundle exec rake db:migrate’ failed with return #<Process::Status: pid 650 exit 1>

Location of failure: /usr/local/lib/ruby/gems/2.7.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn’

exec failed with the params {“cd”=>“$home”, “hook”=>“db_migrate”, “cmd”=>[“su discourse -c ‘bundle exec rake db:migrate’”]}

bootstrap failed with exit code 1

**** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.**

./discourse-doctor may help diagnose the problem.

discourse doctor를 이번 포함 여러 번 실행해 봤지만 제가 볼 수 있는 문제는 아무것도 발견되지 않았습니다.

그렇다면 새 설치 파일을 설치하고, 기존 사이트를 백업한 뒤 새 사이트에 복구하세요.

하하, 그게 바로 내가 원했던 답변이었네요.

그렇게 간단하다면 제 모든 문제가 해결되는 거죠.

사실 제 걱정은 PG10에서 반짝이는 새 버전인 2.9(이건 PG13이 맞죠?)로 내보내는 과정이었거든요. 그리고 데이터베이스가 그대로 흡수되는 건 아닌지 궁금했는데, 제 추측으로는 안 되는 것 같더라고요.

그래서 백업 및 복원 시나리오, 즉 이 맥락에서 제가 계속 시도해 온 것처럼 먼저 기존 데이터베이스를 업그레이드하지 않고 관리자 내보내기/가져오기만으로 충분한지 여쭤봅니다.

네, 충분합니다. 하지만 2.9에서 복원하기 전에 현재 DB의 문제를 수정해야 할 수 있습니다.

다음은 작동할 수 있는 해결책입니다. 하지만 귀하의 경우 문제를 일으키는 투표 ID가 84b9c1be0d88b6592595e6e16827dbc1이므로, value로 %84b9c1be0d88b6592595e6e16827dbc1%를 사용해야 합니다.

즉, 인덱스가 손상되었다는 말씀이신가요? (저는 알아채지 못했지만, 마지막 답변이 그런 가능성을 시사하고 있습니다.)

그렇다면 몇 가지 예시를 찾아보실 수 있습니다. 주로 재인덱싱을 시도해 어떤 인덱스가 다시 생성되지 않는지 확인한 후, 문제 있는 기록을 삭제하거나(혹은 재주가 좋다면) 수정하는 방식으로 해결합니다.

도움 주셔서 감사합니다. 처음에는 유망해 보였지만, 해당 해결 단계를 일부 적용한 후 새로운 투표 ID + VALUE에서 다시 멈추게 되었습니다.

이것이 문제이자 해결책일 수도 있지만, 제 생각에는 단순히 하나만이 아니라 모든 투표이 멈춤을 유발하거나 너무 많을 것입니다. 또한 다른 스레드에서 Falco가 한 진술에도 같은 근거를 두고 있습니다:

이것은 손상된 인덱스가 아닙니다.

2.1에서 2.5로 넘어가는 동안 우리는 풀(plugins)을 PluginStore에서 정식 테이블로 이동했습니다. 이동의 이유 중 하나는 데이터 정합성을 확보하기 위함인데, 이는 바로 귀하가 겪고 있는 문제입니다.

poll_options 테이블에 중복된 값이 있습니다. 해당 테이블로 가서 중복된 항목을 삭제해 주시겠습니까?

더 면밀한 조사가 필요합니다.

여러분 안녕하세요,

저도 @agemo 님과 같은 상황입니다. 정확히 동일한 오류가 발생하는데, 저는 데이터베이스를 직접 다뤄보는 데는 익숙합니다.

제가 이해하지 못하는 부분이 있습니다. 제안된 해결책은 중복된 id 값을 가진 폴(pool)을 단순히 삭제하라는 것인데, 제 테이블을 확인해보니 해당 중복 항목들은 모두 서로 다른 post_id를 참조하고 있어 서로 다른 게시글에 속해 있으며, 투표 수와 같은 메타데이터도 서로 다릅니다.

이 오류를 이해할 수 있도록 구버전 구조와 신버전 구조의 차이를 설명해 주실 수 있을까요? 제 생각에 폴을 삭제하는 것은 문제를 해결하지 못합니다. 실제로 사용자의 데이터를 삭제하게 되거든요.

감사합니다!

제 생각엔 깨진 인덱스인 것 같습니다. 해당 테이블을 재인덱싱해 보시겠어요?

아니면 실제로 무언가가 변경되어 더 복잡한 마이그레이션이 필요한 상황일 수도 있고요. 혹은 마이그레이션 자체가 어딘가에서 깨진 것일 수도 있습니다.

안녕하세요 @pfaffman, 다시 뵙게 되어 반갑습니다. 이전에 다른 사이트에서 귀사의 서비스를 사용한 적이 있습니다.

  1. 이 테이블에서 인덱스를 재구성하는 것은 확실히 가능하지만, 고유하지 않은(non-unique) 데이터에는 어떻게 도움이 되나요? 왜 항상 이 작업부터 시작하는지 구체적으로 설명해 주실 수 있을까요? (최근 답변에서 그 점을 알아차렸습니다.)

  2. 마이그레이션은 2.2b4 버전으로 수행되었습니다. 이 버전은 투표(polls) 가져오기가 실제로 작동했던 버전이었습니다.

  3. 제 이해가 맞는지 확인하고 싶은데, 기존 테이블 post_custom_fields에서 value->poll->options->id 값은 실제 투표 ID가 아니라 다이제스트(digest)를 가리키는 것이 맞나요?

  4. 투표 다이제스트(poll digest)란 정확히 무엇인가요?

답변해 주셔서 감사합니다. 하지만 단순히 투표(polls)를 제거하는 것은 중복된 레코드에 대한 해결책이 아닙니다. 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. 투표(polls) 이름을 원래대로 변경합니다:

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를 찾기 위해 데이터베이스 GUI를 사용하여 테이블을 검색합니다(편집이 더 쉽습니다):

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

  1. 이제 어려운 부분입니다. UUID는 투표 답변/옵션의 식별자이므로, poll 행의 UUID를 변경해야 합니다. 예를 들어 731ef6901e968fc3f4e785fcb9e9abe8에서 731ef6901e968fc3f4e785fcb9e9abe9로 변경하는 것입니다. 시스템에서 이와 같은 UUID를 다시 찾을 가능성은 매우 낮습니다. 하지만 이렇게 한 후에는 poll-votes에서 해당하는 UUID를 찾아 새로운 UUID로 변경해야 합니다. 이렇게 하면 투표나 답변을 잃지 않습니다.

  2. 마이그레이션을 다시 실행하고 다음 오류를 확인합니다:

rake db:migrate:up VERSION=20180820080623

  1. 마이그레이션이 완료되고 모든 투표가 새로운 테이블로 마이그레이션될 때까지 이 과정을 반복합니다.

그 UUID가 무엇인지, 무엇을 가리키는지 설명조차 해주지 않은 채 아무도 답변하지 않은 것에 실망합니다. 오픈 소스라는 점과 커밋된 지 몇 년이 지났다는 점은 알고 있습니다. 불평하려는 것이 아니라, 공식 저장소에서 실제로 커밋을 하는 사람들의 어떤 도움이라도 감사할 것입니다.

문제는 해결되었으니 기쁜 날입니다.

감사합니다!

거기서 꽤 멋진 작업이 진행 중이네요. :sunglasses: