1. DB Link란?
- A 데이터베이스에서 B 데이터베이스의 객체에 접근할 수 있게 하는 연결고리
- 데이터를 직접 전송하거나 API를 사용하지 않고 SQL 쿼리를 활용해 다른 서버의 데이터에 접근 가능
- 어떤 계정에 DB Link를 거느냐에 따라 계정이 객체에 대해 가지고 있는 권한이 다름
- 데이터를 옮기거나, select/update/insert/delete, A 데이터베이스와 B 데이터베이스의 형상 비교 등에 유용함
# 예를 들어 DBDEV : select/update/insert/delete 가능 / DBSEL : select 가능 하다면
# DB Link를 DBDEV계정에 연결하는지, DBSEL에 연결하는지에 따라 가능한 SQL이 달라짐
★ 실습: PROD DB의 USER1 계정이 TEST DB 객체들 바라보는 DB Link 생성 ★
2. DB Link 생성
2-1. 권한 부여
- 사용자ID에 해당하는 계정에 권한 부여가 우선 되어야 DB Link 생성이 가능함.
- CREATE DATABASE LINK 권한은 SYSTEM 또는 ROOT가 부여 가능(보통 프로젝트에서는 DBA가 생성)
SQL> GRANT CREATE DATABASE LINK TO 사용자ID;
- 실습
- PROD DB에서 실행(system 또는 root권한 이용)
SQL> GRANT CREATE DATABASE LINK TO USER1;
2-2. DB Link 생성
- DB Link의 이름은 프로젝트마다 작성 방법이 있음
- USING에는 DB의 TNS명이 들어가는데, 이는 tnsnames.ora 파일에 있음(linux에서 확인 가능)
- tnsnames.ora 파일 위치 : {oracle client 설치 경로}\network\admin\tnsnames.ora
- USING에는 DB의 TNS명의 내용이 올 수 있음
SQL> CREATE DATABASE LINK DBLink명
> CONNECT TO 원격서버 사용자ID IDENTIFIED BY "원격서버 사용자 password"
> USING 'DB의 TNS명';
SQL> CREATE DATABASE LINK DBLink명
> CONNECT TO 원격서버 사용자ID IDENTIFIED BY "원격서버 사용자 password"
> USING '(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL={프로토콜})(HOST={호스트IP1})(PORT={호스트 포트1}))
(ADDRESS=(PROTOCOL={프로토콜})(HOST={호스트IP2})(PORT={호스트 포트2}))
)
(CONNECT_DATA=
(SERVICE_NAME={서비스명}) // SID명으로 대체 가능
)
)';
- 실습
- TESTDB의 DBDEV계정은 테이블들을 SELECT/UPDATE/INSERT/DELETE 할 수 있는 권한을 가지고 있음
SQL> CREATE DATABASE LINK TESTDB_DBDEV_DBLINK
> CONNECT TO "DBDEV" IDENTIFIED BY "DBDEV의 password"
> USING 'TESTDB';
3. DB Link 조회 및 검증(사용)
- DB Link 조회는 DBA만 가능, 사용은 계정별로 생성하면 사용 가능
3-1. 조회
- 어떤 DB + 어떤 계정과 연결되었는지 확인 가능(DBA만 확인 가능)
SQL> SELECT * FROM DBA_DB_LINKS;
3-2. 검증 및 사용
- 생성한 DB + 계정에서 확인
SQL> SELECT * FROM "OWNER"."TABLE_NAME"@DB_LINK명;
- 실습
- PROD에서 USER1 계정으로 접속한 후에 아래 쿼리를 실행하면 TESTDB의 schema=owner=USER2, table_name=USER_TABLE 을 PROD에서 확인할 수 있음
SQL> SELECT * FROM USER2.USER_TABLE@TESTDB_DBDEV_DBLINK;
4. DB Link 삭제
- 이때, DROP DATABASE가 아닌 DROP DATABASE LINK임.
- DROP DATABASE하면 데이터베이스 자체가 다 날라감.
SQL> DROP DATABASE LINK "DB_LINK명";
- 삭제 후 DBA_DB_LINK테이블에서 확인했을 때 없으면 삭제된 것(DBA만 확인 가능)
SQL> SELECT * FROM DBA_DB_LINKS;
5. DB Link 발생 에러
5-1. ORA-12154 : TNS: 지정된 접속 식별자를 분석할 수 없음
- ORACLE_HOME 환경변수확인
- tnsnames.ora 파일 확인
- 방화벽 열기
- 위의 방법이 다 안되면, tnsnames.ora 추가 없이 DB Link를 설정
SQL> CREATE DATABASE LINK DBLink명
> CONNECT TO "원격서버 사용자ID" IDENTIFIED BY "원격서버 사용자 password"
> USING '(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL={프로토콜})(HOST={호스트IP1})(PORT={호스트 포트1}))
(ADDRESS=(PROTOCOL={프로토콜})(HOST={호스트IP2})(PORT={호스트 포트2}))
)
(CONNECT_DATA=
(SERVICE_NAME={서비스명}) // SID명으로 대체 가능
)
)';
5-2. ORA-01017 : invalid username/password; login denied
ORA-02063 : Preceding Line From
- DB Link 생성 시 원격서버 사용자ID가 없거나, 원격서버 사용자 password가 틀린 경우
- 비밀번호에 특수문자가 포함되어있으면 비밀번호를 쌍따옴표("password")로 감싸야함
'Oracle' 카테고리의 다른 글
[Oracle] 오라클 데이터베이스 초기화 파라미터 (1) | 2025.05.03 |
---|---|
[Oracle] spfile에서 pfile로 복사해서 비교하기 (0) | 2025.05.03 |
[Oracle] User별 Quota 확인 및 변경(+ Unlimited Tablespace) (0) | 2025.05.03 |
[Oracle] 시노님(Synonym) 의미 및 생성/조회/삭제 (0) | 2025.05.03 |
[Oracle] 권한 관리(부여/회수) 및 ROLE 관리 (0) | 2025.05.03 |