chat_mention 함수가 없어 복원 실패

최근 서버에서 오늘 빌드된 서버로 복원하려고 시도하고 있습니다. 아래 오류로 인해 실패하고 있습니다. Discourse 코드나 플러그인 코드 어디에서도 해당 내용을 찾을 수 없습니다.

다음으로 무엇을 해야 할지 모르겠습니다.

                                                                                                                           [20/9694]
ERROR:  function discourse_functions.raise_chat_mention_notifications_old_notification_id_readonly() does not exist
EXCEPTION: psql failed: ERROR:  function discourse_functions.raise_chat_mention_notifications_old_notification_id_readonly() does not exist
/var/www/discourse/lib/backup_restore/database_restorer.rb:92:in `restore_dump'                                
/var/www/discourse/lib/backup_restore/database_restorer.rb:26:in `restore'            
/var/www/discourse/lib/backup_restore/restorer.rb:51:in `run'
script/discourse:157:in `restore'   
/var/www/discourse/vendor/bundle/ruby/3.
4개의 좋아요

이제 이 새로운 표준 설치 환경뿐 아니라 비즈니스 호스팅 사이트에서도 이 오류를 확인했습니다.

2개의 좋아요

내부적으로 '배트 시그널’을 발령했고, 앞으로 며칠 동안 이 문제를 살펴볼 예정입니다.

4개의 좋아요

새 설치 환경에서 복원을 시도할 때 동일한 오류가 발생했습니다. Discourse를 다른 서버로 이전하려고 시도했을 때였죠. 아직 해결책이 찾지지 않았습니다.

1개의 좋아요

오, 실제로 하나의 해결책을 찾았어요.

오래된 서버가 아직 실행 중이라 운이 좋았어요. 그래서 런서에서 재빌드(rebuild)를 해서 오래된 서버를 새 설치 환경과 완전히 동일한 버전으로 맞췄어요. 그 다음 커맨드라인을 통해 다시 백업을 만들었죠. 이 백업을 새 설치 환경에 복원했을 때 모든 것이 정상적으로 작동했어요. 이 방법을 시도해 보세요. @pfaffman

2개의 좋아요

그렇게 하면 한 곳에서 문제를 해결할 수 있겠네요. 감사합니다!

도와져서 기뻐요!

1개의 좋아요

아, 나도 같은 문제를 겪어봤어요. 프로덕션 시스템에서 샌드박스/개발 환경으로 복원하는 중이었거든요. 같은 플러그인들이 모두 설치되어 있는지 두 번이나 확인했어요.
이걸 사용하는 다른 플러그인은 뭐예요? 지금 바로 소스를 확인해볼게요…

좋아요, 제가 한 작업을 정리해 보겠습니다:

  1. /var/discourse/shared 폴더가 비어 있는지 확인하거나, 복원이 필요한 경우를 대비해 새 위치로 이동했습니다.
  2. ./launcher bootstrap 명령어를 사용하여 새로운 discourse 인스턴스를 초기화했습니다.
  3. 복원을 다시 시도했지만 동일한 오류 메시지로 실패했습니다.
  4. 그 후, 정상적으로 작동하는 discourse 인스턴스를 덤프(dump)했을 때 해당 함수를 생성하는 실제 명령어를 발견했습니다. 내용은 다음과 같습니다:
CREATE FUNCTION discourse_functions.raise_chat_mention_notifications_old_notification_id_readonly() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
  BEGIN
    RAISE EXCEPTION 'Discourse: old_notification_id in chat_mention_notifications is readonly';
  END
$$;


ALTER FUNCTION discourse_functions.raise_chat_mention_notifications_old_notification_id_readonly() OWNER TO discourse;

이후 복원을 다시 시도했고, 모든 것이 정상적으로 완료되었습니다!

실패했을 때의 로그를 가지고 있었기 때문에 나중에 다시 돌아가서 확인하면 될 줄 알았는데, Backup/Restore 기능을 사용할 때마다 로그가 초기화되는 것 같습니다.

개선 제안: 백업/복원 작업의 이력을 볼 수 있으면 좋겠습니다. 어쩌면 이미 그런 기능이 있지만 제가 어디에 있는지 모르는 것일 수도 있습니다.

면책 조항: 저는 Discourse 지원 인력이 아니므로, psql 커맨드 라인 프롬프트에 접근하여 위의 명령어를 실행하는 방법에 대해서는 다루지 않겠습니다. :slight_smile:

문제는 더 오래된 날짜 스탬프가 있는 마이그레이션이 나중에 tests-passed에 커밋되었다는 것입니다(@nbianca 참고). 그리고 이는 백업의 버전 메타데이터에서는 감지되지 않습니다. 이 내용은 여기에서 간략히 언급한 바 있습니다.

이것이 해결책입니다. 따라서 인스턴스 서버에서 커밋 해시를 가져와 해당 커밋으로 새 인스턴스를 빌드하거나, 기존 인스턴스를 최신 버전으로 업데이트하여 해당 마이그레이션을 실행한 뒤 새로운 백업을 받아야 합니다.

2개의 좋아요

현재(?) 영구적인 해결책이 백업을 만든 동일한 커밋(또는 실제로는 마이그레이션)으로만 복원하는 것뿐이라는 말씀이신가요?

아니면 두 버전 모두 오류가 있는 커밋 이후라면 괜찮은 건가요?

네, 괜찮습니다. 하지만 때로는 소스 인스턴스를 업데이트할 수 없는 경우가 있습니다. 그런 경우에는 대상 인스턴스를 소스와 동일한 커밋으로 설정해야 합니다. 따라서 이는 복원 중에 항상 암묵적 순방향 마이그레이션을 수행할 수 있는 일반적인 상황의 예외입니다.

1개의 좋아요

오늘 이 부분을 테스트해 볼 예정입니다. 다만, 현재 제 추측으로는 대상 사이트가 완전히 최신 상태로 동기화되는 순간 복원이 정상적으로 작동할 것입니다.

문제는 복원 과정 초반에 이루어지는 버전 체크에서 소스가 실제로 대상보다 더 새로운 DB 스키마를 가지고 있다는 점을 감지하지 못하는 것 같습니다.

네, 맞습니다. 그렇게 생각합니다.

맞습니다. 이는 마이그레이션에 커밋된 시점의 타임스탬프가 아니라 생성된 시점의 타임스탬프가 기록되어 있기 때문입니다. 대부분의 경우 이는 문제가 되지 않지만, 이 경우 두 시점 사이에 7주라는 차이가 있었습니다.

1개의 좋아요

네, 불행히도 그런 엣지 케이스가 있네요. 앞으로 이를 피하거나, 재발을 방지하기 위해 하위 호환 가능한 해결책을 찾아볼 수는 있습니다. 하지만 이번 경우에는 어떻게 할 수 있는 방법이 없다고 봅니다. 이미 되돌릴 수 없는 상황이니까요. 우리가 어떤 조치를 취하든, 사이트 소유자들이 대상 사이트를 최신 버전으로 업그레이드해야 한다는 점은 변하지 않을 것입니다.

1개의 좋아요

맞습니다. 이것은 이러한 기술 방식에서 일반적으로 발생하는 문제이며, Ruby on Rails뿐 아니라 PHP Laravel과 같은 다른 AR 구현체에서도 공통적으로 나타나는 문제입니다. 그리고 말씀하신 대로 이런 경우는 자주 발생하지 않으며, 원인을 파악하면 복구 과정에서 우회하는 것이 쉽습니다.

2개의 좋아요

그리고 때로는 업데이트하고 싶지 않은 경우도 있죠.

그러니까 제가 작업 중인 두 소스 사이트를 업그레이드하면 문제없이 해결될 것 같습니다.

다시 한번 감사합니다, Richard!

1개의 좋아요

그러면 제 시나리오에서, 복원 환경은 백업된 보험보다 아마도 몇 버전 정도 최신 상태였습니다. 그렇다면 이 경우에도 작동해야 하지 않나요?

백업을 만든 것은 얼마나 오래된가요?

제가 바로 확인하려고 했던 부분이었습니다! 잠시만요. 이전 백업에 대한 로그를 남겨두고 있는지, 아니면 남겨두지 않는 건가요?

이것은 복원 대상인 샌드박스 환경이므로, 다시 시작했습니다. 프로덕션에서 샌드박스로의 복원입니다:

복원 로그에서 확인한 수치입니다:

[2024-10-21 19:49:59]   Current version: 20241018031851
[2024-10-21 19:49:59]   Restored version: 20241011054348