Oracle ORA-00980 오류 원인과 해결 방법 완벽 가이드

ORA-00980
2026년 06월 24일 | DBMS Error 가이드

이 글에서 다루는 내용

ORA-00980 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.

ORA-00980 synonym translation is no longer valid 는?

ORA-00980 에러는 Oracle 데이터베이스에서 시노님(Synonym)이 가리키는 원본 객체(테이블, 뷰, 시퀀스, 프로시저 등)가 삭제되었거나 더 이상 유효하지 않을 때 발생하는 에러입니다. 시노님 자체는 데이터 딕셔너리에 여전히 존재하지만, 그 시노님이 참조하는 실제 객체가 없거나 접근 권한이 사라진 경우에 이 에러가 발생합니다. 운영 환경에서 갑자기 이 에러가 발생하면 애플리케이션 전체가 멈출 수 있기 때문에, 원인을 빠르게 파악하고 조치하는 것이 매우 중요합니다.


주요 발생 원인

1. 시노님이 참조하는 원본 객체가 삭제된 경우

가장 흔한 원인으로, DBA나 개발자가 원본 테이블, 뷰, 프로시저 등을 DROP했지만 해당 객체를 참조하던 시노님은 그대로 남아 있는 상황입니다. Oracle은 시노님이 가리키는 객체가 존재하는지 시노님 생성 시점에는 검증하지 않으므로, 객체가 삭제된 이후에야 실제 쿼리 실행 시점에 에러가 발생합니다. 이로 인해 개발 및 운영 환경에서 DDL 작업 이후 예상치 못한 장애가 발생하는 경우가 많습니다.

2. 다른 스키마나 데이터베이스 링크(DB Link)의 객체를 참조하는 시노님에서 권한이 변경된 경우

시노님이 다른 스키마의 객체를 참조할 때, 해당 스키마에서 원본 객체에 대한 GRANT 권한이 REVOKE되면 시노님을 통한 접근이 불가능해집니다. DB Link를 통한 원격 객체를 참조하는 시노님의 경우, DB Link가 삭제되거나 원격 데이터베이스의 객체 이름이 변경되어도 동일한 에러가 발생합니다. 이 경우는 특히 멀티 스키마 또는 분산 데이터베이스 환경에서 자주 발생하므로 더욱 주의가 필요합니다.

3. 객체 이름 변경(RENAME) 또는 재생성으로 인한 시노님 불일치

원본 객체가 RENAME되거나 DROP 후 다른 이름으로 재생성된 경우, 기존 시노님은 변경 전 이름을 여전히 참조하고 있어 유효하지 않은 상태가 됩니다. 특히 마이그레이션 작업이나 리팩토링 과정에서 테이블 명명 규칙을 변경할 때 이런 상황이 자주 발생합니다. 시노님을 사용하는 모든 애플리케이션 코드를 점검하지 않으면 운영 배포 이후 장애로 이어질 수 있습니다.


해결 방법

1단계: 유효하지 않은 시노님 확인

먼저 현재 데이터베이스에서 유효하지 않은 시노님을 조회합니다.

-- 유효하지 않은 시노님 전체 조회 (DBA 권한 필요)
SELECT s.owner,
       s.synonym_name,
       s.table_owner,
       s.table_name,
       s.db_link,
       o.status
FROM   dba_synonyms s
LEFT JOIN dba_objects o
       ON o.owner = s.table_owner
      AND o.object_name = s.table_name
WHERE  o.object_name IS NULL
   OR  o.status = 'INVALID'
ORDER BY s.owner, s.synonym_name;

-- 현재 사용자의 시노님만 확인
SELECT s.synonym_name,
       s.table_owner,
       s.table_name,
       s.db_link
FROM   user_synonyms s
LEFT JOIN all_objects o
       ON o.owner = s.table_owner
      AND o.object_name = s.table_name
WHERE  o.object_name IS NULL;

2단계: 원본 객체 존재 여부 확인

-- 특정 시노님이 참조하는 객체 존재 여부 확인
SELECT object_name,
       object_type,
       owner,
       status
FROM   dba_objects
WHERE  owner      = 'TARGET_SCHEMA'   -- 시노님이 참조하는 스키마
  AND  object_name = 'TARGET_TABLE';  -- 시노님이 참조하는 객체명

-- DB Link를 통한 원격 객체 참조 시노님 확인
SELECT synonym_name,
       table_name,
       db_link
FROM   dba_synonyms
WHERE  db_link IS NOT NULL;

3단계-A: 원본 객체가 삭제된 경우 – 시노님 재생성 또는 삭제

원본 객체를 복구하거나 새로운 객체로 시노님을 재생성합니다.

-- 기존 유효하지 않은 시노님 삭제
DROP SYNONYM schema_name.synonym_name;

-- 또는 PUBLIC 시노님 삭제 (DBA 권한 필요)
DROP PUBLIC SYNONYM old_synonym_name;

-- 새로운 객체를 가리키도록 시노님 재생성
CREATE OR REPLACE SYNONYM app_user.emp_syn
FOR hr.employees;

-- PUBLIC 시노님 재생성
CREATE OR REPLACE PUBLIC SYNONYM emp_syn
FOR hr.employees;

3단계-B: 권한 문제인 경우 – 권한 재부여

-- 원본 객체에 대한 권한 재부여
GRANT SELECT, INSERT, UPDATE, DELETE
ON    hr.employees
TO    app_user;

-- 뷰에 대한 권한 부여
GRANT SELECT ON hr.emp_detail_view TO app_user;

-- 시노님을 통한 접근 권한 확인
SELECT grantee,
       owner,
       table_name,
       privilege
FROM   dba_tab_privs
WHERE  owner      = 'HR'
  AND  table_name = 'EMPLOYEES';

3단계-C: DB Link 문제인 경우

-- DB Link 유효성 확인
SELECT db_link,
       username,
       host,
       created
FROM   dba_db_links
WHERE  db_link = 'REMOTE_DB_LINK';

-- DB Link를 통한 연결 테스트
SELECT * FROM dual@remote_db_link;

-- DB Link 재생성 (필요한 경우)
DROP DATABASE LINK remote_db_link;

CREATE DATABASE LINK remote_db_link
CONNECT TO remote_user
IDENTIFIED BY "password"
USING 'remote_tns_alias';

-- DB Link 기반 시노님 재생성
CREATE OR REPLACE SYNONYM remote_emp
FOR employees@remote_db_link;

유효하지 않은 시노님 일괄 처리 스크립트

-- 유효하지 않은 시노님 DROP 스크립트 자동 생성
SELECT 'DROP ' ||
       CASE WHEN owner = 'PUBLIC' THEN 'PUBLIC ' ELSE '' END ||
       'SYNONYM ' ||
       CASE WHEN owner != 'PUBLIC' THEN owner || '.' ELSE '' END ||
       synonym_name || ';' AS drop_stmt
FROM   dba_synonyms s
WHERE  NOT EXISTS (
           SELECT 1
           FROM   dba_objects o
           WHERE  o.owner       = s.table_owner
             AND  o.object_name = s.table_name
       )
  AND  db_link IS NULL
ORDER BY owner, synonym_name;

예방 방법

1. DDL 작업 전 시노님 의존성 사전 검증 프로세스 수립

테이블이나 뷰를 DROP하기 전에 반드시 해당 객체를 참조하는 시노님, 뷰, 프로시저 등의 의존 객체를 먼저 확인하는 것을 표준 절차로 만들어야 합니다. 아래 쿼리를 DDL 작업 체크리스트에 포함시켜 운영 변경 관리(Change Management) 프로세스에 반드시 포함시키세요.

-- 특정 객체를 참조하는 모든 시노님 및 의존 객체 사전 확인
SELECT name        AS dependent_object,
       type        AS object_type,
       referenced_owner,
       referenced_name,
       referenced_type
FROM   dba_dependencies
WHERE  referenced_owner = 'HR'
  AND  referenced_name  = 'EMPLOYEES'
ORDER BY type, name;

2. 정기적인 유효하지 않은 시노님 모니터링 자동화

운영 환경에서 유효하지 않은 시노님을 주기적으로 점검하는 모니터링 잡을 설정하면, 장애 발생 전에 선제적으로 대응할 수 있습니다. Oracle Scheduler를 이용해 매일 점검 결과를 DBA에게 이메일로 전송하거나, 모니터링 시스템(Zabbix, OEM 등)과 연동하는 것을 권장합니다.

-- 유효하지 않은 시노님 모니터링 뷰 생성
CREATE OR REPLACE VIEW dba_invalid_synonyms_v AS
SELECT s.owner,
       s.synonym_name,
       s.table_owner,
       s.table_name,
       s.db_link,
       SYSDATE AS check_date
FROM   dba_synonyms s
WHERE  s.db_link IS NULL
  AND  NOT EXISTS (
           SELECT 1
           FROM   dba_objects o
           WHERE  o.owner       = s.table_owner
             AND  o.object_name = s.table_name
       );

-- 모니터링 쿼리 (스케줄러 잡에 활용)
SELECT COUNT(*) AS invalid_synonym_count
FROM   dba_invalid_synonyms_v
WHERE  owner NOT IN ('SYS', 'SYSTEM', 'ORACLE_OCM');

관련 에러

  • ORA-00942: table or view does not exist — 시노님이 아닌 실제 테이블이나 뷰가 존재하지 않을 때 발생하며, ORA-00980과 혼동되는 경우가 많습니다.
  • ORA-01775: looping chain of synonyms — 시노님이 서로를 순환 참조하는 경우 발생합니다.
  • ORA-02019: connection description for remote database not found — DB Link 기반 시노님에서 DB Link 자체를 찾을 수 없을 때 발생합니다.
  • ORA-04043: object does not exist — 존재하지 않는 객체에 대해 DDL 작업(DESCRIBE, ALTER 등)을 시도할 때 발생합니다.

DBMS 에러 코드 시리즈

주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.

본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.

댓글 남기기