2026년 10월 02일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-28000 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-28000 the account is locked 는?
ORA-28000은 Oracle 데이터베이스에서 특정 사용자 계정이 잠겨 있을 때 발생하는 에러입니다. 주로 로그인 시도 횟수 초과, DBA의 수동 잠금 처리, 또는 패스워드 정책에 의해 자동으로 계정이 잠겼을 때 접속을 시도하면 이 에러가 발생합니다. 운영 환경에서 갑자기 애플리케이션이 DB에 접속하지 못하게 되는 상황의 주요 원인 중 하나이므로, 빠른 원인 파악과 조치가 매우 중요합니다.
주요 발생 원인
1. 로그인 실패 횟수 초과 (FAILED_LOGIN_ATTEMPTS)
Oracle의 Profile 설정 중 FAILED_LOGIN_ATTEMPTS 파라미터는 연속 로그인 실패 허용 횟수를 제한합니다. 기본값은 Oracle 버전에 따라 다르지만, 10g 이후부터는 DEFAULT Profile의 기본값이 10으로 설정되어 있으며, 이 횟수를 초과하면 해당 계정은 자동으로 잠깁니다. 애플리케이션에서 잘못된 패스워드를 반복적으로 시도하거나, 배치 프로그램이 오래된 패스워드를 사용하는 경우 자주 발생합니다.
2. DBA에 의한 수동 계정 잠금 처리
보안 정책 또는 퇴직/휴직 등의 인사 변동으로 인해 DBA가 직접 ALTER USER ... ACCOUNT LOCK 명령으로 계정을 잠근 경우입니다. 이 경우 ORA-28000이 발생하며, 관련 담당자와 협의 없이 갑작스럽게 계정이 잠기는 상황도 종종 발생합니다. 운영 DB에서 특히 서비스 계정이 잠기면 애플리케이션 전체가 영향을 받을 수 있으므로 변경 이력 관리가 중요합니다.
3. 패스워드 유효기간 만료 후 미변경 (PASSWORD_LIFE_TIME)
Oracle Profile의 PASSWORD_LIFE_TIME 설정이 특정 일수로 제한된 경우, 해당 기간이 지나면 패스워드가 만료됩니다. 만료된 패스워드를 가진 계정은 ORA-28001 에러와 함께 패스워드 변경을 요구받으며, 이를 무시하거나 자동화된 시스템이 처리하지 못하면 이후 계정이 잠겨 ORA-28000으로 이어집니다. 특히 PASSWORD_GRACE_TIME이 지난 이후에도 변경하지 않으면 최종적으로 잠금 상태가 됩니다.
해결 방법
1단계: 잠긴 계정 확인
먼저 어떤 계정이 잠겨 있는지 확인합니다.
-- 잠긴 계정 전체 조회
SELECT username,
account_status,
lock_date,
expiry_date,
profile
FROM dba_users
WHERE account_status LIKE '%LOCKED%'
ORDER BY lock_date DESC;
-- 특정 사용자 상태 확인
SELECT username,
account_status,
lock_date,
expiry_date
FROM dba_users
WHERE username = 'TARGET_USER';
2단계: 계정 잠금 해제
계정 잠금을 해제하려면 DBA 권한이 필요합니다.
-- 계정 잠금 해제 (기본)
ALTER USER target_user ACCOUNT UNLOCK;
-- 패스워드 재설정과 동시에 잠금 해제 (권장)
ALTER USER target_user IDENTIFIED BY "NewPassword123!" ACCOUNT UNLOCK;
-- 패스워드 만료 없이 잠금 해제 후 즉시 사용 가능하게 처리
ALTER USER target_user IDENTIFIED BY "NewPassword123!"
ACCOUNT UNLOCK;
-- 이후 패스워드 만료 여부 재확인
SELECT username, account_status, expiry_date
FROM dba_users
WHERE username = 'TARGET_USER';
3단계: 로그인 실패 이력 확인
잠금 원인을 파악하기 위해 감사 로그를 조회합니다.
-- Unified Auditing 환경 (12c 이상)
SELECT dbusername,
event_timestamp,
action_name,
return_code,
os_username,
userhost
FROM unified_audit_trail
WHERE dbusername = 'TARGET_USER'
AND return_code != 0
ORDER BY event_timestamp DESC
FETCH FIRST 20 ROWS ONLY;
-- 전통적 감사 환경 (11g 이하)
SELECT username,
timestamp,
action_name,
returncode,
os_username,
terminal
FROM dba_audit_trail
WHERE username = 'TARGET_USER'
AND returncode != 0
ORDER BY timestamp DESC;
4단계: Profile 설정 확인 및 조정
잦은 잠금이 발생한다면 Profile 설정을 검토합니다.
-- 현재 Profile 설정 확인
SELECT resource_name,
limit
FROM dba_profiles
WHERE profile = 'DEFAULT'
AND resource_name IN ('FAILED_LOGIN_ATTEMPTS',
'PASSWORD_LOCK_TIME',
'PASSWORD_LIFE_TIME',
'PASSWORD_GRACE_TIME');
-- 서비스 계정용 별도 Profile 생성 (권장)
CREATE PROFILE app_service_profile LIMIT
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LOCK_TIME 1/24 -- 1시간 후 자동 해제
PASSWORD_LIFE_TIME UNLIMITED
PASSWORD_GRACE_TIME UNLIMITED
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED;
-- 생성한 Profile을 서비스 계정에 적용
ALTER USER app_service_user PROFILE app_service_profile;
-- Profile 적용 결과 확인
SELECT username, profile
FROM dba_users
WHERE username = 'APP_SERVICE_USER';
예방 방법
1. 서비스 계정과 사용자 계정의 Profile 분리 관리
애플리케이션이 사용하는 서비스 계정(DB 접속 전용 계정)은 일반 사용자 계정과 동일한 Profile을 사용하지 않는 것이 원칙입니다. 서비스 계정은 PASSWORD_LIFE_TIME을 UNLIMITED로 설정하거나, 별도의 패스워드 관리 프로세스를 운영하고, FAILED_LOGIN_ATTEMPTS는 적절히 높게 설정하여 일시적인 네트워크 오류나 애플리케이션 재시작 시 발생하는 연속 실패로 인한 잠금을 방지합니다.
-- 모니터링 쿼리: 패스워드 만료 임박 계정 사전 알림용
SELECT username,
expiry_date,
ROUND(expiry_date - SYSDATE) AS days_until_expiry
FROM dba_users
WHERE account_status = 'OPEN'
AND expiry_date IS NOT NULL
AND expiry_date - SYSDATE <= 30 -- 30일 이내 만료 예정
ORDER BY expiry_date;
2. 계정 상태 정기 모니터링 및 알림 자동화
계정이 잠기기 전에 미리 감지할 수 있도록 자동화된 모니터링을 구성해야 합니다. 주기적으로 DBA_USERS와 감사 로그를 조회하여 로그인 실패가 급증하는 계정을 사전에 파악하고, 임계치에 근접하면 DBA에게 자동 알림이 가도록 설정합니다.
-- 잠금 직전 상태 확인 (로그인 실패 횟수 조회 - 12c 이상)
SELECT name, lcount, astatus
FROM sys.user$
WHERE name = 'TARGET_USER';
-- lcount: 현재 누적 실패 횟수 (FAILED_LOGIN_ATTEMPTS 한도에 근접 여부 확인)
관련 에러
- ORA-28001:
the password has expired— 패스워드 유효기간이 만료된 경우 발생하며, 방치하면 ORA-28000으로 이어질 수 있습니다. - ORA-28002:
the password will expire within N days— 패스워드 만료 경고 메시지로, 사전에 변경하지 않으면 ORA-28001, ORA-28000 순서로 에러가 발생합니다. - ORA-1017:
invalid username/password; logon denied— 잘못된 패스워드 입력 시 발생하며, 반복되면 ORA-28000의 직접적 원인이 됩니다. - ORA-28003:
password verification for the specified password failed— 패스워드 복잡도 정책 위반 시 발생하며, 패스워드 변경 실패로 이어져 계정 잠금을 유발할 수 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.