2026년 06월 10일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-00361 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-00361 cannot remove last log member for group 는?
ORA-00361 에러는 Oracle 데이터베이스의 리두 로그 그룹(Redo Log Group)에서 마지막 남은 멤버(Member)를 삭제하려고 시도할 때 발생하는 에러입니다. Oracle은 각 리두 로그 그룹에 최소 하나의 멤버를 반드시 유지해야 하기 때문에, 그룹 내 유일하게 남은 멤버를 삭제하는 작업을 허용하지 않습니다. 이 에러는 주로 디스크 공간 확보, 파일 경로 변경, 또는 멀티플렉싱 구성을 잘못 이해한 상태에서 멤버를 삭제하다가 발생합니다.
주요 발생 원인
- 리두 로그 그룹에 멤버가 하나만 존재하는 상태에서 삭제 시도
가장 흔한 원인입니다. 초기 데이터베이스 구성 시 멀티플렉싱을 적용하지 않아 각 그룹에 멤버가 하나씩만 존재하는 경우, 관리자가 특정 멤버를 삭제하려 할 때 이 에러가 발생합니다. Oracle은 데이터 보호를 위해 그룹 내 마지막 멤버는 절대로 삭제할 수 없도록 설계되어 있습니다. 따라서 삭제 전에 반드시 해당 그룹에 멤버가 몇 개 존재하는지 확인하는 습관이 필요합니다.
- 멀티플렉싱 구성 해제 또는 이전 멤버 삭제 후 마지막 멤버 삭제 시도
리두 로그 멀티플렉싱이 구성된 환경에서 일부 멤버를 먼저 삭제하고 나서, 마지막 남은 멤버까지 삭제하려는 실수로 이 에러가 발생합니다. 예를 들어, 그룹 1에 멤버가 2개 있었는데 하나를 먼저 삭제한 후 나머지 하나도 삭제하려 하면 ORA-00361이 발생합니다. 이 경우 작업 전 V$LOGFILE 뷰를 통해 현재 멤버 현황을 반드시 확인해야 합니다.
- 리두 로그 그룹 자체를 삭제하지 않고 멤버만 반복 삭제 시도
리두 로그 그룹 전체를 제거하고 싶은 경우, ALTER DATABASE DROP LOGFILE GROUP 명령을 사용해야 합니다. 그러나 이 명령 대신 ALTER DATABASE DROP LOGFILE MEMBER 명령을 반복 사용하다 마지막 멤버에 도달하면 에러가 발생합니다. 그룹 삭제와 멤버 삭제는 명백히 다른 DDL 명령이므로, 의도에 맞는 명령을 정확히 선택해야 합니다.
해결 방법
1단계: 현재 리두 로그 그룹과 멤버 현황 확인
먼저 현재 리두 로그 그룹과 멤버 상태를 파악합니다.
-- 리두 로그 그룹 현황 확인
SELECT GROUP#, MEMBERS, STATUS, BYTES/1024/1024 AS SIZE_MB
FROM V$LOG
ORDER BY GROUP#;
-- 리두 로그 멤버 현황 확인
SELECT GROUP#, MEMBER, STATUS, TYPE
FROM V$LOGFILE
ORDER BY GROUP#, MEMBER;
2단계: 새 멤버 추가 후 기존 멤버 삭제
삭제하려는 멤버가 해당 그룹의 마지막 멤버라면, 먼저 새 멤버를 추가한 후 기존 멤버를 삭제해야 합니다.
-- 새 멤버를 그룹에 추가 (그룹 1 예시)
ALTER DATABASE ADD LOGFILE MEMBER '/new_path/redo01b.log' TO GROUP 1;
-- 새 멤버가 정상적으로 추가되었는지 확인
SELECT GROUP#, MEMBER, STATUS
FROM V$LOGFILE
WHERE GROUP# = 1;
-- 이제 기존 멤버 삭제 가능
ALTER DATABASE DROP LOGFILE MEMBER '/old_path/redo01a.log';
3단계: 그룹 전체를 삭제하고 싶은 경우
멤버 전체 삭제가 목적이 아니라 그룹 자체를 제거하고 싶다면, DROP LOGFILE GROUP 명령을 사용합니다. 단, 현재 ACTIVE 또는 CURRENT 상태인 그룹은 삭제할 수 없습니다.
-- 그룹 상태 확인 (INACTIVE 상태여야 삭제 가능)
SELECT GROUP#, STATUS FROM V$LOG;
-- INACTIVE 상태인 그룹 삭제
ALTER DATABASE DROP LOGFILE GROUP 4;
-- 만약 ACTIVE 상태라면 로그 스위치 후 체크포인트를 강제 수행
ALTER SYSTEM SWITCH LOGFILE;
ALTER SYSTEM CHECKPOINT;
-- 이후 다시 상태 확인 후 삭제
SELECT GROUP#, STATUS FROM V$LOG;
ALTER DATABASE DROP LOGFILE GROUP 4;
4단계: 특정 그룹의 멤버 수를 늘려 멀티플렉싱 구성
안전한 운영을 위해 모든 그룹에 최소 2개의 멤버를 추가하는 것이 권장됩니다.
-- 모든 그룹에 두 번째 멤버 추가 (멀티플렉싱 구성)
ALTER DATABASE ADD LOGFILE MEMBER '/oradata/fast/redo01b.log' TO GROUP 1;
ALTER DATABASE ADD LOGFILE MEMBER '/oradata/fast/redo02b.log' TO GROUP 2;
ALTER DATABASE ADD LOGFILE MEMBER '/oradata/fast/redo03b.log' TO GROUP 3;
-- 결과 확인
SELECT GROUP#, MEMBER, STATUS, TYPE
FROM V$LOGFILE
ORDER BY GROUP#;
예방 방법
- 리두 로그 멀티플렉싱을 초기 구성 시 반드시 적용하기
데이터베이스 생성 초기부터 각 리두 로그 그룹에 서로 다른 디스크 경로에 최소 2개 이상의 멤버를 구성하는 것이 Best Practice입니다. 멀티플렉싱은 단순히 ORA-00361 에러를 방지하는 것을 넘어서, 리두 로그 파일 손상 시 데이터 손실을 예방하는 핵심 보호 장치입니다. 정기적인 DBA 점검 체크리스트에 V$LOGFILE 조회를 포함시켜 멤버 수가 항상 2개 이상인지 모니터링하는 습관을 들이세요.
“`sql
— 정기 점검 쿼리: 멤버가 1개뿐인 위험 그룹 식별
SELECT GROUP#, COUNT(*) AS MEMBER_COUNT
FROM V$LOGFILE
GROUP BY GROUP#
HAVING COUNT(*) < 2;
“`
- 리두 로그 멤버 삭제 전 반드시 사전 확인 절차 수행하기
리두 로그 멤버를 삭제하기 전에는 반드시 해당 그룹의 현재 멤버 수와 상태를 조회한 후 작업을 진행하는 절차를 내부 운영 표준(SOP)으로 문서화하세요. 또한 삭제 작업은 데이터베이스가 MOUNT 또는 OPEN 상태 모두에서 가능하지만, 해당 그룹이 CURRENT 또는 ACTIVE 상태가 아닌지를 반드시 확인해야 합니다.
“`sql
— 삭제 전 최종 확인 쿼리 (SOP 체크리스트 항목)
SELECT L.GROUP#, L.STATUS AS GROUP_STATUS,
L.MEMBERS, LF.MEMBER AS MEMBER_PATH
FROM V$LOG L
JOIN V$LOGFILE LF ON L.GROUP# = LF.GROUP#
ORDER BY L.GROUP#, LF.MEMBER;
“`
관련 에러
- ORA-00350: 해당 로그 파일 멤버를 아카이브해야 하는 경우 발생하는 에러로, 아카이브 로그 모드에서 로그 멤버 작업 시 함께 나타날 수 있습니다.
- ORA-00362: 멤버가 유효한 온라인 리두 로그 그룹에 속하도록 요구될 때 발생하며, ORA-00361과 유사한 멤버 관리 작업 중 나타납니다.
- ORA-00365: 지정한 로그 파일이 올바른 리두 로그 파일이 아닐 때 발생하며, 멤버 추가 또는 삭제 작업 중 경로 오류 시 함께 발생할 수 있습니다.
- ORA-01624: 리두 로그를 삭제할 수 없을 때 발생하는 에러로, 크래시 복구에 필요한 로그를 삭제하려 할 때 나타납니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.