최근 서버에서 오늘 빌드된 서버로 복원하려고 시도하고 있습니다. 아래 오류로 인해 실패하고 있습니다. 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.
오래된 서버가 아직 실행 중이라 운이 좋았어요. 그래서 런서에서 재빌드(rebuild)를 해서 오래된 서버를 새 설치 환경과 완전히 동일한 버전으로 맞췄어요. 그 다음 커맨드라인을 통해 다시 백업을 만들었죠. 이 백업을 새 설치 환경에 복원했을 때 모든 것이 정상적으로 작동했어요. 이 방법을 시도해 보세요. @pfaffman
/var/discourse/shared 폴더가 비어 있는지 확인하거나, 복원이 필요한 경우를 대비해 새 위치로 이동했습니다.
./launcher bootstrap 명령어를 사용하여 새로운 discourse 인스턴스를 초기화했습니다.
복원을 다시 시도했지만 동일한 오류 메시지로 실패했습니다.
그 후, 정상적으로 작동하는 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 커맨드 라인 프롬프트에 접근하여 위의 명령어를 실행하는 방법에 대해서는 다루지 않겠습니다.
네, 불행히도 그런 엣지 케이스가 있네요. 앞으로 이를 피하거나, 재발을 방지하기 위해 하위 호환 가능한 해결책을 찾아볼 수는 있습니다. 하지만 이번 경우에는 어떻게 할 수 있는 방법이 없다고 봅니다. 이미 되돌릴 수 없는 상황이니까요. 우리가 어떤 조치를 취하든, 사이트 소유자들이 대상 사이트를 최신 버전으로 업그레이드해야 한다는 점은 변하지 않을 것입니다.
맞습니다. 이것은 이러한 기술 방식에서 일반적으로 발생하는 문제이며, Ruby on Rails뿐 아니라 PHP Laravel과 같은 다른 AR 구현체에서도 공통적으로 나타나는 문제입니다. 그리고 말씀하신 대로 이런 경우는 자주 발생하지 않으며, 원인을 파악하면 복구 과정에서 우회하는 것이 쉽습니다.