DB 링크를 쓰는 SQL 에서 오류가 두 줄로 나온다.
ORA-00942: table or view does not exist
ORA-02063: preceding line from MY_DBLINK
ORA-02063 은 그 자체로 잘못된 것을 가리키지 않는다. "바로 앞의 n 줄은 이 DB 링크 너머에서 온 오류다" 라고 알려 주는 꼬리표다. 메시지 형식은 다음과 같다.
ORA-02063: preceding <n> lines from <DB_LINK_NAME>
<n> 은 원격에서 넘어온 오류 줄 수이고, <DB_LINK_NAME> 은 그 오류가 통과한 링크 이름이다. 진짜 원인은 항상 바로 위에 있는 오류다. 위 예에서는 ORA-00942 다.
ORA-02063 만 보고 링크 설정을 뒤지는 것은 대개 헛수고다. 링크 자체가 문제라면 ORA-12154, ORA-02019, ORA-01017 같은 다른 번호가 뜬다.
분산 질의가 끼면 언제든 나올 수 있다.
SELECT ... FROM table@dblinkINSERT INTO local SELECT ... FROM remote@dblink마지막 경우가 가장 헷갈린다. SQL 어디에도 @ 가 없는데 ORA-02063 이 나온다면, 조회한 뷰나 시노님이 안에서 링크를 타고 있는 것이다.
| 앞줄 오류 | 원격 쪽에서 확인할 것 |
|---|---|
ORA-00942 |
테이블·뷰가 없거나, 링크 계정에 접근 권한이 없다. 링크 계정 기준 스키마가 다를 수 있다 |
ORA-01031 |
권한 부족. SELECT 권한이나 소유 스키마 접근 권한 |
ORA-00904 |
컬럼 이름 불일치. 원격 테이블 구조가 바뀌었다 |
ORA-01017 |
링크에 저장된 계정·비밀번호가 원격에서 유효하지 않다 |
ORA-12170 · ORA-03113 |
세션이 끊겼다. 네트워크 지연·방화벽 유휴 타임아웃 |
ORA-12705 · 문자 깨짐 |
양쪽 NLS 설정 불일치 |
원격에서 같은 SQL 을 링크 없이 그대로 실행해 보는 것이 가장 빠르다. 거기서 같은 오류가 나면 원격 쪽 문제로 확정된다.
-- 1) 링크 목록과 접속 계정 확인
SELECT db_link, username, host FROM user_db_links;
SELECT db_link, owner, username, host FROM dba_db_links;
-- 2) 링크가 실제로 붙는지
SELECT * FROM dual@MY_DBLINK;
-- 3) 링크가 원격에서 어떤 계정으로 보이는지
SELECT SYS_CONTEXT('USERENV','SESSION_USER') FROM dual@MY_DBLINK;
-- 4) 그 계정이 해당 객체를 볼 수 있는지 (원격에서 실행)
SELECT owner, table_name FROM all_tables WHERE table_name = 'EMP';
SELECT * FROM all_tab_privs WHERE table_name = 'EMP';
3번이 핵심이다. 로컬에서 SCOTT 으로 접속했더라도 링크 너머에서는 링크에 박힌 계정으로 동작한다. 그 계정이 다른 스키마의 객체를 보려면 스키마 한정(OWNER.TABLE)이나 시노님, 권한 부여가 필요하다.
SELECT ... FROM dual@MY_DBLINK 같은 링크 사용은 분산 트랜잭션을 열어 원격 세션을 남긴다. 확인이 끝나면 COMMIT 이나 ROLLBACK 으로 정리한다. 그러지 않으면 DBA_2PC_PENDING 에 항목이 쌓이거나 원격에 유휴 세션이 남는다.