2026년 07월 03일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-01089 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-01089 immediate shutdown in progress – no operations are permitted 는?
ORA-01089 에러는 Oracle 데이터베이스가 SHUTDOWN IMMEDIATE 또는 SHUTDOWN ABORT 명령을 통해 즉시 종료 프로세스가 진행 중인 상태에서 새로운 작업이나 연결을 시도할 때 발생하는 에러입니다. 데이터베이스가 종료 중인 상태이므로 시스템은 더 이상 어떠한 DML, DDL, 또는 새로운 세션 연결도 허용하지 않습니다. 운영 환경에서 DBA가 긴급 패치나 유지보수를 위해 즉시 종료 명령을 내린 경우, 해당 명령을 인지하지 못한 애플리케이션이나 다른 세션이 작업을 시도할 때 이 에러가 빈번하게 나타납니다.
주요 발생 원인
- SHUTDOWN IMMEDIATE 명령 실행 중 신규 연결 시도
가장 일반적인 원인으로, DBA가 데이터베이스를 즉시 종료하기 위해 SHUTDOWN IMMEDIATE 명령을 실행한 직후, 아직 종료가 완전히 완료되기 전에 다른 클라이언트나 배치 작업이 새로운 연결을 시도하거나 기존 세션에서 SQL 쿼리를 실행할 때 발생합니다. 특히 애플리케이션 서버의 커넥션 풀이 자동으로 재연결을 시도하는 경우 이 에러가 연속적으로 발생하는 것을 볼 수 있습니다.
- RAC 환경에서 특정 인스턴스 종료 시 세션 불일치
Oracle RAC(Real Application Clusters) 환경에서 하나의 인스턴스에 SHUTDOWN IMMEDIATE를 실행할 때, 다른 인스턴스에 연결된 세션이나 해당 인스턴스로 장애 조치(Failover)가 완료되기 전 상태에서 쿼리를 수행하면 ORA-01089 에러가 발생할 수 있습니다. RAC 환경에서는 인스턴스 종료 순서와 서비스 재배치(Service Relocation) 타이밍을 신중하게 관리해야 합니다.
- 자동화 스크립트 또는 모니터링 도구의 지속적 쿼리 실행
데이터베이스 헬스 체크 모니터링 도구(예: OEM, Zabbix, Nagios 등) 또는 자동화된 배치 스크립트가 데이터베이스 종료 사실을 인지하지 못하고 지속적으로 연결 및 쿼리 수행을 시도할 때 이 에러가 반복적으로 발생합니다. 이러한 경우 에러 로그에 ORA-01089가 대량으로 쌓이게 되며, 종료 후 정상 기동 이전까지 지속될 수 있습니다.
해결 방법
1. 현재 데이터베이스 상태 확인
먼저 데이터베이스의 현재 상태를 확인하여 종료가 진행 중인지 또는 이미 완료된 상태인지 파악합니다.
-- 데이터베이스 상태 확인 (SYSDBA 권한 필요)
SELECT STATUS, DATABASE_STATUS, INSTANCE_NAME
FROM V$INSTANCE;
-- 현재 활성 세션 확인
SELECT SID, SERIAL#, USERNAME, STATUS, MACHINE, PROGRAM
FROM V$SESSION
WHERE STATUS = 'ACTIVE'
AND USERNAME IS NOT NULL;
2. 데이터베이스 정상 기동 후 재시도
데이터베이스가 종료 상태라면, SYSDBA 권한으로 접속하여 데이터베이스를 다시 기동합니다.
-- SYSDBA 권한으로 접속 (OS 인증 방식)
-- sqlplus / as sysdba
-- 데이터베이스 기동 (NOMOUNT -> MOUNT -> OPEN 순서)
STARTUP;
-- 또는 단계별 기동
STARTUP NOMOUNT;
ALTER DATABASE MOUNT;
ALTER DATABASE OPEN;
-- 기동 후 상태 확인
SELECT OPEN_MODE, DATABASE_STATUS
FROM V$DATABASE d, V$INSTANCE i
WHERE ROWNUM = 1;
3. 강제 종료 후 재기동 (SHUTDOWN ABORT 이후 복구)
SHUTDOWN ABORT가 실행된 경우, 데이터베이스 기동 시 자동으로 인스턴스 복구(Instance Recovery)가 수행됩니다.
-- SHUTDOWN ABORT 이후 재기동 시 자동 복구 수행됨
STARTUP;
-- 복구 진행 상태 확인
SELECT RECOVERY_STATUS, FUZZY
FROM V$DATAFILE_HEADER
WHERE ROWNUM <= 10;
-- Alert Log 확인을 통한 복구 상태 모니터링
-- (OS 레벨에서 확인)
-- tail -f $ORACLE_BASE/diag/rdbms/<dbname>/<instance>/trace/alert_<instance>.log
4. RAC 환경에서의 서비스 상태 확인
-- RAC 환경에서 인스턴스별 상태 확인
SELECT INST_ID, INSTANCE_NAME, STATUS, DATABASE_STATUS
FROM GV$INSTANCE
ORDER BY INST_ID;
-- 서비스 상태 확인
SELECT NAME, NETWORK_NAME, ENABLED, AQ_HA_NOTIFICATIONS
FROM DBA_SERVICES
WHERE ENABLED = 'YES';
-- 특정 인스턴스에서 서비스 재시작
-- EXEC DBMS_SERVICE.START_SERVICE('서비스명');
5. 커넥션 풀 및 애플리케이션 레벨 처리
애플리케이션 레벨에서 ORA-01089 에러를 핸들링하는 예외 처리 코드를 추가합니다.
-- PL/SQL에서 ORA-01089 예외 처리 예시
DECLARE
v_count NUMBER;
e_shutdown EXCEPTION;
PRAGMA EXCEPTION_INIT(e_shutdown, -1089);
BEGIN
SELECT COUNT(*) INTO v_count FROM DUAL;
DBMS_OUTPUT.PUT_LINE('정상 처리: ' || v_count);
EXCEPTION
WHEN e_shutdown THEN
DBMS_OUTPUT.PUT_LINE('데이터베이스 종료 진행 중입니다. 잠시 후 재시도하세요.');
-- 로그 기록 또는 재시도 로직 추가
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('기타 에러: ' || SQLERRM);
END;
/
예방 방법
- 데이터베이스 종료 전 사전 공지 및 커넥션 드레이닝(Connection Draining) 절차 수립
운영 환경에서 SHUTDOWN IMMEDIATE를 실행하기 전에 반드시 사전 공지를 통해 애플리케이션 팀과 협의하고, 신규 연결 차단 후 기존 세션이 작업을 완료할 수 있도록 충분한 대기 시간을 설정하는 절차를 수립합니다. 아래와 같이 종료 전 신규 접속을 제한하는 방법을 활용할 수 있습니다.
-- 신규 세션 접속 제한 (종료 전 사전 조치)
ALTER SYSTEM ENABLE RESTRICTED SESSION;
-- 현재 활성 세션 목록 확인 후 순차적 종료 안내
SELECT SID, SERIAL#, USERNAME, MACHINE, PROGRAM, LOGON_TIME
FROM V$SESSION
WHERE USERNAME IS NOT NULL
AND USERNAME != 'SYS'
ORDER BY LOGON_TIME;
-- 필요 시 특정 세션 강제 종료
-- ALTER SYSTEM KILL SESSION 'SID,SERIAL#' IMMEDIATE;
-- 이후 SHUTDOWN NORMAL 또는 SHUTDOWN IMMEDIATE 실행
SHUTDOWN NORMAL;
- 모니터링 및 자동화 스크립트에 에러 핸들링 로직 추가
모든 데이터베이스 연결 스크립트와 모니터링 도구에는 ORA-01089를 포함한 데이터베이스 가용성 관련 에러에 대한 예외 처리 로직을 반드시 포함시켜야 합니다. 특히 배치 작업의 경우, 데이터베이스 상태를 사전 체크하는 로직을 추가하여 종료 진행 중에는 자동으로 대기하거나 작업을 취소하도록 구현합니다.
-- 배치 작업 전 데이터베이스 상태 사전 체크 예시
DECLARE
v_status VARCHAR2(20);
v_open_mode VARCHAR2(20);
BEGIN
SELECT STATUS, OPEN_MODE
INTO v_status, v_open_mode
FROM V$INSTANCE, V$DATABASE
WHERE ROWNUM = 1;
IF v_open_mode != 'READ WRITE' THEN
RAISE_APPLICATION_ERROR(-20001,
'데이터베이스가 READ WRITE 모드가 아닙니다. 현재 상태: ' || v_open_mode);
END IF;
DBMS_OUTPUT.PUT_LINE('데이터베이스 정상 상태 확인 완료: ' || v_open_mode);
END;
/
관련 에러
- ORA-01090:
SHUTDOWN in progress - connection is not permitted—SHUTDOWN NORMAL또는SHUTDOWN TRANSACTIONAL진행 중 새 연결 시도 시 발생하며, ORA-01089와 유사하지만 좀 더 정상적인 종료 과정에서 발생합니다. - ORA-03113:
end-of-file on communication channel— 데이터베이스 인스턴스가 예기치 않게 종료되었을 때 기존 연결에서 발생하며,SHUTDOWN ABORT이후 자주 동반됩니다. - ORA-03114:
not connected to ORACLE— 데이터베이스 종료 이후 연결이 완전히 끊어진 상태에서 발생하는 에러로, ORA-01089 이후 연속으로 나타날 수 있습니다. - ORA-01033:
ORACLE initialization or shutdown in progress— 데이터베이스가 기동 또는 종료 과정 중임을 나타내며, ORA-01089와 함께 연결 불가 상황에서 함께 발생하는 경우가 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.