[Tibero] DB Link (Tibero to Oracle)

suRan·2022년 8월 23일
3

🐱‍🐉 티베로

목록 보기
6/8

DB Link

알아두자!
오라클 쪽은 신경쓸 필요가 없다.
이미 구동 중이고 리스너가 떠있다. 언제든지 접속해서 쿼리를 실행할 수 있다.
왼쪽 로컬 티베로만 세팅하면 된다.

모든 요청은 tbsql(Client API)을 통해서만 진행된다.
tbsql이 인스턴스에게 전달 -> 게이트 웨이에게 전달 -> 오라클 클라이언트에게 전달

세 가지 설정이 되어있어야 원활한 연결이 가능하다

  1. Tibero Instance
    • 1번 -> 2번이 원활하게 진행되기 위해서는 tbdsn.tbr이 설정되어있어야한다.
    • 인스턴스가 이 정보를 보고 게이트웨이를 식별해서 (?)쪽으로 전달한다.
      즉, 게이트웨이와 동일한 포트로 접속을 시도한다.
    • DSN : 데이터 원본 이름. 데이터베이스에 대한 정보가 들어있는 데이터 구조. 데이터베이스에 연결하기 위해 필요하다. (그림에서는 yanghoon이다. 그림에서 설정한 alias)
      💫 DBLink 생성 시 USING절에 들어가는 이름과 일치해야한다. 그럼 조회 시 HOST 항목에 뜨게 된다. (게이트웨이에 접속하기 위한 접속정보)
  1. TBGW

    • tbgw.cfg는 게이트웨이의 구동과 관련있다. 게이트웨이가 시작할 때 cfg파일의 내용을 보고 구동된다.
    • 게이트웨이가 9998을 리스닝하도록 하라 -> 게이트웨이는 9998을 리스닝한다.
  2. 오라클 인스턴트 클라이언트(tnsnames.ora)

    • 오라클 클라이언트 접속 정보 -> tbdsn.tbr 파일에서 사용된다.
      서로 정보가 일치해야 한다.
    • 클라이언트가 오라클을 식별하기 위해 사용된다. 티베로에서 사용하는 게 아니라 oracle인스턴트 클라이언트가 사용한다 (다운받은 압축파일)
    • HOST 의 ip가 오라클의 IP임
    • 디렉토리의 파일을 설정해야?? 인스턴트 클라이언트가 서버에 접속할 수 있다.

빨간 표시는 중요하기 때문에 표시된 거임

(+)리스너 방식

  • 리스너 방식은 1개의 게이트웨이 프로세스를 미리 띄워 한 개의 게이트웨이만을 이용하여 디비링크를 사용한다.
  • 디비 링크를 사용하는 클라이언트가 많을 경우에는 로컬방식보다는 리스너방식이 효율적이다
  • 디비 링크를 사용하였던 세션이 종료되더라도 프로세스는 계속해서 기동되어 있는 것이 특징

Tibero to Orcle

오라클 클라이언트 설치

  $ 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

tbgw.cfg 생성(원래 없음)

  $ 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

오라클용 게이트웨이 복사

  • gw4orcl: 오라클용 티베로 게이트웨이. 이것이 오라클 클라이언트 인스턴트를 사용해서 오라클 인스턴스와 연결할 수 있도록 함. 그 과정에서 오라클의 환경변수가 필요하기 때문에 ~/.bash_profile에 내용을 추가해준다.
    $ 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

Oracle instance Client에 대한 환경 설정 등록 (.profile)

  • ~/.bash_profile에 내용 추가
    $ 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
  • bash_profile을 쓰는 자는 누구인가?
    • 게이트웨이
    • 오라클 클라이언트

Oracle instance Client에 tnsnames.ora 설정

  • 게이트 웨이가 오라클에 접속하기 위한 접속 정보
  • Oracle instance Client에는 기본적으로 netwokr/admin/tnsnames.ora 파일이 없다.
    디렉토리 생성 후 진행
    [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파일을 이용해서 동작하는데, 리눅스의 특정 경로에 들어있기도 하고 암튼 여기저기 다 있음

tbdsn.tbr 설정

    $ 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와 연결됨
        )
    )

gw4orcl ldd 확인

  • ldd 명령어 : gateway 관련 library에 대한 link가 정상적으로 이루어지고 있는지 점검해보는 리눅스 명령어
    [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)

(리스너방식)gw4orcl 게이트웨이 기동 후 tbsql 이용하여 링크 상태 확인

  • 리스너 방식으로 디비 링크를 구축할 때는 반드시 사전에 gw4orcl 게이트웨이를 기동시킨 후 사용해야 한다
  • gw4orcl 게이트웨이를 기동시키지 않거나, 기동중인 게이트웨이 프로세스를 죽이게 되면 DB 링크를 이용할 수 없다(I/O error발생).
[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와 프로세스 죽이기

< tbsql <--> gateway <--> oracle 구간 테스트 >

[tibero@T1:/tibero/tbgateway]$ tbsql edu/edu@MOF -- 오라클 유저로 접속
-- 게이트웨이는 오라클과 접속하기 때문에 테스트 시 오라클 유저로 접속하게 된다.
  • (+) quit는 게이트웨이와 sql의 접속 끊기

================================================

tbsql <--> gateway(X) <--> oracle(X) 일때

[tibero@T1:/tibero/tbgateway]$ tbsql edu/edu@MOF

tbSQL 7

TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.

TBR-2131: Generic I/O error. -- 게이트웨이가 실행되지 않거나 죽음

================================================

tbsql <--> gateway(O) <--> oracle(X) 일때

[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

================================================

tbsql <--> gateway(O) <--> oracle(O) 일때

[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에서는 접속만 확인하는 거지 여기서 뭘 하려고 하면 안된다.

TIBERO tbsql테스트의 의미

  • (2번 - 3번 까지 구간에 대한 테스트)
  • 데이터베이스 생성 전에 진행하는 테스트
  • TBGW와 OracleClient, 즉 게이트웨이와 오라클에 문제가 없다는 것을 의미한다.
    여기가 문제없이 진행되면 이제 남은 세팅은 1번과 2번 사이 밖에 남지 않음(티베로 인스턴스와 게이트웨이)

유저 생성과 권한 부여

  • 로컬 티베로에 접속한다.
  • sys유저로 접속해서 mofdb유저 생성
  • connect, resource 권한을 부여해주고 dblink 생성 권한도 부여
$ 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 엔지니어링 교육 강사 자료
  • 티베로 공식문서
profile
개발 공부를 해라

1개의 댓글

comment-user-thumbnail
2024년 1월 24일

자세한 설명 너무 감사합니다

답글 달기