2026년 08월 08일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-02021 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-02021 DDL operations are not allowed on a remote database 는?
ORA-02021 에러는 Oracle 데이터베이스에서 Database Link(DB Link)를 통해 원격 데이터베이스에 DDL(Data Definition Language) 작업을 직접 수행하려 할 때 발생하는 오류입니다. Oracle은 분산 데이터베이스 환경에서 보안과 트랜잭션 일관성을 유지하기 위해 DB Link를 통한 직접적인 DDL 실행을 허용하지 않습니다. 예를 들어, 원격 데이터베이스에 테이블을 생성하거나 인덱스를 추가하는 등의 작업을 로컬 세션에서 DB Link를 통해 시도하면 이 에러가 발생합니다.
주요 발생 원인
- DB Link를 통한 직접 DDL 실행 시도
가장 흔한 원인으로, 개발자 또는 DBA가 로컬 데이터베이스에서 DB Link를 이용해 원격 데이터베이스의 테이블, 인덱스, 뷰 등을 직접 생성하거나 수정하려 할 때 발생합니다. Oracle의 분산 트랜잭션 아키텍처 설계상 DDL 명령은 원격 DB Link를 통해 전달될 수 없으며, 반드시 해당 원격 데이터베이스에 직접 접속하여 실행해야 합니다. 예를 들어 CREATE TABLE remote_table@dblink_name (...) 또는 ALTER TABLE some_table@dblink ADD COLUMN ... 같은 구문이 이에 해당합니다.
- 저장 프로시저 또는 트리거 내에서 동적 DDL 실행
PL/SQL 프로시저나 패키지 내부에서 EXECUTE IMMEDIATE 또는 DBMS_SQL을 이용한 동적 DDL을 원격 DB Link 대상으로 실행하려 할 때 발생합니다. 많은 경우 로컬에서 정상 작동하던 프로시저를 원격 데이터베이스 대상으로 수정하면서 이 에러에 직면하게 됩니다. 자동화된 배포 스크립트나 마이그레이션 툴이 내부적으로 DB Link를 경유한 DDL을 시도하는 상황에서도 자주 나타납니다.
- 분산 환경에서의 잘못된 스키마 동기화 작업
여러 데이터베이스 인스턴스 간에 스키마를 동기화하거나 복제하려는 과정에서, DB Link를 활용한 일괄 DDL 스크립트를 실행할 때 이 에러가 발생합니다. Oracle Streams, GoldenGate, 또는 커스텀 동기화 솔루션을 구성하는 중에 잘못된 접근 방식을 사용할 경우 이 오류에 직면하게 됩니다. 분산 환경의 특성을 충분히 이해하지 못한 상태에서 단순 스크립트로 여러 원격 DB에 DDL을 뿌리는 방식을 택할 때 특히 자주 발생합니다.
해결 방법
해결책 1: 원격 데이터베이스에 직접 접속하여 DDL 실행
가장 근본적인 해결책은 DB Link를 사용하는 대신, 원격 데이터베이스에 직접 접속하여 DDL을 실행하는 것입니다.
-- 잘못된 방법 (ORA-02021 발생)
CREATE TABLE employees_backup@remote_db_link (
emp_id NUMBER,
emp_name VARCHAR2(100),
dept_id NUMBER
);
-- 올바른 방법: 원격 DB에 직접 접속 후 실행
-- (원격 데이터베이스 세션에서 직접 실행)
CREATE TABLE employees_backup (
emp_id NUMBER,
emp_name VARCHAR2(100),
dept_id NUMBER
);
해결책 2: DBMS_SQL 또는 EXECUTE IMMEDIATE를 원격 프로시저를 통해 우회
원격 데이터베이스에 DDL을 실행하는 PL/SQL 프로시저를 미리 생성해두고, DB Link를 통해 해당 프로시저를 호출하는 방식으로 우회할 수 있습니다.
-- [원격 데이터베이스에 미리 생성해 둘 프로시저]
CREATE OR REPLACE PROCEDURE remote_ddl_executor (
p_ddl_statement IN VARCHAR2
) AS
BEGIN
EXECUTE IMMEDIATE p_ddl_statement;
COMMIT;
END remote_ddl_executor;
/
-- [로컬 데이터베이스에서 DB Link를 통해 원격 프로시저 호출]
BEGIN
remote_ddl_executor@remote_db_link(
'CREATE TABLE employees_backup (
emp_id NUMBER,
emp_name VARCHAR2(100),
dept_id NUMBER
)'
);
END;
/
해결책 3: CTAS(Create Table As Select)를 활용한 데이터 복제
DDL로 테이블을 생성하고 데이터를 동시에 가져오고 싶다면, 로컬에서 원격 데이터를 SELECT하는 방식으로 CTAS를 활용하면 됩니다.
-- 원격 DB의 데이터를 로컬에 테이블로 복제 (DDL + DML 동시 처리)
CREATE TABLE local_employees_copy AS
SELECT *
FROM employees@remote_db_link
WHERE department_id = 10;
-- 원격 DB에서 데이터를 가져와 기존 로컬 테이블에 삽입
INSERT INTO local_staging_table
SELECT emp_id, emp_name, salary, hire_date
FROM employees@remote_db_link
WHERE hire_date >= TO_DATE('2023-01-01', 'YYYY-MM-DD');
COMMIT;
해결책 4: DDL 실행 전 DB Link 대상 확인 자동화
스크립트 내에서 DB Link 여부를 사전 체크하는 로직을 추가하여 실수를 방지할 수 있습니다.
-- DB Link 목록 조회
SELECT db_link, username, host
FROM dba_db_links
ORDER BY db_link;
-- 현재 세션이 어느 DB에 연결되어 있는지 확인
SELECT SYS_CONTEXT('USERENV', 'DB_NAME') AS local_db,
SYS_CONTEXT('USERENV', 'SERVER_HOST') AS server_host,
SYS_CONTEXT('USERENV', 'INSTANCE_NAME') AS instance_name
FROM dual;
-- 원격 DB 접속 확인 (DB Link 유효성 테스트)
SELECT *
FROM dual@remote_db_link;
예방 방법
- DDL 실행 전 접속 대상 DB를 명시적으로 검증하는 표준 운영 절차(SOP) 수립
모든 DDL 작업 전에 현재 세션이 올바른 데이터베이스에 접속되어 있는지 확인하는 검증 단계를 표준 운영 절차에 포함시켜야 합니다. 특히 멀티 환경(개발, 스테이징, 운영)에서 작업할 때는 SYS_CONTEXT('USERENV', 'DB_NAME')을 이용한 사전 체크 스크립트를 습관화하고, DB Link를 통한 DDL 시도 자체를 코드 리뷰 단계에서 걸러낼 수 있도록 개발 가이드라인을 정비하는 것이 좋습니다.
“`sql
— DDL 실행 전 DB 확인 표준 스크립트
SET SERVEROUTPUT ON
DECLARE
v_db_name VARCHAR2(50);
BEGIN
SELECT SYS_CONTEXT(‘USERENV’, ‘DB_NAME’)
INTO v_db_name
FROM dual;
IF v_db_name != ‘TARGET_DB_NAME’ THEN
RAISE_APPLICATION_ERROR(-20001,
‘잘못된 데이터베이스에 접속되어 있습니다. 현재 DB: ‘ || v_db_name);
END IF;
DBMS_OUTPUT.PUT_LINE(‘DB 확인 완료: ‘ || v_db_name);
END;
/
“`
- 원격 DDL 작업을 위한 전용 배포 아키텍처 및 도구 사용
DB Link를 통한 DDL 실행 대신, Flyway, Liquibase와 같은 전문 DB 마이그레이션 도구나 Oracle SQL*Plus 스크립트를 각 대상 DB에 직접 실행하는 파이프라인을 구축하는 것이 바람직합니다. CI/CD 파이프라인에서 각 데이터베이스에 독립적으로 접속하여 DDL을 실행하도록 설계하면 ORA-02021과 같은 분산 환경 관련 에러를 근본적으로 차단할 수 있습니다. 또한 원격 DDL 실행이 반드시 필요한 경우에는 앞서 설명한 원격 프로시저 호출 패턴을 표준화하여 재사용 가능한 형태로 관리하는 것을 권장합니다.
관련 에러
- ORA-02019: 원격 데이터베이스에 대한 접속 설명을 찾을 수 없을 때 발생하며, DB Link 설정 오류와 관련이 있습니다.
- ORA-02085: DB Link 이름이 현재 데이터베이스와 연결되지 않을 때 발생하며, DB Link 구성 문제를 나타냅니다.
- ORA-01017: DB Link 접속 시 잘못된 사용자명 또는 패스워드로 인해 원격 DB 인증에 실패할 때 발생합니다.
- ORA-12154: TNS 설정 오류로 인해 DB Link가 원격 데이터베이스를 찾지 못할 때 발생합니다.
- ORA-02049: 분산 트랜잭션에서 분산 잠금(distributed lock) 타임아웃이 발생할 때 나타나며, DB Link를 통한 DML 작업 중에도 연관되어 나타날 수 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.