2026년 07월 03일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-01081 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-01081 cannot start already-running ORACLE – shut it down first 는?
ORA-01081 에러는 Oracle 데이터베이스 인스턴스가 이미 실행 중인 상태에서 다시 시작(STARTUP) 명령을 실행하려고 할 때 발생하는 에러입니다. Oracle은 동일한 시스템에서 동일한 SID(System Identifier)를 가진 인스턴스를 중복으로 실행하는 것을 허용하지 않기 때문에, 기존 인스턴스를 먼저 종료(SHUTDOWN)하지 않으면 이 에러가 발생합니다. 특히 DBA가 데이터베이스 재시작 작업을 수행하거나, 자동화된 스크립트가 인스턴스의 상태를 확인하지 않고 STARTUP 명령을 실행할 때 자주 마주치게 됩니다.
주요 발생 원인
1. 이미 실행 중인 인스턴스에 STARTUP 명령 재실행
가장 흔한 원인으로, DBA가 인스턴스 상태를 확인하지 않고 STARTUP 명령을 실행하는 경우입니다. 데이터베이스가 이미 OPEN 또는 MOUNTED 상태일 때 추가적인 STARTUP 명령을 내리면 Oracle은 충돌을 방지하기 위해 즉시 ORA-01081을 반환합니다. 일반적으로 운영 환경에서 재기동 스크립트를 실수로 두 번 실행하거나, 자동화 도구에서 상태 체크 로직이 빠진 경우에 발생합니다.
2. 이전 인스턴스의 잔여 프로세스 및 공유 메모리 미정리
비정상적인 종료(Abort) 후 백그라운드 프로세스나 공유 메모리 세그먼트가 OS 레벨에서 완전히 제거되지 않은 상태에서 STARTUP을 시도할 때 발생합니다. Oracle은 SGA(System Global Area) 메모리 구조가 남아 있다면 이미 인스턴스가 살아있다고 판단하여 이 에러를 반환합니다. 이 경우 단순히 STARTUP 명령을 재실행하는 것이 아니라 OS 레벨에서 잔여 자원을 정리해야 합니다.
3. 여러 세션 또는 자동화 스크립트의 동시 STARTUP 시도
배치 작업이나 모니터링 도구, 자동 복구 스크립트 등이 동시에 STARTUP 명령을 실행하는 경우입니다. 특히 Oracle RAC(Real Application Clusters) 환경이나 Data Guard 구성에서 자동 페일오버 스크립트가 잘못 구성된 경우, 이미 STARTUP 중인 인스턴스에 또 다른 STARTUP 요청이 들어와 ORA-01081이 발생할 수 있습니다. 자동화 환경에서는 반드시 인스턴스 상태를 확인하는 선행 로직이 포함되어야 합니다.
해결 방법
1단계: 현재 인스턴스 상태 확인
먼저 인스턴스가 실제로 실행 중인지 확인합니다.
-- SQL*Plus에서 인스턴스 상태 확인
SELECT instance_name, status, database_status
FROM v$instance;
-- 데이터베이스 오픈 여부 확인
SELECT name, open_mode FROM v$database;
2단계-A: 인스턴스가 정상 실행 중인 경우 → 종료 후 재시작
인스턴스가 실제로 실행 중이라면, 먼저 정상적으로 종료한 후 재시작합니다.
-- 정상 종료 (트랜잭션 완료 후 종료)
SHUTDOWN IMMEDIATE;
-- 종료 확인 후 재시작
STARTUP;
-- 특정 모드로 시작이 필요한 경우
STARTUP MOUNT; -- 마운트 모드
STARTUP RESTRICT; -- 제한 모드 (DBA만 접속 가능)
STARTUP FORCE; -- 강제 재시작 (SHUTDOWN ABORT 후 STARTUP 자동 수행)
2단계-B: 잔여 프로세스/공유 메모리가 원인인 경우 → OS 레벨 정리
# Linux/Unix 환경에서 Oracle 관련 프로세스 확인
ps -ef | grep ora_ | grep -v grep
ps -ef | grep pmon | grep -v grep
# 공유 메모리 세그먼트 확인
ipcs -m | grep oracle
# 잔여 공유 메모리 강제 제거 (shmid는 ipcs -m 결과에서 확인)
ipcrm -m <shmid>
# 잔여 세마포어 확인 및 제거
ipcs -s | grep oracle
ipcrm -s <semid>
OS 정리 후 SQL*Plus에서 재시작:
-- OS 자원 정리 후 강제 시작
STARTUP FORCE;
-- 또는 일반 시작
STARTUP;
2단계-C: 자동화 스크립트에서 상태 체크 로직 추가
Shell 스크립트에서 인스턴스 상태를 먼저 확인하는 방법:
#!/bin/bash
# Oracle 인스턴스 상태 확인 후 조건부 시작 스크립트
ORACLE_SID=ORCL
export ORACLE_SID
STATUS=$(sqlplus -s / as sysdba <<EOF
SET HEADING OFF FEEDBACK OFF
SELECT status FROM v\$instance;
EXIT;
EOF
)
if echo "$STATUS" | grep -q "OPEN"; then
echo "인스턴스가 이미 실행 중입니다. STARTUP을 건너뜁니다."
else
echo "인스턴스를 시작합니다..."
sqlplus / as sysdba <<EOF
STARTUP;
EXIT;
EOF
fi
-- v$instance를 이용한 상태 기반 조건 처리 예시 (PL/SQL)
DECLARE
v_status VARCHAR2(20);
BEGIN
SELECT status INTO v_status FROM v$instance;
IF v_status = 'OPEN' THEN
DBMS_OUTPUT.PUT_LINE('DB is already running: ' || v_status);
ELSE
DBMS_OUTPUT.PUT_LINE('DB status: ' || v_status || ' - Please start manually.');
END IF;
END;
/
예방 방법
1. STARTUP 전 반드시 인스턴스 상태 점검 루틴 구현
모든 데이터베이스 재기동 스크립트에는 사전에 v$instance 뷰를 통해 현재 상태를 조회하는 로직을 포함해야 합니다. 자동화된 환경(크론 잡, 모니터링 툴, RMAN 스크립트 등)에서도 예외 없이 STARTUP 명령 전에 상태 확인 단계를 두고, 인스턴스가 이미 OPEN 상태라면 해당 작업을 건너뛰거나 경고 알림을 발송하는 방식으로 설계하는 것이 Best Practice입니다.
2. STARTUP FORCE 옵션의 적절한 활용 및 운영 절차 문서화
STARTUP FORCE 명령은 내부적으로 SHUTDOWN ABORT를 수행한 후 STARTUP을 실행하므로, 인스턴스 상태와 무관하게 재시작이 가능합니다. 단, 이 명령은 데이터 정합성 위험이 있으므로 프로덕션 환경에서는 신중하게 사용해야 하며, 사용 기준과 절차를 운영 매뉴얼에 명확히 문서화해두어야 합니다. 또한 Oracle Enterprise Manager(OEM)나 Grid Control을 통한 중앙 집중식 인스턴스 관리를 도입하면 중복 STARTUP 시도 자체를 원천적으로 방지할 수 있습니다.
관련 에러
- ORA-01034: ORACLE not available — 인스턴스가 시작되지 않은 상태에서 접속 시도 시 발생하며, ORA-01081과 반대 상황에 해당합니다.
- ORA-27123: unable to attach to shared memory segment — 공유 메모리 관련 문제로 인스턴스 시작 실패 시 함께 발생할 수 있습니다.
- ORA-01507: database not mounted — STARTUP MOUNT 없이 데이터베이스 작업 시도 시 발생하며, 인스턴스 상태 관리와 밀접한 관련이 있습니다.
- ORA-00445: background process did not start — 백그라운드 프로세스 시작 실패 시 나타나며, 잔여 프로세스 문제와 연관될 수 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.