복원 완료 전 중단으로 인한 마이그레이션 문제

PG::DependentObjectsStillExist: ERROR:  다른 개체가 이 함수에 의존하고 있으므로 delete_user_password() 함수를 삭제할 수 없습니다

여기서 비롯되는 것 같습니다:

이것은 마이그레이션 후(post migration)의 문제입니다:


== 20240910090759 MakePasswordColumnsFromUsersReadOnly: migrating =============
-- execute("DROP TRIGGER IF EXISTS users_password_sync_on_delete_password ON users;\n")
   -> 0.0007s
-- execute("DROP FUNCTION IF EXISTS delete_user_password;\n")
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled: (StandardError)

PG::DependentObjectsStillExist: ERROR:  cannot drop function delete_user_password() because other objects depend on it
DETAIL:  trigger users_password_sync_on_delete_password on table backup.users depends on function delete_user_password()
HINT:  Use DROP ... CASCADE to drop the dependent objects too.
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-mini-profiler-4.0.0/lib/patches/db/pg/alias_method.rb:109:in `exec'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-mini-profiler-4.0.0/lib/patches/db/pg/alias_method.rb:109:in `async_exec'
(eval at /var/www/discourse/lib/method_profiler.rb:38):24: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'

그래서 저는 restore --pause를 실행한 후 다른 터미널에서 다음과 같이 마이그레이션을 시도했습니다:

rake db:ensure_post_migrations db:migrate

그리고 나서 다음과 같은 작업을 수행했습니다:

ActiveRecord::Base.connection.execute(<<~SQL)
  DROP TRIGGER IF EXISTS users_after_delete_user_passwords ON users;
SQL

ActiveRecord::Base.connection.execute(<<~SQL)
  DROP TRIGGER IF EXISTS users_password_sync_on_delete_password ON users;
SQL

ActiveRecord::Base.connection.execute(<<~SQL)
  DROP TRIGGER IF EXISTS users_password_sync_on_delete_password ON backup.users;
SQL

그리고 아마도 다른 작업들도 수행했고, 마침내 마이그레이션을 완료할 수 있었습니다.

새로운 데이터베이스로 내일 다시 시도할 수 있기를 바랍니다. . .

backup 스키마(백업/복원 시 사용됨)에 이 함수에 종속된 테이블이 있습니다.

여기서 backup 스키마가 오래된 것(stale)이라면, DROP SCHEMA backup만 실행하여 제거하면 됩니다.

정말 감사합니다! 말씀하신 대로 맞는 것 같은데, 그렇게 하면 :slight_smile: 같은 메시지가 뜨네요.

table backup.group_archived_messages depends on schema backup
table backup.incoming_emails depends on schema backup
table backup.user_options depends on schema backup
table backup.email_change_requests depends on schema backup
table backup.given_daily_likes depends on schema backup
table backup.onceoff_logs depends on schema backup
table backup.tags depends on schema backup
table backup.topic_tags depends on schema backup
table backup.tag_users depends on schema backup
table backup.category_tags depends on schema backup
table backup.scheduler_stats depends on schema backup
table backup.tag_groups depends on schema backup

시작할 때 데이터베이스가 완전히 비어 있는 새 데이터베이스였는데, 왜 오래된 백업 데이터베이스가 있는지 모르겠어요.

수정: 알려주신 대로 cascade를 사용했습니다:

DROP SCHEMA backup CASCADE;

이걸로 해결된 것 같아요. 25분 후에 결과를 알게 될 텐데, 그때쯤이면 이미 컴퓨터를 보고 있지 않을 거예요.

내일 다시 보고드릴게요.

다시 한번 감사합니다.

정말 그 이유였습니다. 어떤 이유에서인지(예: 복원이 25분이나 걸리기 때문에) 복원 작업을 Ctrl+C로 중단했던 것 같습니다. 그 결과 오래된 스키마가 남아 있었네요. 지난 10년 동안 이 사실을 깨닫지 못했다는 게 믿기지 않지만, 어쨌든 그랬습니다!

매우 감사합니다.