알아두자!
오라클 쪽은 신경쓸 필요가 없다.
이미 구동 중이고 리스너가 떠있다. 언제든지 접속해서 쿼리를 실행할 수 있다.
왼쪽 로컬 티베로만 세팅하면 된다.
모든 요청은 tbsql(Client API)을 통해서만 진행된다.
tbsql이 인스턴스에게 전달 -> 게이트 웨이에게 전달 -> 오라클 클라이언트에게 전달
세 가지 설정이 되어있어야 원활한 연결이 가능하다
TBGW
오라클 인스턴트 클라이언트(tnsnames.ora)
빨간 표시는 중요하기 때문에 표시된 거임
(+)리스너 방식
$ cp /tibero/s/instantclient-* /tibero
$ ls -l /tibero/instantclient-*
-rwxr-x--- 1 tibero dba 60704657 Aug 23 10:45 /tibero/instantclient-basic-linux.x64-11.2.0.4.0.zip
$ unzip instantclient-*
$ mkdir /tibero/tbgateway/
$ mkdir /tibero/tbgateway/oracle
$ mkdir /tibero/tbgateway/oracle/config
$ mkdir /tibero/tbgateway/oracle/log
$ vi /home/tibero5/tbgateway/oracle/config/tbgw.cfg
$ cat /tibero/tbgateway/oracle/config/tbgw.cfg
-- tbgw.cfg 내용 --
LISTENER_PORT=9998
LOG_DIR=/tibero/tbgateway/oracle/log
LOG_LVL=2
MAX_LOG_SIZE=50240000
$ ls -l $TB_HOME/client/bin/gw4orcl*
-- gw4orcl 위치 --
-rwxr-xr-x 1 tibero dba 37885400 Jun 24 15:43 /tibero/tibero7/client/bin/gw4orcl
-- gw4orcl를 tbgateway 디렉토리로 복사한다.
$ cp /tibero/tibero7/client/bin/gw4orcl /tibero/tbgateway
$ vi ~/.bash_profile
$ tail -n9 ~/.bash_profile
-- .bash_profile 변경내용 확인
######## TIBERO TO ORACLE DBLINK #######
export TBGW_HOME=/tibero/tbgateway
export ORACLE_HOME=/tibero/instantclient_11_2
export ORACLE_SID=orcl
export LIBPATH=$ORACLE_HOME:$LIBPATH
export LD_LIBRARY_PATH=$LIBPATH:$LD_LIBRARY_PATH
export PATH=$ORACLE_HOME:$PATH
$ source ~/.bash_profile -- 변경내용 바로 적용
-- 환경변수 확인
$ echo $TBGW_HOME
/tibero/tbgateway
$ echo $ORACLE_HOME
/tibero/instantclient_11_2
[tibero@T1:/tibero]$ mkdir -p $ORACLE_HOME/network/admin
[tibero@T1:/tibero]$ cd $ORACLE_HOME/network/admin
[tibero@T1:/tibero/instantclient_11_2/network/admin]$ cp /tibero/s/tnsnames.ora -- 공유 폴더에 미리 생성된 파일 가져옴
-- tnsnames.ora 파일 내용
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.188.191.10)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
--
-- ORCL = DBLINK 명(ex : select * from dual@oralink)
## HOST = Oracle 서버의 IP
## PORT = Oracle 서버의 Port
## SERVICE_NAME = 오라클 서버의 Service 명
.so파일을 이용해서 동작하는데, 리눅스의 특정 경로에 들어있기도 하고 암튼 여기저기 다 있음
$ vi $TB_HOME/client/config/tbdsn.tbr
$ cat $TB_HOME/client/config/tbdsn.tbr
-- tbdsn.tbr
tibero=(
(INSTANCE=(HOST=localhost)
(PORT=8629)
(DB_NAME=tibero)
)
)
Tibero2=(
(INSTANCE=(HOST=10.188.191.33)
(PORT=8629)
(DB_NAME=tibero)
)
)
-- 추가한 내용
MOF=(
(GATEWAY=(LISTENER=(HOST=localhost)(PORT=9998)) -- tbgw.cfg에 지정한 포트
(TARGET=ORCL) -- oracle 클라이언트의 tnsnames.ora에 등록한 alias명
(TX_MODE=GLOBAL)
-- MOF = Oralce 서버로 접근되는 Alias 명
## HOST = TIBERO 서버의 IP, gw4orcl 이 기동되어야 하는 서버의 IP
## PORT = tbgw.cfg에 명시된 Port를 통해서 tnsnames.ora에 전달됨
## TARGET = DBLINK 이름, tnsnames.ora와 연결됨
)
)
[tibero@T1:/tibero/tbgateway]$ ls -l
total 37000
-rwxr-xr-x 1 tibero dba 37885400 Aug 23 11:10 gw4orcl
drwxr-xr-x 4 tibero dba 31 Aug 23 11:02 oracle
[tibero@T1:/tibero/tbgateway]$ ldd gw4orcl
-- not found 나오면 .profile의 LIBPATH가 제대로 설정되어있는지 확인해볼 것.
linux-vdso.so.1 => (0x00007ffc161e1000)
libclntsh.so.19.1 => /tibero/instantclient_19_16/libclntsh.so.19.1 (0x00007f20b344b000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f20b322b000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f20b300f000)
libm.so.6 => /lib64/libm.so.6 (0x00007f20b2d0d000)
libc.so.6 => /lib64/libc.so.6 (0x00007f20b2949000)
libnnz19.so => /tibero/instantclient_19_16/libnnz19.so (0x00007f20b22d5000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f20b20bc000)
librt.so.1 => /lib64/librt.so.1 (0x00007f20b1eb3000)
libaio.so.1 => /lib64/libaio.so.1 (0x00007f20b1cb1000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f20b1a97000)
/lib64/ld-linux-x86-64.so.2 (0x000055e1959d7000)
libclntshcore.so.19.1 => /tibero/instantclient_19_16/libclntshcore.so.19.1 (0x00007f20b14f2000)
[tibero@T1://tibero/tbgateway]$ ./gw4orcl -- 게이트웨이 실행
[tibero@T1://tibero/tbgateway]$ ps -ef | grep gw4orcl
tibero 12690 1 0 00:35 ? 00:00:00 ./gw4orcl
tibero 12714 2105 0 00:35 pts/0 00:00:00 grep --color=auto gw4orcl
(+)리눅스의 프로세스 아이디 pid와 프로세스 죽이기
[tibero@T1:/tibero/tbgateway]$ tbsql edu/edu@MOF -- 오라클 유저로 접속
-- 게이트웨이는 오라클과 접속하기 때문에 테스트 시 오라클 유저로 접속하게 된다.
================================================
[tibero@T1:/tibero/tbgateway]$ tbsql edu/edu@MOF
tbSQL 7
TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
TBR-2131: Generic I/O error. -- 게이트웨이가 실행되지 않거나 죽음
================================================
[tibero@T1:/tibero/tbgateway]$ tbsql edu/edu@MOF
tbSQL 7
TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
TBR-130092:(ORA-12541) TNS:no listener
================================================
[tibero@T1:/tibero/tbgateway]$ tbsql edu/edu@MOF
tbSQL 7
TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
Connected to ORACLE GATEWAY using MOF.
dblink생성은 로컬에서 진행한다. 오라클 원격DB에서는 접속만 확인하는 거지 여기서 뭘 하려고 하면 안된다.
유저 생성과 권한 부여
$ tbsql sys/tibero
SQL> create user mofdb identified by 'mofdb';
User 'MOFDB' created.
SQL> grant connect, resource to mofdb; -- 권한 부여
SQL> grant create database link to mofdb; -- DB 생성 권한 부여
SQL> conn mofdb/mofdb -- mofdb유저로 접속
SQL> create database link oralink connect to edu identified by 'edu' using 'MOF';
Database Link 'ORALINK' created.
SQL> col owner for a10
SQL> col db_link for a10
SQL> col username for a10
SQL> col host for a10
SQL> col created for a15
SQL> select * from user_db_links; -- DB link 확인
OWNER DB_LINK USERNAME HOST CREATED
---------- ---------- ---------- ---------- ---------------
MOFDB ORALINK EDU MOF 2022/08/23
SQL> SELECT COUNT(*) FROM EMP@ORALINK; -- 원격 DB의 emp테이블 row 수
COUNT(*)
----------
14
SQL> LS TABLE -- 테이블 조회
이것은 리스너 실습이다.
티베로 입장에서는 같은 곳에 떠있는 것...? 그렇게 느낀다고 한다.
테이블과 데이터를 각각 따로 가져오는 경우 (AS 사용하지 않음)
SQL>
-- EMP 테이블 생성
CREATE TABLE EMP
(EMPNO NUMBER(4) NOT NULL,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7, 2),
COMM NUMBER(7, 2),
DEPTNO NUMBER(2));
Table 'EMP' created.
-- DEPT 테이블 생성
SQL>
CREATE TABLE DEPT
(DEPTNO NUMBER(2),
DNAME VARCHAR2(14),
LOC VARCHAR2(13) );
Table 'DEPT' created.
-- 테이블 확인
SQL> LS TABLE
NAME SUBNAME TYPE
---------------------------------- ------------------------ --------------------
DEPT TABLE
EMP TABLE
-- 원격DB에서 데이터 집어넣기
SQL> INSERT INTO EMP SELECT * FROM EMP@ORALINK;
SQL> SELECT * FROM EMP;
-- 데이터 확인하고 커밋
SQL> COMMIT;
SQL> INSERT INTO DEPT SELECT * FROM DEPT@ORALINK;
SQL> SELECT * FROM DEPT;
-- 데이터 확인하고 커밋
SQL> COMMIT;
DB Link를 이용하여 원격지 DB의 table과 join해보자.
🍽 문제 🍽
local db의 MOFDB 유저가 소유하고 있는 사원테이블(EMP)의 사원 정보와
remote db의 EDU 유저가 소유하고 있는 부서테이블(DEPT)의 부서 정보를 이용해서
사원명, 부서명을 출력하시오.
SELECT E.ENAME, D.DNAME
FROM EMP E, DEPT@ORALINK D
WHERE E.DEPTNO=D.DEPTNO;
-- 쿼리 결과
ENAME DNAME
---------- ----------------------------
SMITH RESEARCH
ALLEN SALES
WARD SALES
JONES RESEARCH
MARTIN SALES
BLAKE SALES
CLARK ACCOUNTING
SCOTT RESEARCH
KING ACCOUNTING
TURNER SALES
ADAMS RESEARCH
JAMES SALES
FORD RESEARCH
MILLER ACCOUNTING
14 rows selected.
TIP
- netstat -tlpn 네트워크상태 확인
이미지 자료 출처
- 충남대학교 티베로 DB 엔지니어링 교육 강사 자료
- 티베로 공식문서
자세한 설명 너무 감사합니다