# DBLink 안내서

## DB Link 소개 <a href="#id-1-db-link" id="id-1-db-link"></a>

본 장에서는 DB Link의 기본적인 개념과 장,단점에 대해서 설명합니다.

### 개요 <a href="#bookmark1" id="bookmark1"></a>

DB Link는 현재의 데이터베이스에서 네트워크상의 다른 데이터베이스에 접속하기 위해 접속 설정을 정의하는 객 체입니다.

### DB Link 장, 단점 <a href="#bookmark2" id="bookmark2"></a>

* **장점**
  * 분산된 데이터를 다루기 편리합니다.
  * 데이터베이스에 한번만 접속해도 Link를 통해 다른 데이터베이스에 간편히 접속할 수 있습니다.<br>
* **단점**
  * Link를 통해 접속된 데이터베이스의 세션과 Lock이 증가할 수 있으므로 실시간 트랜잭션이 많은 시스템 에서 장애가 발생할 수 있습니다.
  * 배치작업과 같은 큰 트랜잭션을 DB Link를 통해 직접 작업할 경우 장애 발생 가능성이 증가합니다.&#x20;
  * DB 운영자의 경우 데이터베이스간 DB Link에 대해 사용현황 관리가 필요합니다.
  * 장애가 발생할 경우 개발, 시스템 운영, 네트워크, DB 업무 담당자간 확인이 필요합니다.
  * Long Type, CLOB, BLOB 타입을 Link를 통해 DML 작업할 경우 오류가 발생할 가능성이 있습니다.

{% hint style="info" %}
**참고:** Link 사용을 지양하며, AP에서 각각 별도로 처리하는 것을 권장합니다.
{% endhint %}

## Tibero to Tibero <a href="#id-2-tibero-to-tibero" id="id-2-tibero-to-tibero"></a>

본 장에서는 Tibero와 Tibero 간의 DB Link 생성 방법을 설명합니다.

### Tibero to Tibero DB Link <a href="#bookmark4" id="bookmark4"></a>

#### 제약사항 <a href="#id-2.1.1" id="id-2.1.1"></a>

다음은 Tibero 간의 호환성에 대한 설명입니다.

* Source에 해당하는 Tibero에서 Target에 해당하는 Tibero에 연결할 수 없다면 Link 구성을 할 수 없습니다.

#### Tibero 클라이언트 설정 <a href="#id-2.1.2.-tibero" id="id-2.1.2.-tibero"></a>

접속하려는 Tibero(Tibero\_A라고 함)의 IP 주소, 포트 번호, DB NAME 내용을 확인하고, DB Link를 생성할 Tibero(Tibero\_B라고 함)의 네트워크 설정 파일(tbdsn.tbr)에 설정합니다.

Tibero\_A는 설정이 필요없고, Tibero\_B가 설치되어 있는 서버의 tbdsn.tbr 파일을 아래와 같이 설정합니다.

```
# Tibero_B 정보
tibero=(
    (INSTANCE=(HOST=localhost)
              (PORT=5555)
              (DB_NAME=tibero)
          )
)

# 접속할 Tibero_A의 정보 추가 설정
tibero_a=(
          (INSTANCE=(HOST=192.168.1.121) 
                    (PORT=4444)
                    (DB_NAME=tibero)
          )
)
```

#### 대상 서버 연결 확인 <a href="#id-2.1.3" id="id-2.1.3"></a>

다음과 같이 실행해서 Tibero\_B Instance에 tbdsn.tbr 파일의 설정을 확인합니다.

* 접속하려는 Tibero(Tibero\_A)로 접속한 것을 볼 수 있습니다.

```
$ tbsql sys/tibero@tibero_a

tbSQL 7

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

Connected to Tibero using tibero_a.
```

```
SQL> select * from v$instance;

INSTANCE_NUMBER     INSTANCE_NAME     DB_NAME    HOST_NAME    PARALLEL    THREAD# VERSION    
STARTUP_TIME STATUS      SHUTDOWN_PENDING TIP_FILE
-----------------    ------------    ----------    ---------    -------    ----------------
---------------------    ----------------------------------
        0 tibero       tibero        dqa-optane1        NO        0 7
2023/06/12        NORMAL        NO
/hdd/home/sampler22/tibero7/config/tibero.tip


1 row selected.
```

### DB Link 생성 및 사용 <a href="#bookmark5" id="bookmark5"></a>

Tibero to Tibero DB Link를 생성할 계정(Tibero\_B)으로 접속하여 DB Link 생성 작업을 수행합니다.

#### tbsql에 접속하여 DB Link Object 생성 <a href="#id-2.2.1.-tbsql-db-link-object" id="id-2.2.1.-tbsql-db-link-object"></a>

아래와 같은 문법을 사용하여 DB Link Object를 생성합니다.

```
SQL> create database link < DB LINK명 > connect to < 접속 사용자 ID > identified by < 접속 패스워드 >
    2 using < 접속에 사용할 alias >;
```

<table data-header-hidden><thead><tr><th width="221"></th><th></th></tr></thead><tbody><tr><td><strong>항목</strong></td><td><strong>설명</strong></td></tr><tr><td>&#x3C; DB LINK명 ></td><td>생성할 DB Link Object 이름이다.</td></tr><tr><td>&#x3C; 접속 사용자 ID ></td><td>대상 DB 서버에 접속할 사용자 이름이다.</td></tr><tr><td>&#x3C; 접속 패스워드 ></td><td>대상 DB 서버에 접속할 패스워드이다.</td></tr><tr><td>&#x3C; 접속에 사용할 alias ></td><td>Source DB의 tbdsn.tbr에 설정된 Alias 이름이다.</td></tr></tbody></table>

다음은 tbsql에 접속하여 DB Link Object 생성에 대한 예입니다.

```
$ tbsql tibero/tmax

tbSQL 7

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

Connected to Tibero.

SQL> create database link T7LINK connect to tibero identified by 'tmax'
    2 using 'tibero_a';

Database Link 'T7LINK' created.
```

{% hint style="info" %}
**참고**

DB Link를 생성하기 위해서는 CREATE DATABASE LINK 또는 CREATE PUBLIC DATABASE LINK 권한이 필요합니다.
{% endhint %}

#### SQL 실행 <a href="#id-2.2.2.-sql" id="id-2.2.2.-sql"></a>

생성이 완료되면 아래와 같이 < @Link명 >을 붙여 사용합니다.

```
SQL> CONN tibero/tmax 
Connected to Tibero.

SQL> ls


NAME		                    SUBNAME		  TYPE
--------------------------------    ------------------    -------------------
T7LINK			                                  DATABASE LINK	

SQL> select * from dual@T7LINK;


DUMMY				
-------
X				

1 row selected.
```

사용 중인 Link의 이름으로 알 수 없는 경우 다음과 같이 View를 조회합니다.

```
SQL> select * from user_db_links;

OWNER    DB_LINK   USERNAME  HOST      CREATED
-------  --------  --------  -----     ----------
TIBERO   T7LINK	   TIBERO    tibero_a  2023/06/14	

1 row selected.		
```

## Tibero to Oracle <a href="#id-3-tibero-to-oracle" id="id-3-tibero-to-oracle"></a>

본 장에서는 Tibero에서 DB Link Object를 만들어 Oracle의 데이터를 가져오는 방법을 설명합니다.

### 개요 <a href="#bookmark7" id="bookmark7"></a>

DB Link를 통해 질의를 수행할 때 DB Link 대상이 Tibero가 아닌 다른 DBMS라면 각각의 DBMS를 위한 Gateway를 통해 DB Link를 생성하거나 수행할 수 있습니다.<br>

#### Gateway <a href="#id-3.1.1.-gateway" id="id-3.1.1.-gateway"></a>

Tibero 서버는 다른 DBMS에 필요한 질의를 해당 Gateway에 전달하고, Gateway는 다른 DBMS에 접속하여 Tibero 서버로부터 전달 받은 질의를 수행한 후 결과를 Tibero 서버로 전송합니다. 다른 DBMS의 DB Link 기능을 사 용하려는 경우 해당 DBMS에 대한 Gateway 바이너리와 환경설정 파일이 필요합니다.

**\[그림 3.1] Tibero to Oracle 구조도**

![](https://3002067511-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFs24KfxvLw5zUUqFROUN%2Fuploads%2Fa81LBevUXnTdKNqquGBf%2F1.jpeg?alt=media)

#### Gateway 디렉터리 구조 <a href="#id-3.1.2.-gateway" id="id-3.1.2.-gateway"></a>

Gateway는 기본적으로 TBGW\_HOME 환경변수를 통해 설정 파일을 읽고 로그 파일을 기록합니다. TBGW\_HOME 환경변수가 설정되어 있지 않은 경우 디폴트 값은 '$TB\_HOME/client/gateway'입니다. Gateway가 사용하는 설정 파일과 로그 파일이 존재하는 디렉터리 구조는 다음과 같습니다.

```
$TBGW_HOME
    +-- < DBMS Vender명 >
        |-- config
            |-- tbgw.cfg
        |-- log
            |-- Log File
[/yuha/t7/gateway]$ cd $TBGW_HOME 
[/yuha/t7/gateway]$ pwd
/yuha/t7/gateway
[/yuha/t7/gateway]$ tree -F
.
├── gw4orcl*
└── oracle/
    ├── config/
    └── log/

3 directories, 1 file
```

다음은 디렉터리와 파일의 설명입니다.

* **< DBMS Vender명 >/config**\
  Gateway 설정 파일이 생성되는 위치입니다.\
  다음은 해당 디렉터리에 있는 파일의 설명입니다.

<table data-header-hidden><thead><tr><th width="135"></th><th></th></tr></thead><tbody><tr><td><strong>파일</strong></td><td><strong>설명</strong></td></tr><tr><td>tbgw.cfg</td><td>Gateway 설정 파일로, 사용자가 Gateway와 관련된 설정값을 변경하는 경우 생성한다.</td></tr></tbody></table>

* **< DBMS Vender명 >/log**\
  Gateway와 관련된 로그 파일이 생성되는 위치입니다.

#### 확인사항 <a href="#id-3.1.3" id="id-3.1.3"></a>

Tibero to Oracle DB Link를 구성하는 경우 다음의 사항을 확인합니다.&#x20;

* **기본 바이너리 위치**&#x20;
  * Gateway for Oracle 바이너리 파일은 Tibero 버전 및 OS에 따라 위치 및 파일명이 다릅니다.
  * Tibero 6 이하 버전에서는 oracle과의 dblink를 위한 gw4orcl 바이너리가 oracle 버전에 따라 나누어져 있었는데, Tibero 7 부터는 gw4orcl 바이너리로 통합되었습니다.

<table data-header-hidden><thead><tr><th width="165"></th><th width="138"></th><th></th></tr></thead><tbody><tr><td><strong>Tibero 버전</strong></td><td><strong>OS</strong></td><td><strong>위치 및 파일명</strong></td></tr><tr><td>Tibero 7</td><td>Unix 계열</td><td>$TB_HOME/client/bin/gw4orcl</td></tr></tbody></table>

&#x20;        내부적으로 Oracle 클라이언트 라이브러리를 사용합니다. <br>

* **Oracle 클라이언트 라이브러리**
  * Gateway for Oracle인 경우 내부적으로 Oracle 클라이언트 라이브러리를 사용하여 Oracle에 접속합니다. (Oracle 서버 바이너리 안에 있는 라이브러리, Instant 클라이언트 라이브러리도 가능)
  * Gateway가 설치된 곳에 Oracle 클라이언트 라이브러리가 존재해야 합니다.
  * Oracle 클라이언트 라이브러리가 Oracle 서버에 연결되지 않는다면 DB Link 역시 연결될 수 없습니다.

#### 제약사항 <a href="#id-3.1.4" id="id-3.1.4"></a>

* LONG RAW, NCLOB을 지원하지 않습니다.
* LOB, LONG의 경우 아래와 같은 형태를 일부 지원합니다.
  * insert into (local) \~ select from (dblink)
  * insert into (dblink) \~ select from (local)
* Multi Threaded Agent를 지원하지 않습니다.
* DB Link를 통한 UDF(User Defined Function) 사용은 PSM(=PL/SQL) 내부에서 가능합니다.
  * Select 절에 직접적으로 DB Link를 통한 UDF 사용은 지원하지 않습니다.
  * PSM(=PL/SQL) 내부에서 DB Link UDF를 사용하고 해당 PSM을 Select 절에서 간접 사용하는 구조는 가능합니다.

### Gateway for Oracle 설정 <a href="#bookmark8" id="bookmark8"></a>

본 절에서는 Gateway for Oracle의 구성 방식과 설정 방법에 대해서 설명합니다.

Gateway for Oracle은 다음의 방식으로 구성합니다.

* **Local 방식**\
  Gateway를 미리 기동하지 않고 DB Link를 사용할 경우 Gateway 프로세스가 기동되는 방식으로, Tibero 서 버와 Gateway for Oracle이 동일 서버에 존재할 경우에 Local 방식으로 구성이 가능합니다.<br>
* **Listener 방식**\
  Gateway를 미리 기동해서 Listening하는 방식으로 모든 경우에 설정이 가능합니다.<br>

#### Gateway 설정(UNIX 계열) <a href="#id-3.2.1.-gateway-unix" id="id-3.2.1.-gateway-unix"></a>

Local 또는 Listener 방식 중 하나의 방식을 선택하여 설정합니다.

설정이 다른 경우 개별적으로 설명하며 동일할 경우는 구분하지 않고 제목에 '공통'이라는 문구를 사용합니다.

다음은 UNIX 계열에서 Gateway를 설정하는 과정입니다.

1. profile 설정(공통)
2. Oracle 라이브러리 관련 권한 변경(공통)
3. Gateway 바이너리 복사(공통)
4. Network Alias 설정
5. Gateway 환경설정(공통)
6. DB Link 생성 및 확인

각 과정에 대한 상세한 설명은 해당 절의 내용을 참고합니다.<br>

**Local 방식**

1. **profile 설정(공통)**\
   Gateway for Oracle이 기동되는 사용자의 OS 환경 파일(.profile, .bash\_profile 등)에 다음과 같이 환경변수를 설정합니다.

* **설정 방법**

```
export TBGW_HOME=$TB_HOME/client/gateway 
export ORACLE_HOME=<Oracle Home>
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH 
export ORACLE_SID=<Oracle SID>
export PATH=$ORACLE_HOME/bin:$PATH
```

* **설정 예**

```
# Gateway for Oracle 19c
export TBGW_HOME=/yuha/t7/gateway
export ORACLE_HOME=/yuha/oracle/ORA19/app/oracle/product/19.0.0/db_1 
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export ORACLE_SID=oracle19
export PATH=$ORACLE_HOME/bin:$PATH
```

{% hint style="warning" %}
**주의**

1. Local 방식의 경우, Tibero 서버가 기동하기 전에 위 환경변수 설정을 가지고 기동이 되어야 합니다. 만약, 환경변수 설정 및 Local 방식을 새롭게 구성한다면 Tibero 서버 재기동이 필요하며 재기동이 힘들다면 Listener 방식을 고려합니다.
2. OS에 맞게 환경변수 LD\_LIBRARY\_PATH(Linux), LIBPATH(AIX)를 설정합니다. &#x20;
3. TBGW\_HOME은 Tibero 바이너리 폴더 밖으로 설정할 것을 권장합니다. &#x20;

```
$ echo $TB_HOME
/yuha/t7/tibero7

$ echo $TBGW_HOME
/yuha/t7/gateway
```

{% endhint %}

2. **Oracle 라이브러리 관련 권한 변경(공통)**\
   Oracle 라이브러리를 설치한 사용자 또는 root 계정에서 다음과 같이 권한을 부여합니다.

```
chmod o+rx $HOME
chmod o+rx $ORACLE_HOME 
chmod o+rx $ORACLE_HOME/lib 
chmod o+r $ORACLE_HOME/lib/* 
chmod o+rx $ORACLE_HOME/bin
chmod o+rx $ORACLE_HOME/bin/sqlplus 
chmod o+x $ORACLE_HOME/network
chmod o+x $ORACLE_HOME/network/admin
chmod o+r $ORACLE_HOME/network/admin/tnsnames.ora
```

3. **Gateway 바이너리 복사(공통)**\
   지정된 경로에 바이너리 복사를 수행합니다.

* **설정 방법**

```
$ mkdir $TBGW_HOME
$ cp <Gateway Binary명> $TBGW_HOME/gw4orcl
$ chmod u+x $TBGW_HOME/gw4orcl
```

* **설정 예**

```
$ mkdir $TBGW_HOME
$ cp $TB_HOME/client/bin/gw4orcl $TBGW_HOME/gw4orcl
$ chmod u+x $TBGW_HOME/gw4orcl

$ cd $TBGW_HOME

$ ls 
gw4orcl
```

{% hint style="warning" %}
**주의**

profile 설정과 라이브러리 권한을 설정한 후 ldd gw4orcl를 수행했을 때 Oracle 라이브러리에 대해 서 not found 부분이 없어야 합니다.
{% endhint %}

```
$ ldd gw4orcl
    linux-vdso.so.1 => (0x00007fff1e1ee000) 
    libclntsh.so.19.1 =>
/yuha/oracle/ORA19/app/oracle/product/19.0.0/db_1/lib/libclntsh.so.19.1
(0x00007f3c88537000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f3c88333000) 
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f3c88117000) 
    libm.so.6 => /lib64/libm.so.6 (0x00007f3c87e15000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f3c87a47000) 
    libnnz19.so =>
/yuha/oracle/ORA19/app/oracle/product/19.0.0/db_1/lib/libnnz19.so
(0x00007f3c872ff000)
    libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f3c870e5000) 
    librt.so.1 => /lib64/librt.so.1 (0x00007f3c86edd000) 
    libaio.so.1 => /lib64/libaio.so.1 (0x00007f3c86cdb000) 
    libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f3c86ac1000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f3c8c545000) 
    libclntshcore.so.19.1 =>
/yuha/oracle/ORA19/app/oracle/product/19.0.0/db_1/lib/libclntshcore.so.19.1 
(0x00007f3c86521000)
```

4. **Network Alias 설정**\
   Tibero 클라이언트의 Network Alias 설정 파일에 Gateway 정보를 설정합니다.\
   Network Alias 설정 파일명은 Tibero 버전에 따라 각각 다음과 같습니다.

**Tibero 7 : $TB\_HOME/client/config/tbdsn.tbr**&#x20;

* **tbdsn.tbr 설정 방법**

```
<Gateway 
    Alias명>=( (GATEWAY=
        (PROGRAM=<Gateway Binary 경로 및 파일명>)
        (TARGET=<tnsnames.ora에 설정된 Alias>) 
        (TX_MODE={GLOBAL | LOCAL})
    )
)
```

<table data-header-hidden><thead><tr><th width="157"></th><th></th></tr></thead><tbody><tr><td><strong>항목</strong></td><td><strong>설명</strong></td></tr><tr><td>PROGRAM</td><td>Gateway 바이너리(gw4orcl)의 경로를 반드시 절대 경로로 입력한다.</td></tr><tr><td>TARGET</td><td>Oracle 클라이언트의 tnsnames.ora에 설정한 Alias 이름으로 대소문자 수준까지 일치해야 하며, 단위 테스트로 sqlplus를 이용해 해당 Alias로 접속이 되는지 확인한 다.</td></tr><tr><td>TX_MODE</td><td><p>처리 방식을 글로벌 트랜잭션(Global Transaction)과 로컬 트랜잭션(Local Transaction) 중에서 설정한다. Commit을 요청할 경우 글로벌 트랜잭션만 Two- phaseCommit으로 동작한다.</p><p>TX_MODE의 값은 처리 여부에 따라 다음과 같이 설정할 수 있다.</p><ul><li>GLOBAL : 글로벌 트랜잭션인 경우 설정값이다.</li><li>LOCAL : 로컬 트랜잭션인 경우 설정값이다.</li></ul></td></tr></tbody></table>

* **TARGET 항목에 대한 접속 확인 방법**\
  TARGET에 입력 값을 sqlplus의 Alias로 작성하여 접속이 되어야 합니다.

```
[/yuha/t7/tibero7/client/config]$ sqlplus tibero/tmax@ORCL

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Jun 14 14:56:07 2023
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle. All rights reserved.

Last Successful login time: Wed Jun 14 2023 14:55:11 +09:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production 
Version 19.3.0.0.0

SQL>
```

* **tbdsn.tbr 설정 예**

```
# gateway for oracle 
# local
gw_local=(
        (GATEWAY=
                (PROGRAM=/yuha/t7/gateway/gw4orcl) 
                (TARGET=ORCL)
                (TX_MODE=GLOBAL)
        )
)
```

5. **Gateway 환경설정(공통)**\
   tbgw\.cfg 파일에 초기화 파라미터의 설정값을 명시함으로써 Gateway와 관련된 설정을 변경할 수 있습니다.\
   Gateway를 설치한 서버에서 $TBGW\_HOME/oracle/config/tbgw\.cfg 파일을 설정합니다.

* **설정 방법**

```
LOG_DIR = <log-dir> 
LOG_LVL = <log_lvl>
MAX_LOG_SIZE = <max-log-size> 
MAX_LOG_BAKCUP_SIZE = <max-log-backup-size> 
FETCH_SIZE = <fetch-size>
SKIP_CHAR_CONV = <skip-char-conv>
```

<table data-header-hidden><thead><tr><th width="224"></th><th></th></tr></thead><tbody><tr><td><strong>항목</strong></td><td><strong>설명</strong></td></tr><tr><td>LOG_DIR</td><td>로그가 생성될 디렉터리이다. (기본값: $TBGW_HOME의 log 폴더)</td></tr><tr><td>LOG_LVL</td><td><p>로그레벨을 설정한다. (기본값 : 2)</p><p>0-6 까지 설정 가능하며 높을수록 많은 로그를 생성한다.</p><ul><li>운영인 경우 : 1 또는 2를 설정한다.</li><li>문제 대응인 경우 : 5 또는 6을 설정한다.</li></ul></td></tr><tr><td>MAX_LOG_SIZE</td><td>로그 파일의 최대 크기를 설정한다. (단위 : Byte)</td></tr><tr><td>MAX_LOG_BAKCUP_SIZE</td><td><p>백업 폴더의 최대 크기를 설정한다.</p><p>백업 폴더의 크기가 MAX_LOG_BACKUP_SIZE보다 커지면 오래된 파 일 순으로 약 1/3 가량의 백업 파일이 삭제된다.</p><p>백업이 이루어지는 시점은 2가지 경우가 있다.</p><ul><li>로그를 쓰려 할 때 쓰고 있던 로그 파일 크기가 MAX_LOG_SIZE보 다 크다는 것이 감지될 때</li><li>로그 파일을 쓰던 세션이 종료될 때</li></ul></td></tr><tr><td>FETCH_SIZE</td><td><p>fetch일 경우 사용하는 사이즈로 최대 64KB이다. (기본값 : 32K)</p><p>대용량 fetch일 경우 설정값을 높이면 네트워크 부하를 줄일 수 있다.</p></td></tr><tr><td>SKIP_CHAR_CONV</td><td><p></p><p>일반적으로 해당 설정은 필요하지 않으며 특수한 상황(US7ASCII 캐 릭터 셋에 한글이 들어있는 경우)에만 적용한다.</p><ul><li>Y : Gateway가 Oracle로부터 데이터를 받아올 때 환경변수 NLS_LANG을 사용하고 전달받은 데이터를 그대로 Tibero 서버에 보 낸다.</li><li>N : Tibero에서 사용하는 캐릭터 셋에 맞추어 Oracle 서버에 데이터 요청을 한다. 이럴경우 Oracle에서 해당 캐릭터 셋에 맞게 처리하여 Gateway로 데이터를 보낸다. (기본값)</li></ul></td></tr></tbody></table>

* **설정 예**&#x20;

```
$ cd $TBGW_HOME/oracle/config

$ vi tbgw.cfg 
LOG_DIR=/yuha/t7/gateway/oracle/log 
LOG_LVL=2
MAX_LOG_SIZE=502400000
```

6. **DB Link 생성 및 확인**\
   DB Link 생성 방법은 Local과 Listener 방식이 동일합니다.\
   Local 방식에서는 Gateway 프로세스의 기동이 필요하지 않습니다.\
   다음은 DB Link 생성과 확인 방법에 대한 설명입니다.

* **DB Link 생성 방법**

```
create database link <DB Link명> connect to <user명> identified by '<password>' 
using '<Network Alias명>';
```

Link를 생성할 경우 권한 에러가 발생하면 아래와 같은 권한을 부여합니다.

```
GRANT CREATE DATABASE LINK TO USER_NAME;
GRANT CREATE PUBLIC DATABASE LINK TO USER_NAME;
```

* **DB Link 생성 예**

```
$ tbsql tibero/tmax

tbSQL 7

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

Connected to Tibero.

SQL> create database link T7LINK connect to tibero identified by 'tmax'
    2 using 'gw_local';
    
Database Link 'T7LINK' created.
```

* **DB Link 생성 확인 예**\
  DB Link 생성을 확인할 때 select문을 'Table명@< DB Link명 >'으로 설정하면 DB Link를 사용할 수 있습니다.

```
$ tbsql tibero/tmax

tbSQL 7

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


Connected to Tibero.
SQL> select * from dual@T7LINK;

DUMMY
-------
X

1 row selected.
```

* **DB Link 이용하여 Oracle의 Table 조회 예**\
  Oracle 에 Table 생성 후 생성한 Database Link 를 이용하여 조회하는 예시입니다.\
  Oracle 에 test 테이블을 생성합니다.

```
$ sqlplus tibero/tmax

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Jun 14 16:01:10 2023
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle. All rights reserved.

Last Successful login time: Wed Jun 14 2023 15:58:11 +09:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production 
Version 19.3.0.0.0

SQL> create table test(c1 number);

Table created.

SQL> insert into test values(100);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from test;

        C1
------------
        100
```

Tibero 에서 생성한 Database Link (T7LINK) 이용하여 데이터를 조회, 삽입할 수 있습니다.

```
$ tbsql tibero/tmax

tbSQL 7

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

Connected to Tibero.

SQL> select * from test@T7LINK;

    C1
--------
    100
    
1 row selected.

SQL> insert into test@T7LINK values(200);

row inserted.

SQL> commit;

Commit completed.

SQL> select * from test@T7LINK;

    C1
--------
    100
    200
    
2 rows selected.
```

**Listener 방식**

1. **profile 설정(공통)**

Gateway for Oracle이 기동되는 사용자의 OS 환경 파일(.profile, .bash\_profile 등)에 다음과 같이 환경변수를 설정합니다.

* **설정 방법**

```
export TBGW_HOME=$TB_HOME/client/gateway 
export ORACLE_HOME=<Oracle Home>
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH 
export ORACLE_SID=<Oracle SID>
export PATH=$ORACLE_HOME/bin:$PATH
```

* **설정 예**

```
# Gateway for Oracle 19c
export TBGW_HOME=/yuha/t7/gateway
export ORACLE_HOME=/yuha/oracle/ORA19/app/oracle/product/19.0.0/db_1 
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export ORACLE_SID=oracle19
export PATH=$ORACLE_HOME/bin:$PATH
```

{% hint style="warning" %}
**주의**

1. Local 방식의 경우, Tibero 서버가 기동하기 전에 위 환경변수 설정을 가지고 기동이 되어야 합니다. 만약, 환경변수 설정 및 Local 방식을 새롭게 구성한다면 Tibero 서버 재기동이 필요하며 재기동이 힘들다면 Listener 방식을 고려합니다.
2. OS에 맞게 환경변수 LD\_LIBRARY\_PATH(Linux), LIBPATH(AIX)를 설정합니다.
3. TBGW\_HOME은 Tibero 바이너리 폴더 밖으로 설정할 것을 권장합니다.

```
$ echo $TB_HOME
/yuha/t7/tibero7

$ echo $TBGW_HOME
/yuha/t7/gateway
```

{% endhint %}

2. **Oracle 라이브러리 관련 권한 변경(공통)**

Oracle 라이브러리를 설치한 사용자 또는 root 계정에서 다음과 같이 권한을 부여합니다.

```
chmod o+rx $HOME
chmod o+rx $ORACLE_HOME 
chmod o+rx $ORACLE_HOME/lib 
chmod o+r $ORACLE_HOME/lib/* 
chmod o+rx $ORACLE_HOME/bin
chmod o+rx $ORACLE_HOME/bin/sqlplus 
chmod o+x $ORACLE_HOME/network
chmod o+x $ORACLE_HOME/network/admin
chmod o+r $ORACLE_HOME/network/admin/tnsnames.ora
```

3. **Gateway 바이너리 복사(공통)**

지정된 경로에 바이너리 복사를 수행합니다.&#x20;

* **설정 방법**

```
$ mkdir $TBGW_HOME
$ cp <Gateway Binary명> $TBGW_HOME/gw4orcl
$ chmod u+x $TBGW_HOME/gw4orcl
```

* **설정 예**

```
$ mkdir $TBGW_HOME
$ cp $TB_HOME/client/bin/gw4orcl $TBGW_HOME/gw4orcl
$ chmod u+x $TBGW_HOME/gw4orcl

$ cd $TBGW_HOME

$ ls 
gw4orcl
```

{% hint style="warning" %}
**주의**

profile 설정과 라이브러리 권한을 설정한 후 ldd gw4orcl를 수행했을 때 Oracle 라이브러리에 대해 서 not found 부분이 없어야 합니다.&#x20;
{% endhint %}

```
$ ldd gw4orcl
        linux-vdso.so.1 => (0x00007fff1e1ee000) 
        libclntsh.so.19.1 =>
/yuha/oracle/ORA19/app/oracle/product/19.0.0/db_1/lib/libclntsh.so.19.1 
(0x00007f3c88537000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f3c88333000) 
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f3c88117000) 
        libm.so.6 => /lib64/libm.so.6 (0x00007f3c87e15000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f3c87a47000) 
        libnnz19.so =>
/yuha/oracle/ORA19/app/oracle/product/19.0.0/db_1/lib/libnnz19.so 
(0x00007f3c872ff000)
        libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f3c870e5000) 
        librt.so.1 => /lib64/librt.so.1 (0x00007f3c86edd000) 
        libaio.so.1 => /lib64/libaio.so.1 (0x00007f3c86cdb000) 
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f3c86ac1000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f3c8c545000)
        libclntshcore.so.19.1 =>
/yuha/oracle/ORA19/app/oracle/product/19.0.0/db_1/lib/libclntshcore.so.19.1 
(0x00007f3c86521000)
```

4. **Network Alias 설정**

Tibero 클라이언트의 Network Alias 설정 파일에 Gateway 정보를 설정합니다.

Network Alias 설정 파일명은 Tibero 버전에 따라 각각 다음과 같습니다.

Tibero 7 : $TB\_HOME/client/config/tbdsn.tbr&#x20;

* **tbdsn.tbr 설정 방법**

```
<Gateway 
    Alias명>=( (GATEWAY=
        (LISTENER=
            (HOST=<Gateway IP>) 
            (PORT=<Gateway PORT>)
        )
        (TARGET=<tnsnames.ora에 설정된 Alias>) 
        (TX_MODE= {GLOBAL | LOCAL })
    )
)
```

<table data-header-hidden><thead><tr><th width="188"></th><th></th></tr></thead><tbody><tr><td><strong>항목</strong></td><td><strong>설명</strong></td></tr><tr><td>LISTENER</td><td><p>Listener가 기동되어 있는 서버에 대한 정보를 입력한다.</p><ul><li>HOST : Gateway가 기동되어 있는 서버 IP 주소이다.</li><li>PORT : Gateway가 Listening 하는 포트 번호이다. (기본값 : 9999)</li></ul></td></tr><tr><td>TARGET</td><td>Oracle 클라이언트의 tnsnames.ora에 설정한 Alias 이름으로 대소문자 수준까지 일 치해야 하며, 단위 테스트로 sqlplus를 이용해 해당 Alias로 접속이 되는지 확인한다.</td></tr><tr><td>TX_MODE</td><td><p>처리 방식을 글로벌 트랜잭션(Global Transaction)과 로컬 트랜잭션(Local Transaction) 중에서 설정한다. Commit을 요청할 경우 글로벌 트랜잭션만 Two- phaseCommit으로 동작한다.</p><p>TX_MODE의 값은 처리 여부에 따라 다음과 같이 설정할 수 있다.</p><ul><li>GLOBAL : 글로벌 트랜잭션인 경우 설정값이다.</li><li>LOCAL : 로컬 트랜잭션인 경우 설정값이다.</li></ul></td></tr></tbody></table>

* **TARGET 항목에 대한 접속 확인 방법**\
  TARGET에 입력 값을 sqlplus의 Alias로 작성하여 접속이 되어야 합니다.

```
[/yuha/t7/tibero7/client/config]$ sqlplus tibero/tmax@ORCL

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Jun 14 14:56:07 2023
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle. All rights reserved.
Last Successful login time: Wed Jun 14 2023 14:55:11 +09:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production 
Version 19.3.0.0.0

SQL>
```

* **tbdsn.tbr 설정 예**

```
# gateway for oracle 
# listener 
gw_listen=(
        (GATEWAY=
                (LISTENER=
                        (HOST=192.168.17.24) 
                        (PORT=9999)
                ) 
                (TARGET=ORCL)
                (TX_MODE=GLOBAL)
        )
)
```

5. **Gateway 환경설정(공통)**\
   tbgw\.cfg 파일에 초기화 파라미터의 설정값을 명시함으로써 Gateway와 관련된 설정을 변경할 수 있습니다. Gateway를 설치한 서버에서 $TBGW\_HOME/oracle/config/tbgw\.cfg 파일을 설정합니다.

* **설정 방법**

```
LISTENER_PORT = <port-no> 
LOG_DIR = <log-dir> 
LOG_LVL = <log_lvl>
MAX_LOG_SIZE = <max-log-size> 
MAX_LOG_BAKCUP_SIZE = <max-log-backup-size> 
FETCH_SIZE = <fetch-size>
SKIP_CHAR_CONV = <skip-char-conv>
```

<table data-header-hidden><thead><tr><th width="242"></th><th></th></tr></thead><tbody><tr><td><strong>항목</strong></td><td><strong>설명</strong></td></tr><tr><td>LISTENER_PORT</td><td>Listening 포트 번호로 로컬방식의 경우 필요하지 않다. (기본값 : 9999)</td></tr><tr><td>LOG_DIR</td><td>로그가 생성될 디렉터리이다. (기본값: $TBGW_HOME의 log 폴더)</td></tr><tr><td>LOG_LVL</td><td><p>로그레벨을 설정한다. (기본값 : 2)</p><p>0-6 까지 설정 가능하며 높을수록 많은 로그를 생성한다.</p><ul><li>운영인 경우 : 1 또는 2를 설정한다.</li><li>문제 대응인 경우 : 5 또는 6을 설정한다.</li></ul></td></tr><tr><td>MAX_LOG_SIZE</td><td>로그 파일의 최대 크기를 설정한다. (단위 : Byte)</td></tr></tbody></table>

<table data-header-hidden><thead><tr><th width="244"></th><th></th></tr></thead><tbody><tr><td>MAX_LOG_BAKCUP_SIZE</td><td><p>백업 폴더의 최대 크기를 설정한다.</p><p>백업 폴더의 크기가 MAX_LOG_BACKUP_SIZE보다 커지면 오래된 파 일 순으로 약 1/3 가량의 백업 파일이 삭제된다.</p><p>백업이 이루어지는 시점은 2가지 경우가 있다.</p><ul><li>로그를 쓰려 할 때 쓰고 있던 로그 파일 크기가 MAX_LOG_SIZE보 다 크다는 것이 감지될 때</li><li>로그 파일을 쓰던 세션이 종료될 때</li></ul></td></tr><tr><td>FETCH_SIZE</td><td><p>fetch일 경우 사용하는 사이즈로 최대 64KB이다. (기본값 : 32K)</p><p>대용량 fetch일 경우 설정값을 높이면 네트워크 부하를 줄일 수 있다.</p></td></tr><tr><td>SKIP_CHAR_CONV</td><td><p>일반적으로 해당 설정은 필요하지 않으며 특수한 상황(US7ASCII 캐 릭터 셋에 한글이 들어있는 경우)에만 적용한다.</p><ul><li>Y : Gateway가 Oracle로부터 데이터를 받아올 때 환경변수 NLS_LANG을 사용하고 전달받은 데이터를 그대로 Tibero 서버에 보 낸다.</li><li>N : Tibero에서 사용하는 캐릭터 셋에 맞추어 Oracle 서버에 데이터 요청을 한다. 이럴경우 Oracle에서 해당 캐릭터 셋에 맞게 처리하여 Gateway로 데이터를 보낸다. (기본값)</li></ul></td></tr></tbody></table>

* **설정 예**

```
$ cd $TBGW_HOME/oracle/config

$ vi tbgw.cfg 
LISTENER_PORT=9999
LOG_DIR=/yuha/t7/gateway/oracle/log 
LOG_LVL=2
MAX_LOG_SIZE=502400000
```

6. **DB Link 생성 및 확인**\
   DB Link 생성 방법은 Local과 Listener 방식이 동일합니다. 단, Listener 방식은 먼저 Gateway 프로세스의 기동이 필요합니다. Listener 방식에서 Gateway 프로세스의 기동 방법은 다음과 같습니다.

```
$ ./gw4orcl
```

다음과 같이 Gateway 프로세스 기동 후, gw4orcl 프로세스가 기동된 것을 확인할 수 있습니다.

```
$ ps -ef |grep gw4orcl

t7     15840 12233 0 15:35 pts/2  00:00:00 grep --color=auto gw4orcl

$ ./gw4orcl

$ ps -ef |grep gw4orcl
t7    15844     1 1 15:35 ?        00:00:00 ./gw4orcl
t7    15857 12233 0 15:35 pts/2    00:00:00 grep --color=auto gw4orcl
```

다음은 지정 포트 번호가 9999일 경우, Listening 포트 번호를 확인하는 예제입니다.

```
$ netstat -na |grep 9999
tcp         0 0 0.0.0.0:9999    0.0.0.0:*    LISTEN
```

다음은 DB Link 생성과 확인 방법에 대한 설명입니다.

* **DB Link 생성 예**

```
$ tbsql tibero/tmax

tbSQL 7

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

Connected to Tibero.

SQL> create database link T7LINK connect to tibero identified by 'tmax'
    2 using 'gw_listen';
    
Database Link 'T7LINK' created.
```

* **DB Link 생성 확인 예**

DB Link 생성을 확인할 때 select 문을 'Table명@< DB Link명 >'으로 설정하면 DB Link를 사용할 수 있습니다.&#x20;

```
$ tbsql tibero/tmax

tbSQL 7

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

Connected to Tibero.

SQL> select * from dual@T7LINK;

DUMMY
-----
X

1 row selected.
```

### Oracle 클라이언트 <a href="#bookmark9" id="bookmark9"></a>

본 절에서는 Oracle 서버와 클라이언트 호환성 확인과 Instant 클라이언트 설정 방법에 대해서 설명합니다.

#### 호환성 확인 <a href="#id-3.3.1" id="id-3.3.1"></a>

Tibero to Oracle DB Link의 경우 Gateway가 내부적으로 Oracle 클라이언트를 사용하므로 Oracle 클라이언트와 서버가 호환되지 않으면 DB Link를 연결할 수 없습니다.

아래의 호환성 도표를 참고하여 연결 가능 여부를 확인합니다.

**\[그림 3.2] Oracle 서버와 클라이언트 호환성 도표**

<figure><img src="https://3002067511-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFs24KfxvLw5zUUqFROUN%2Fuploads%2FkkYYdIrAFJUCXwARRl7k%2Fimage.png?alt=media&#x26;token=443589f2-1390-49b8-90c5-b4e4cc90935a" alt=""><figcaption></figcaption></figure>

#### Instant 클라이언트 설정 <a href="#id-3.3.2.-instant" id="id-3.3.2.-instant"></a>

Gateway for Oracle의 경우 내부적으로 Oracle 클라이언트 라이브러리 또는 서버 라이브러리를 이용하여 Oracle에 연결합니다.

Oracle 클라이언트 또는 서버를 설치하기가 어려운 경우 Instant 클라이언트를 이용한 DB Link 설정이 가능합니다. 다음은 Oracle Instant 클라이언트를 설정하는 과정에 대한 설명입니다.

1. Instant 클라이언트 다운로드 및 압축 해제
2. profile 설정
3. tnsnames.ora 생성 및 설정
4. Network Alias 설정(UNIX 계열 참고)
5. Gateway 환경설정(UNIX 계열 참고)
6. DB Link 생성 및 확인(UNIX 계열 참고)

각 과정에 대한 상세한 설명은 해당 절의 내용을 참고합니다.

4\~6 과정은 3.2.1.1 과 3.2.1.2의 과정과 동일하여 참고하여 진행합니다.

1. **Instant 클라이언트 다운로드 및 압축 해제**

Oracle 홈페이지 접속한 후 Gateway가 설치된 서버의 OS와 bit에 맞는 Instant 클라이언트를 다운로드하여 압축을 해제합니다.

다음은 Linux 버전의 실행 결과입니다.

```
$ unzip instantclient-basic-linux.x64-19.16.0.0.0dbru.zip 
Archive: instantclient-basic-linux.x64-19.16.0.0.0dbru.zip
    inflating: instantclient_19_16/adrci 
    inflating: instantclient_19_16/BASIC_LICENSE 
    inflating: instantclient_19_16/BASIC_README 
    inflating: instantclient_19_16/genezi
    inflating: instantclient_19_16/libclntshcore.so.19.1
        linking: instantclient_19_16/libclntsh.so -> libclntsh.so.19.1 
        linking: instantclient_19_16/libclntsh.so.10.1 -> libclntsh.so.19.1 
        linking: instantclient_19_16/libclntsh.so.11.1 -> libclntsh.so.19.1 
        linking: instantclient_19_16/libclntsh.so.12.1 -> libclntsh.so.19.1 
        linking: instantclient_19_16/libclntsh.so.18.1 -> libclntsh.so.19.1
inflating: instantclient_19_16/libclntsh.so.19.1
inflating: instantclient_19_16/libipc1.so inflating: i
nstantclient_19_16/libmql1.so inflating: 
instantclient_19_16/libnnz19.so
    linking: instantclient_19_16/libocci.so -> libocci.so.19.1 
    linking: instantclient_19_16/libocci.so.10.1 -> libocci.so.19.1 
    linking: instantclient_19_16/libocci.so.11.1 -> libocci.so.19.1 
    linking: instantclient_19_16/libocci.so.12.1 -> libocci.so.19.1 
    linking: instantclient_19_16/libocci.so.18.1 -> libocci.so.19.1
inflating: instantclient_19_16/libocci.so.19.1 
inflating: instantclient_19_16/libociei.so 
inflating: instantclient_19_16/libocijdbc19.so 
inflating: instantclient_19_16/liboramysql19.so
    creating: instantclient_19_16/network/ 
inflating: instantclient_19_16/ojdbc8.jar 
inflating: instantclient_19_16/ucp.jar 
inflating: instantclient_19_16/uidrvci 
inflating: instantclient_19_16/xstreams.jar
    creating: instantclient_19_16/network/admin/ 
inflating: instantclient_19_16/network/admin/README
finishing deferred symbolic links: 
    instantclient_19_16/libclntsh.so -> libclntsh.so.19.1 
    instantclient_19_16/libclntsh.so.10.1 -> libclntsh.so.19.1 
    instantclient_19_16/libclntsh.so.11.1 -> libclntsh.so.19.1 
    instantclient_19_16/libclntsh.so.12.1 -> libclntsh.so.19.1 
    instantclient_19_16/libclntsh.so.18.1 -> libclntsh.so.19.1 
    instantclient_19_16/libocci.so -> libocci.so.19.1 
    instantclient_19_16/libocci.so.10.1 -> libocci.so.19.1 
    instantclient_19_16/libocci.so.11.1 -> libocci.so.19.1 
    instantclient_19_16/libocci.so.12.1 -> libocci.so.19.1 
    instantclient_19_16/libocci.so.18.1 -> libocci.so.19.1
```

2. **Profile 설정**

다음은 profile 설정 예입니다. TNS\_ADMIN의 경우 tnsnames.ora 파일의 위치를 설정합니다.

```
# Instanct client
export TBGW_HOME=/yuha/t7/gateway
export ORACLE_HOME=/yuha/t7/instantclient_19_16 
export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH 
export PATH=.:$ORACLE_HOME:$PATH
export TNS_ADMIN=$ORACLE_HOME
```

{% hint style="warning" %}
**주의**

1. LD\_LIBRARY\_PATH 설정에 해당 경로의 모든 라이브러리가 존재하므로 $ORACLE\_HOME의 설정에 주의 한다.
2. OS에 맞게 환경변수 LD\_LIBRARY\_PATH(Linux), LIBPATH(AIX)를 설정한다.
3. profile 설정 후 ldd gw4orcl를 수행했을 때 Oracle 라이브러리에 대해서 not found 부분이 없어야 한다.\
   $ ldd gw4orcl

```
$ ldd gw4orcl
        linux-vdso.so.1 => (0x00007ffd9d59b000)
        libclntsh.so.19.1 => /yuha/t7/instantclient_19_16/libclntsh.so.19.1 
(0x00007f4b5b99a000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f4b5b796000) 
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4b5b57a000) 
        libm.so.6 => /lib64/libm.so.6 (0x00007f4b5b278000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f4b5aeaa000) 
        libnnz19.so => /yuha/t7/instantclient_19_16/libnnz19.so
(0x00007f4b5a836000)
        libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f4b5a61c000) 
        librt.so.1 => /lib64/librt.so.1 (0x00007f4b5a414000) 
        libaio.so.1 => /lib64/libaio.so.1 (0x00007f4b5a212000) 
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f4b59ff8000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f4b5fab5000) 
        libclntshcore.so.19.1 =>
/yuha/t7/instantclient_19_16/libclntshcore.so.19.1 (0x00007f4b59a54000)
```

{% endhint %}

3. **tnsnames.ora 생성 및 설정**

$TNS\_ADMIN으로 설정된 경로에 tnsnames.ora 파일을 생성합니다.

* **설정 방법**

```
$ cd $TNS_ADMIN
$ vi tnsnames.ora
<Alias명> =
    (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = <Oracle 서버 접속 IP>)
        (PORT = <Oracle 서버 접속 Port>))
        (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = <Oracle 서버의 SID>)
    )
)
```

<table data-header-hidden><thead><tr><th width="213"></th><th></th></tr></thead><tbody><tr><td><strong>항목</strong></td><td><strong>설명</strong></td></tr><tr><td>&#x3C; Alias명 ></td><td>tbdsn.tbr 설정의 TARGET 부분과 대소문자 수준까지 일치해야 한다.</td></tr><tr><td>ADDRESS</td><td><p>대상 Oracle에 대한 접속 정보를 설정한다.</p><ul><li>PROTOCOL : 프로토콜을 설정한다.</li><li>HOST : 대상 ORACLE 서버의 접속 IP 주소 정보이다.</li><li>PORT : 대상 ORACLE 서버의 접속 포트 번호 정보이다.</li></ul></td></tr><tr><td>CONNECT_DATA</td><td><p>대상 Oracle 서버의 연결 방식 및 SID를 설정한다.</p><ul><li>SERVER : 서버의 연결 방식이다.</li><li>SERVICE_NAME : 대상 ORACLE 서버의 SID 이다.</li></ul></td></tr></tbody></table>

* **설정 예**\
  다음은 Oracle 19c에 해당하는 설정으로 각 Oracle 버전마다 문법이 일부 달라질 수 있습니다.\
  만약 $TNS\_ADMIN으로 경로를 설정하지 않았다면, 기본 경로는 "ORACLE\_HOME/network/admin" 입니다.

```
$ cd $TNS_ADMIN

$ cat tnsnames.ora 
ORCL =
    (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.17.24)(PORT = 1521)) 
        (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = oracle19)
    )
)
```

### 문제 해결 <a href="#bookmark10" id="bookmark10"></a>

#### 데이터 조회 <a href="#id-3.4.1" id="id-3.4.1"></a>

**글자 깨짐 현상**

DB Link를 통하여 Oracle의 데이터를 조회할 때 글자가 깨지는 현상이 발생합니다.

다음은 글자 깨짐 현상이 발생할 때 확인해야 할 항목을 나타내는 그림으로 상황에 맞게 각 항목의 적절한 설정이 필요합니다.

**\[그림 3.3] 글자 깨짐 현상이 발생할 경우 확인 요소**

![](https://3002067511-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFs24KfxvLw5zUUqFROUN%2Fuploads%2FqiWWcZc7mJpyBMP7A3z1%2F3.jpeg?alt=media)

* **클라이언트 환경 (1)**
  * **터미널창으로 접속하여 tbsql을 통해 확인할 경우**\
    OS 언어 설정(LANG, LC\_ALL 등), 접속하는 SSH 또는 텔넷의 언어 설정, TB\_NLS\_LANG 환경변수 값을 확인합니다.
  * **클라이언트 Tool을 사용하여 확인할 경우**

<table data-header-hidden><thead><tr><th width="263"></th><th></th></tr></thead><tbody><tr><td><strong>구분</strong></td><td><strong>설명</strong></td></tr><tr><td>Tibero Studio 를 사용하는 경우</td><td>접속할 때 지정하는 캐릭터 셋 설정 확인이 필요하다. 만약, 미지정의 경우 접속하는 Tibero 서버의 캐릭터 셋으로 설정된다.</td></tr><tr><td><p>ODBC를 사용할 경우</p><p>(Orange for Tibero 등)</p></td><td>TB_NLS_LANG 환경변수 값을 확인한다.</td></tr></tbody></table>

* **Tibero 캐릭터 셋 (2)**\
  Oracle 캐릭터 셋이 Tibero에서 호환이 되는 캐릭터 셋인지 확인합니다.\
  예를 들어 Tibero의 캐릭터 셋이 MSWIN949(한글), Oracle 캐릭터 셋이 JA16SJIS(일본어)일 경우 호환되지 않습니다.<br>
* **Gateway (3)**\
  Gateway는 Oracle에서 Tibero로 데이터를 가지고 올 때 아래와 같은 2개의 환경변수의 영향을 받습니다.

<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>환경변수</strong></td><td><strong>설명</strong></td></tr><tr><td>TB_NLS_LANG</td><td>Gateway에서 Tibero로 접속할 때 영향을 받는다.</td></tr><tr><td>NLS_LANG</td><td>Gateway에서 Oracle로 접속할 때 영향을 받는다.</td></tr></tbody></table>

{% hint style="info" %}
**참고**

Tibero6 이하의 TB\_NLS\_LANG의 기본값은 MSWIN949(한글)이므로 Tibero의 환경이 한글이 아닌 다른 환 경일 경우 TB\_NLS\_LANG 설정을 고려합니다.

Tibero7 의 TB\_NLS\_LANG의 기본값은 UTF8입니다.
{% endhint %}

* &#x20;**Oracle (4)**\
  Oracle 자체에서 깨진 글자가 아닌지 확인합니다.

### Tibero7 의 gw\_install.sh 수행 <a href="#bookmark11" id="bookmark11"></a>

Tibero7 에서 gw4orcl 로 Gateway 바이너리가 통합되며 $TB\_HOME/client/bin 에 gw\_install.sh 스크립트가 추가 되었습니다.

gw\_install.sh 수행 시, $TBGW\_HOME와 하위 폴더가 자동으로 생성되어 설정됩니다.

```
$ sh gw_install.sh
Configuring gateway environment for tibero to oracle... 
TBGW_HOME is /yuha/t7/gateway.
Gateway configuration file is created in /yuha/t7/gateway/oracle/config. Check the file, 
and add or rewrite options if you want.
Gateway install is done.
```

```
$ cd $TBGW_HOME

$ tree -f
.
└── ./oracle
    ├── ./oracle/config
    │ └── ./oracle/config/tbgw.cfg
    ├── ./oracle/lib
    │ └── ./oracle/lib/libclntsh.so.19.1 ->
/yuha/oracle/ORA19/app/oracle/product/19.0.0/db_1/lib/libclntsh.so
    └── ./oracle/log
    
4 directories, 2 files
```

ldd gw4orcl 확인할 수 있습니다.

```
$ pwd
/yuha/t7/tibero7/client/bin

$ ldd gw4orcl
    linux-vdso.so.1 => (0x00007fffd65df000)
    libclntsh.so.19.1 =>
/yuha/oracle/ORA19/app/oracle/product/19.0.0/db_1/lib/libclntsh.so.19.1 
(0x00007f055e271000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f055e06d000) 
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f055de51000) 
    libm.so.6 => /lib64/libm.so.6 (0x00007f055db4f000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f055d781000)
    libnnz19.so => /yuha/oracle/ORA19/app/oracle/product/19.0.0/db_1/lib/libnnz19.so 
(0x00007f055d039000)
    libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f055ce1f000)
    librt.so.1 => /lib64/librt.so.1 (0x00007f055cc17000) 
    libaio.so.1 => /lib64/libaio.so.1 (0x00007f055ca15000) 
    libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f055c7fb000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f056227f000)
    libclntshcore.so.19.1 =>
/yuha/oracle/ORA19/app/oracle/product/19.0.0/db_1/lib/libclntshcore.so.19.1 
(0x00007f055c25b000)
```

아래와 같이 접속을 확인할 수 있습니다.

```
$ tbsql tibero/tmax@gw_listen

tbSQL 7

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

Connected to using gw_listen.

SQL> select * from dual;

DUMMY
------
X

1 row selected.
```

## Oracle to Tibero <a href="#id-4-oracle-to-tibero" id="id-4-oracle-to-tibero"></a>

본 장에서는 Oracle에서 DB Link Object를 만들어 Tibero의 데이터를 가져오는 DB Link 생성을 설명합니다.

### 개요 <a href="#bookmark13" id="bookmark13"></a>

Oracle에서는 이기종 분산 데이터베이스 환경에서 Non-Oracle 시스템 데이터에 접근하기 위해 Heterogeneous Services(HS)와 Database Gateway(DG) 모듈을 지원하고 있으며, 해당 모듈과 타 DB의 Generic ODBC Driver 연동작업을 통해 DB Link를 생성할 수 있습니다.

{% hint style="info" %}
**참고**

Oracle Gateway 는 이기종간 서비스(Heterogeneous Connectivity)에 의해 Oracle SQL 을 Non-Oracle 시스템의 적절한 언어로 변환하는 기능과 Non-Oracle 시스템의 메타데이터를 로컬 서식에서 나타내는 데이터 딕셔너리 변 환의 2 가지 종류의 변환이 제공됩니다.

변환을 사용할 수 없는 경우에는 Pass-Through 기능을 사용해 Oracle 이외의 시스템에 시스템 고유의 SQL 문을 실 행할 수 있습니다.

Pass-Through 이란, Oracle Database 에서 해석 없이 non-oracle 시스템으로 직접 SQL 을 보낼 수 있는 기능입니다.

DBMS\_HS\_PASSTHROUGH 패키지를 사용해서 이기종 DB 고유의 커멘드나 문장을 어플리케이션 또는 Oracle 서 버에서 이기종 데이터베이스로 전달 가능합니다.
{% endhint %}

**\[그림 4.1] Oracle to Tibero 구조도**

![](https://3002067511-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFs24KfxvLw5zUUqFROUN%2Fuploads%2Ft49xqBPbH0m9JzRzDCBN%2F4.jpeg?alt=media)

#### Oracle Gateway <a href="#id-4.1.1.-oracle-gateway" id="id-4.1.1.-oracle-gateway"></a>

Oracle 버전에 따라 사용하는 Gateway가 다르며 Oracle to Tibero의 경우 Oracle에서 제공하는 Gateway를 이용합니다.

Oracle 10g 이하 버전에서는 HSODBC를 이용하며, Oracle 11g 이상 버전부터는 DG4ODBC를 사용합니다.

<table data-header-hidden><thead><tr><th width="217"></th><th></th></tr></thead><tbody><tr><td><strong>분류</strong></td><td><strong>설명</strong></td></tr><tr><td>HSODBC</td><td>Oracle 10g에서 사용한다. Oracle 10g 클라이언트 바이너리에는 존재하지 않으며 Oracle 10g 서버 바이너리에만 존재한다.</td></tr><tr><td>DG4ODBC</td><td>Oracle 11g 이상에서 사용한다. Oracle 11g 이상 클라이언트 바이너리에는 존재하지 않으며 Oracle 11g 이상 Gateway 바이너리 또는 Oracle 11g 이상 서버 바이너리에 존재한다.</td></tr></tbody></table>

{% hint style="info" %}
**참고**

여러 개의 Oracle Database Gateway를 설치할 경우, 제품 구성요소를 Oracle Database Gateway for ODBC로 선택합니다.
{% endhint %}

**제약사항**

다음은 Oracle에서 제공하는 Gateway인 HSODBC와 DG4ODBC의 제약사항입니다.

Databse Gateway for ODBC Limitations

* BLOB/CLOB data cannot be read through pass-through queries
* Updates or deletes that include unsupported functions within a WHEREclause are not allowed
* &#x20;Stored procedures are not supported
* Cannot participate in distributed transactions
* they support single-sitetransactions only.Gateways are an integral component of the overall hetero geneous connectivity solution. Specifically, they provide: SQL and Data Dictionary Translation infor mation
* Datatype Translation&#x20;
* Callback link is not supported &#x20;

{% hint style="info" %}
**참고**

위 내용은 Oracle에 대한 제약 사항으로 Tibero 제약사항은 아닙니다. 내용의 자세한 설명은 Oracle 홈 페이지([http://www.oracle.com](http://www.oracle.com/))를 참고합니다.
{% endhint %}

#### DB Link 연결방식 <a href="#id-4.1.2.-db-link" id="id-4.1.2.-db-link"></a>

연결방식은 OS에 따라 다릅니다.&#x20;

<table data-header-hidden><thead><tr><th width="165"></th><th></th></tr></thead><tbody><tr><td><strong>분류</strong></td><td><strong>설명</strong></td></tr><tr><td>UNIX 계열</td><td><p>아래 2가지 방법이 가능하다.</p><ul><li>HSODBC(10g) 또는 DG4ODBC(11g 이상)에서 Tibero ODBC Driver 직접 연결 방식의 경우, 별도의 Manager 설치가 필요하지 않다.</li><li>Driver Manager 사용 연결방식 또는 iodbc, unixodbc 사용의 경우, 별도의 Manager 설치가 필요하다.</li></ul></td></tr></tbody></table>

### DB Link 설정 <a href="#bookmark14" id="bookmark14"></a>

Tibero ODBC Driver 직접 연결방식의 경우 Oracle to Tibero 호출 흐름은 다음과 같습니다.

Oracle 서버와 Gateway 서버가 분리될 경우 다음의 설정으로 수행되지만 분리되지 않는다면 모든 설정을 Oracle서버에서 합니다.

**\[그림 4.2] Oracle to Tibero 호출 흐름**

![](https://3002067511-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFs24KfxvLw5zUUqFROUN%2Fuploads%2F0myCMjb1qUDaergLwWup%2F5.jpeg?alt=media)

1. create database \~ using 문구를 수행한다.
2. tnsnames.ora 파일의 Alias명의 SID를 찾는다.
3. listener.ora 파일에서 SID를 찾아서 다음 단계를 수행한다.
4. init{sid}.ora 파일의 설정 정보를 읽어온다.
5. tbdsn.tbr로 Tibero 서버를 찾는다.

#### UNIX 계열 (Linux 포함) <a href="#id-4.2.1.-unix-linux" id="id-4.2.1.-unix-linux"></a>

다음은 UNIX 계열에서 DB Link 를 설정하는 과정입니다.

1. 사전확인 및 준비사항
2. Tibero 클라이언트 설치
3. tnsnames.ora 설정
4. Listener 설정 및 기동
5. Oracle Gateway 환경설정(init\<DSN>.ora)
6. DB Link 생성 및 확인

각 과정에 대한 상세한 설명은 해당 절의 내용을 참고합니다.

1. **사전확인 및 준비사항**\
   \
   다음과 같은 사항들을 확인 및 준비합니다.

* **Oracle Gateway 설치 여부 확인**\
  다음과 같이 조회하여 파일 사이즈가 0보다 크면 설치된 것이고, 0으로 나온다면 설치가 되지 않은 것입니다.

```
$ ls -al $ORACLE_HOME/bin/dg4odbc
-rwxr-x--x 1 oracle dba 738168 4월 10 15:49
/yuha/oracle/ORA19/app/oracle/product/19.0.0/db_1/bin/dg4odbc
```

* **Oracle Gateway 파일의 bit 확인**\
  OS 명령어인 file 명령어를 사용하여 32bit인지 64bit인지 확인합니다.\
  다음은 Gateway 파일의 bit를 확인하는 예제이다. 실행 결과를 보면 해당 파일은 Linux 64bit인 것을 확 인할 수 있습니다.

```
$ file $ORACLE_HOME/bin/dg4odbc
/yuha/oracle/ORA19/app/oracle/product/19.0.0/db_1/bin/dg4odbc: ELF 64-bit LSB 
executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for 
GNU/Linux 2.6.32, BuildID[sha1]=05c8c6e1646c7f78af76fec4fc034f83383843f1, not 
stripped
```

{% hint style="info" %}
**참고**

1. Oracle 10g의 경우 file ORACLE\_HOME/bin/hsodbc로 조회합니다.

2. Gateway가 32bit라면 내부적으로 사용하는 Tibero ODBC Driver 역시 32bit를 사용해야 합니다. 하지만 64bit로 설치되어 있어도 해당 모듈이 32bit인 경우도 있습니다.
   {% endhint %}

3. **Tibero 클라이언트 설치**

Oracle Gateway가 설치된 서버에 설치합니다.

실제 연동을 위해서는 '$TB\_HOME/client/lib/libtbodbc.so(또는 libtbodbc.sl)'만 있어도 가능하지만 단위 테스트 및 설치의 편의성을 위하여 Tibero 클라이언트 설치를 권장합니다.

다른 사용자에게 Tibero 서버가 설치되어 있다면 권한 설정을 한 후 해당 라이브러리를 이용할 수 있습니다.

별도로 Tibero 클라이언트 바이너리가 없을 때 Tibero 서버 바이너리를 가져다가 다음과 같이 설정을 합니다. Alias 항목은 편의성을 위하여 설정한 부분으로 필요하지 않다면 설정하지 않아도 됩니다.

* **profile 설정**

```
# Oracle To Tibero DB Link Setting 
export TB_HOME=/yuha/oracle/tibero7
export LD_LIBRARY_PATH=$TB_HOME/client/lib:$LD_LIBRARY_PATH 
export PATH=$TB_HOME/client/bin:$PATH
alias nadm='cd $ORACLE_HOME/network/admin' 
alias hadm='cd $ORACLE_HOME/hs/admin'
```

{% hint style="warning" %}
**주의**

OS에 맞게 환경변수 LD\_LIBRARY\_PATH(Linux), LIBPATH(AIX)를 설정합니다.
{% endhint %}

* **tbdsn.tbr 설정**\
  $TB\_HOME/client/config/tbdsn.tbr 파일을 설정합니다.
  * **설정 방법**

```
<Alias명>=( (INSTANCE=(HOST=<Tibero 서버 IP>)
(PORT=<Tibero 서버 Port>) 
(DB_NAME=<Tibero 서버 DB명>)
)
)
```

<table data-header-hidden><thead><tr><th width="206"></th><th></th></tr></thead><tbody><tr><td><strong>항목</strong></td><td><strong>설명</strong></td></tr><tr><td>&#x3C; Alias 명></td><td>임의로 설정한다. 단, Tibero ODBC Driver 직접 연결방식의 경우 Oracle Gateway 환경설정의 HS_FDS_CONNECT_INFO 파라미터에 설정된 값과 일치 해야 한다.</td></tr><tr><td>HOST</td><td>DB Link의 경우 사용하는 Tibero 서버의 접속 IP 주소 정보이다.</td></tr><tr><td>PORT</td><td>DB Link의 경우 사용하는 Tibero 서버의 접속 포트 번호 정보이다.</td></tr><tr><td>DB_NAME</td><td>DB Link의 경우 사용하는 Tibero 서버의 접속 DB_NAME 정보이다.</td></tr></tbody></table>

* **설정 예**

```
o2t=(
    (INSTANCE=(HOST=192.168.17.24) 
                (PORT=5555
                (DB_NAME=tibero)
            )
)
```

* **Tibero 접속 테스트**\
  각 설정이 완료된 후 Alias명으로 접속해서 설정 정보를 확인합니다. \
  접속에 문제가 발생하는 경우 tbdsn.tbr 파일의 설정 정보를 확인합니다.

```
$ tbsql sys/tibero@o2t

tbSQL 7

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

Connected to VGliZXJv using o2t.
```

3. **tnsnames.ora 설정**

DB Link Object를 생성하는 Oracle 서버에서 $ORACLE\_HOME/network/admin/tnsnames.ora 파일을 설정합니다.

* **설정 방법**

```
<Alias명>=
    (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = <Gateway 서버 IP>)
        (PORT = <Gateway 서버 Port>))
        (CONNECT_DATA = (SID = <Gateway 서버 SID명>)) 
        (HS = OK)
)
```

<table data-header-hidden><thead><tr><th width="181"></th><th></th></tr></thead><tbody><tr><td><strong>항목</strong></td><td><strong>설명</strong></td></tr><tr><td>&#x3C; Alias명 ></td><td>임의로 설정한다. 단, DB Link를 생성할 때 using 절에 해당 Alias를 주어야 한 다.</td></tr><tr><td>ADDRESS</td><td><p>대상 Oracle에 대한 접속 정보를 설정한다.</p><ul><li>PROTOCOL : 프로토콜을 설정한다.</li><li>HOST : Gateway 서버의 접속 IP 주소 정보이다.</li><li>PORT : Gateway 서버의 접속 포트 번호 정보이다.</li></ul></td></tr><tr><td>CONNECT_DATA</td><td><p>대상 Oracle 서버의 SID를 설정한다.</p><p>- SID : 임의로 설정한다. 단, Gateway 서버의 listener.ora의 SID_NAME 설정 과 일치해야 한다.</p></td></tr><tr><td>HS</td><td>OK로 설정한다.</td></tr></tbody></table>

* **설정 예**

```
tb7=
    (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.17.24)(PORT = 1522))
        (CONNECT_DATA = (SID = dg4_tibero)) 
        (HS = OK)
    )
```

{% hint style="warning" %}
**주의:** 괄호가 누락되는 경우, 문제를 찾을 수 없으므로 위 문법에 주의합니다.
{% endhint %}

4. **Listener 설정 및 기동**\
   해당 설정 및 기동은 Gateway 서버에 설정합니다.\
   만약 별도로 Oracle 서버와 분리되지 않았다면 Oracle 서버에 설정합니다.

* **listener.ora 설정**\
  $ORACLE\_HOME/network/admin/listener.ora 파일을 설정합니다.<br>
  * **설정 방법**

```
<LISTENER_NAME> = 
    (ADDRESS_LIST=
        (ADDRESS=(PROTOCOL=tcp)(HOST=<Listening할 IP>)(PORT=<Listening할 Port>))
    )
    SID_LIST_<LISTENER_NAME> = 
        (SID_LIST=
            (SID_DESC=
                (SID_NAME=<Oracle 서버 SID명>) 
                (ORACLE_HOME=<Oracle 홈주소>)
                (PROGRAM= {dg4odbc | hsodbc})
            )
        )
```

<table data-header-hidden><thead><tr><th width="213"></th><th></th></tr></thead><tbody><tr><td><strong>항목</strong></td><td><strong>설명</strong></td></tr><tr><td>&#x3C; LISTENER_NAME ></td><td>임의로 설정한다. Listener를 시작하거나 종료할 때 해당 이름을 사용한다.</td></tr><tr><td>ADDRESS</td><td><p>Listening 할 정보를 설정한다.</p><ul><li>PROTOCOL : 프로토콜을 설정한다.</li><li>HOST : Listening할 IP 주소 정보이다.</li><li>PORT: Listening할 포트 번호 정보이다.</li></ul></td></tr><tr><td>SID_NAME</td><td>임의로 설정한다. 단, Oracle 서버에서 설정된 tnsnames.ora의 SID 설정 과 일치해야 한다. Oracle Gateway 설정 파일을 찾을 때 해당 이름을 사용한다.</td></tr><tr><td>ORACLE_HOME</td><td>Gateway 서버에 설치된 Oracle 홈 주소이다.</td></tr><tr><td>PROGRAM</td><td><ul><li>dg4odbc : Gateway 서버가 Oracle 11g이상일 때 설정한다.</li><li>hsodbc : Gateway 서버가 Oracle 10g일 때 설정한다.</li></ul></td></tr></tbody></table>

* **설정 예**

```
LTIBERO =
        (ADDRESS_LIST=
                (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.17.24)(PORT=1522))
        )
        
SID_LIST_LTIBERO =
        (SID_LIST=
                (SID_DESC=
                        (SID_NAME=dg4_tibero)
                        
(ORACLE_HOME=/yuha/oracle/ORA19/app/oracle/product/19.0.0/db_1)
                        (PROGRAM=dg4odbc)
                )
        )
```

* **Listener 기동**\
  listener.ora에서 설정한 LISTENER\_NAME으로 기동, 종료, 상태 정보 등을 확인할 수 있습니다.&#x20;

&#x20;**-  기동**\
Oracle to Tibero DB Link를 사용하기 위해서 Listener를 기동합니다.

```
$ lsnrctl start <listener_name>
```

다음은 LISTENER\_NAME이 LTIBERO일 경우 Listener 기동 예제입니다.

```
]$ lsnrctl start ltibero

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 15-JUN-2023 17:17:49

Copyright (c) 1991, 2019, Oracle. All rights reserved.
Starting /yuha/oracle/ORA19/app/oracle/product/19.0.0/db_1/bin/tnslsnr: please 
wait...

TNSLSNR for Linux: Version 19.0.0.0.0 - Production 
System parameter file is
/yuha/oracle/ORA19/app/oracle/product/19.0.0/db_1/network/admin/listener.ora 
Log messages written to
/yuha/oracle/ORA19/app/oracle/diag/tnslsnr/haeun/ltibero/alert/log.xml 
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.17.24) 
(PORT=1522)))

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.17.24)(PORT=1522)) 
STATUS of the LISTENER
--------------------------
Alias	                        ltibero
Version                    	TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date	                15-JUN-2023 17:17:49
Uptime	                        0 days 0 hr. 0 min. 0 sec
Trace Level	                off
Security	                ON: Local OS Authentication
SNMP	                        OFF
Listener Parameter File
/yuha/oracle/ORA19/app/oracle/product/19.0.0/db_1/network/admin/listener.ora 
Listener Log File
/yuha/oracle/ORA19/app/oracle/diag/tnslsnr/haeun/ltibero/alert/log.xml
Listening Endpoints Summary... 
    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.17.24)(PORT=1522)))
Services Summary...
Service "dg4_tibero" has 1 instance(s).
    Instance "dg4_tibero", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
```

다음은 Listening 포트 번호를 확인하는 예제입니다. \
실행 결과를 보면 포트 번호가 1522인 것을 확인할 수 있습니다.

```
$ netstat -na |grep 1522
tcp         0     0 192.168.17.24:1522    0.0.0.0:*        LISTEN
```

&#x20;**-  종료**

```
$ lsnrctl stop <listener_name>
```

```
$ lsnrctl stop ltibero

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 15-JUN-2023 16:13:05

Copyright (c) 1991, 2019, Oracle. All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.17.24)(PORT=1522))
The command completed successfully
```

&#x20;**-  상태 정보**

```
$ lsnrctl status <listener_name>
```

```
$ lsnrctl status ltibero

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 15-JUN-2023 17:18:20

Copyright (c) 1991, 2019, Oracle. All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.17.24)(PORT=1522)) 
STATUS of the LISTENER
-------------------------
Alias	                    ltibero
Version	                    TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date	            15-JUN-2023 17:18:15
Uptime	                    0 days 0 hr. 0 min. 4 sec
Trace Level	            off
Security	            ON: Local OS Authentication
SNMP	                    OFF
Listener Parameter File
/yuha/oracle/ORA19/app/oracle/product/19.0.0/db_1/network/admin/listener.ora 
Listener Log File
/yuha/oracle/ORA19/app/oracle/diag/tnslsnr/haeun/ltibero/alert/log.xml 
Listening Endpoints Summary...
    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.17.24)(PORT=1522)))
Services Summary...
Service "dg4_tibero" has 1 instance(s).
    Instance "dg4_tibero", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
```

* **tnsping 확인**\
  Listener까지 기동을 했다면 tnsping을 이용하여 단위 테스트를 합니다.\
  tnsnames.ora를 설정한 Oracle서버에서 확인하며 해당 파일의 Alias 이름을 이용하여 테스트를 수행합니다. 다음은 tnsping으로 확인하는 방법입니다.

```
$ tnsping <alias_name>
```

다음은 tnsping을 실행한 예로 결과를 보면 tnsnames.ora에서 설정한 Alias 이름이 tibero인 것을 확인할 수 있습니다.

```
$ tnsping tb7

TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 15-JUN-2023 17:18:34

Copyright (c) 1997, 2019, Oracle. All rights reserved.

Used parameter files:
/yuha/oracle/ORA19/app/oracle/product/19.0.0/db_1/network/admin/sqlnet.ora

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)
(HOST = 192.168.17.24)(PORT = 1522)) (CONNECT_DATA = (SID = dg4_tibero)) (HS = OK))
OK (0 msec)
```

5. **Oracle Gateway 환경설정 (init{DSN}.ora)**

Gateway 서버에 설정하고 '$ORACLE\_HOME/hs/admin' 디렉터리 안의 inithsodbc.ora 또는 initdg4odbc.ora 파일을 복사하여 init{DSN}.ora 파일을 생성합니다.&#x20;

````
$ pwd
/yuha/oracle/ORA19/app/oracle/product/19.0.0/db_1/hs/admin

$ ls -al |grep init
-rw-r--r-- 1 oracle dba 489 4월 17 2019 initdg4odbc.ora

만약 SID_NAME이 'dg4_tibero'일 경우 initdg4_tibero.ora 파일을 생성한다.

```shell
$ cp initdg4odbc.ora initdg4_tibero.ora
````

```
HS_FDS_CONNECT_INFO = dg4_tibero
HS_FDS_SHAREABLE_NAME = /yuha/oracle/tibero7/client/lib/libtbodbc.so
```

```
HS_FDS_CONNECT_INFO=dg4_tibero 
#HS_FDS_TRACE_LEVEL=DEBUG
# Tibero ODBC Driver 
HS_FDS_SHAREABLE_NAME=/home/ora11/tibero7/client/lib/libtbodbc.so 
# iODBC Driver Manager 
#HS_FDS_SHAREABLE_NAME=/home/ora11/iodbc/lib/libiodbc.so 
#HS_LANGUAGE=AMERICAN_AMERICA.KO16MSWIN949
#
# ODBC specific environment variables 
#
#set ODBCINI=<full path name of the odbc initilization file> 
#set ODBCINI=/home/ora11/.odbc.ini
#
# Environment variables required for the non-Oracle system 
#
#set <envvar>=<value>
#set TB_NLS_LANG=UTF8 
#set TBCLI_LOG_LVL=TRACE
```

다음은 설정 항목에 대한 설명입니다.&#x20;

* **Oracle Gateway 환경설정 항목**

<table data-header-hidden><thead><tr><th width="275"></th><th></th></tr></thead><tbody><tr><td><strong>항목</strong></td><td><strong>설명</strong></td></tr><tr><td>HS_FDS_CONNECT_INFO</td><td><p>ODBC Datasource 이름을 기술하며 연결방식에 따라 다르다. <br>(필수)</p><ul><li>Tibero ODBC Driver 직접 연결방식의 경우 : tbdsn.tbr에 설정 된 Alias명을 설정한다.</li></ul><p>만약, .odbc.ini 설정 파일이 존재하거나 tbdsn.tbr과 동일한 Alias</p><p>가 있다면 .odbc.ini 설정 파일을 먼저읽어들이므로 주의한다.</p><ul><li>Driver Manager 방식의 경우 : Datasource 이름을 설정한다.</li></ul></td></tr><tr><td>HS_FDS_SHAREABLE_NAME</td><td><p>라이브러리 경로 및 이름 지정, 연결방식에 따라 다르다. (필수)</p><ul><li>Tibero ODBC Driver 직접 연결방식의 경우 : Tibero 라이브러 리 경로 및 이름을 설정한다.</li><li>Driver Manager 방식의 경우 : 해당 Manager Driver 라이브러 리 경로 및 이름을 설정한다.</li></ul></td></tr><tr><td>HS_FDS_TRACE_LEVEL</td><td>Oracle Gateway의 로그 레벨을 설정한다. '$ORACLE_HOME/hs/log' 경로에 로그가 남는다. (선택)</td></tr><tr><td>HS_LANGUAGE</td><td>Gateway의 캐릭터 셋을 설정한다. 미설정일 때 Listener를 기동 하면 적용된 NLS_LANG의 환경변수를 따른다. (선택)</td></tr></tbody></table>

{% hint style="info" %}
**참고**\
위에서 언급한 항목들은 가장 많이 사용하는 부분이고 이외에 자세한 설명은 Oracle 홈페이지(<http://www.oracle.com>)를 참고합니다.
{% endhint %}

* **Oracle Gateway 환경변수**

<table data-header-hidden><thead><tr><th width="192"></th><th></th></tr></thead><tbody><tr><td><strong>환경변수</strong></td><td><strong>설명</strong></td></tr><tr><td>ODBCINI</td><td><p>ODBC 초기 설정 파일 위치를 지정하는 변수이다. 연결방식에 따라 다르다.</p><ul><li>Tibero ODBC Driver 직접 연결방식의 경우 : 설정이 필요하지 않다.</li><li>Driver Manager 방식의 경우 : 초기 설정 파일 위치를 지정한다.</li></ul></td></tr><tr><td>Tibero 환경 변수</td><td><p>Tibero ODBC Driver 로드일 때 전달하는 환경변수이다. <br>미설정일 때 Listener를 기동하면 적용된 Tibero의 환경변수를 따른다.</p><p>가장 많이 사용하는 환경변수는 TB_NLS_LANG, TBCLI_LOG_LVL이다.</p></td></tr></tbody></table>

6. **DB Link 생성 및 확인**

* **DB Link 생성 방법**

```
create database link <DB Link명> connect to <user명> identified by "<password>" using 
'<Network Alias명>';
```

Link를 생성할 경우 권한 에러가 발생하면 아래와 같은 권한을 부여합니다.

```
GRANT CREATE DATABASE LINK TO USER_NAME;
GRANT CREATE PUBLIC DATABASE LINK TO USER_NAME;
```

{% hint style="info" %}
**참고**

작은따옴표(' '), 큰따옴표(" ") 사용에 주의합니다.

단, < user 명>을 큰따옴표(" ")로 감싸는 것은 가능합니다.
{% endhint %}

* **DB Link 생성 예**

```
$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Thu Jun 15 17:26:24 2023
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle. All rights reserved.
```

```
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production 
Version 19.3.0.0.0

SQL> drop database link o2t_link;

Database link dropped.

SQL> create database link o2t_link connect to tibero identified by tmax using 'tb7';

Database link created.
```

* **DB Link 확인 예**\
  DB Link 생성 후 확인을 하는 경우 select 문에 'Table명@< DB Link명 >'으로 설정하면 DB Link를 사용할 수 있습니다.

```
SQL> select * from dual@o2t_link;

DUM
--- 
X
```

* **sqlplus에 접속하여 Tibero 테이블 조회 및 데이터 삽입 예**

Tibero 에서 test 테이블 생성

```
$ tbsql tibero/tmax@o2t
tbSQL 7
TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
Connected to VGliZXJv using o2t.
SQL> create table test(c1 number);
Table 'TEST' created.
SQL> insert into test values(10);
1 row inserted.
SQL> commit;
Commit completed.
```

sqlplus 접속하여 Tibero의 test 테이블 조회 및 데이터 삽입

```
$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Thu Jun 15 17:34:02 2023
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle. All rights reserved.
```

```
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production 
Version 19.3.0.0.0

SQL> select * from test@o2t_link;

        C1
----------
        10
        
SQL> insert into test@o2t_link values(20);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from test@o2t_link;

        C1
----------
        10
        20
```

### ODBC Manager 설치 <a href="#bookmark15" id="bookmark15"></a>

본 절에서는 UNIX 계열(Linux 포함)에서 iodbc 설치 및 연동하는 과정을 설명합니다.

UNIX 계열의 경우, ODBC Manager가 존재하지 않으므로 iodbc 또는 UNIX ODBC를 별도로 설치해야 합니다. \
다음은 ODBC Manager를 설치하는 과정에 대한 설명입니다.&#x20;

1. Driver Manager 설치
2. profile 설정
3. tnsnames.ora 설정(UNIX 계열 참고)
4. ODBC 환경 파일 설정 및 확인
5. Oracle Gateway 환경설정(init\<DSN>.ora)
6. DB Link 생성 및 확인(UNIX 계열 참고)

각 과정에 대한 상세한 설명은 해당 절의 내용을 참고합니다.

1. **Driver Manager 설치**\
   다음은 Driver Manager를 설치하는 과정에 대한 설명입니다.&#x20;

**1) 다운로드**

[http://iodbc.org](http://iodbc.org/)에서 다운로드 후 설치를 원하는 서버에 업로드합니다.

다음은 libiodbc-3.52.7.tar.gz 소스파일을 다운받아 서버에 설치한 결과입니다.

만약, tar 옵션의 xvzf가 적용되지 않을 경우 먼저 gunzip으로 압축을 해제한 후 tar -xvf 옵션으로 해제합니다.

```
$ tar -xvzf libiodbc-3.52.7.tar.gz

$ ls -al libiodbc-3.52.7
합계 868
drwxr-xr-x	14	oracle	dba	4096	9월	10	2009	.
drwxrwxrwx	16	oracle	dba	4096	6월	15	17:53	..
-rw-r--r--	1	oracle	dba	1038	7월	27	2005	AUTHORS
-rw-r--r--	1	oracle	dba	735	8월	30	2009	COPYING
-rw-r--r--	1	oracle	dba	66851	9월	10	2009	ChangeLog
-rw-r--r--	1	oracle	dba	1480	9월	10	2009	IAFA-PACKAGE
-rw-r--r--	1	oracle	dba	9236	2월	21	2004	INSTALL
-rw-r--r--	1	oracle	dba	735	8월	30	2009	LICENSE
-rw-r--r--	1	oracle	dba	1520	8월	30	2009	LICENSE.BSD
-rw-r--r--	1	oracle	dba	25277	1월	21	2006	LICENSE.LGPL
-rw-r--r--	1	oracle	dba	10099	9월	10	2009	Makefile.am
-rw-r--r--	1	oracle	dba	32869	9월	10	2009	Makefile.in
-rw-r--r--	1	oracle	dba	12592	9월	10	2009	NEWS
-rwxr-xr-x	1	oracle	dba	8828	9월	9	2009	PORT.OpenLink
-rw-r--r--	1	oracle	dba	11328	8월	30	2009	README
-rw-r--r--	1	oracle	dba	3193	9월	1	2009	README.CVS
-rw-r--r--	1	oracle	dba	2653	9월	10	2009	README.MACOSX
-rw-r--r--	1	oracle	dba	3949	8월	30	2009	acinclude.m4
-rw-r--r--	1	oracle	dba	37029	9월	10	2009	aclocal.m4
drwxr-xr-x	2	oracle	dba	4096	9월	10	2009	admin
drwxr-xr-x	2	oracle	dba	4096	9월	10	2009	bin
-rwxr-xr-x	1	oracle	dba	5963	8월	30	2009	bootstrap.sh
-rwxr-xr-x	1	oracle	dba	512594	9월	10	2009	configure
-rw-r--r--	1	oracle	dba	22978	9월	10	2009	configure.in
drwxr-xr-x	2	oracle	dba	4096	9월	10	2009	debian
drwxr-xr-x	4	oracle	dba	4096	9월	10	2009	drvproxy
drwxr-xr-x	2	oracle	dba	4096	9월	10	2009	etc
drwxr-xr-x	2	oracle	dba	4096	9월	10	2009	include
drwxr-xr-x	3	oracle	dba	4096	9월	10	2009	iodbc
drwxr-xr-x	4	oracle	dba	4096	9월	10	2009	iodbcadm
drwxr-xr-x	2	oracle	dba	4096	9월	10	2009	iodbcinst
drwxr-xr-x	11	oracle	dba	4096	9월	10	2009	mac
drwxr-xr-x	2	oracle	dba	4096	9월	10	2009	man
drwxr-xr-x	2	oracle	dba	4096	9월	10	2009	samples
```

**2) iodbc 설치**

tar.gz 파일을 가지고 설치를 진행하면 아래와 같은 기본적인 순서를 따릅니다.

설치 전 사전환경 점검에서 prefix를 설정하지 않으면 기본적으로 /usr/local 아래에 설치되기 때문에 특정 디렉터리를 지정하여 설치하고, 컴파일 및 설치 작업을 다시 수행할 경우 make clean 이후에 진행합니다.

**a) '$HOME/iodbc' 디렉터리에 설치 전 사전환경 점검을 합니다.**&#x20;

```
$ mkdir iodbc
$ cd libiodbc-3.52.7/

./configure --prefix=$HOME/iodbc --disable-gui
```

**b) 점검한 결과가 문제 없으면 컴파일을 합니다.**&#x20;

```
make
```

**c) 컴파일된 파일을 설치합니다.**&#x20;

```
make install
```

**3) 설치 확인**

설치된 서버에 원하는 bit로 설치가 되었는지 확인합니다. 특정 OS에 따라 64bit 서버에 32bit로 설치되는 경우가 있으므로 file 명령어를 이용하여 확인이 필요합니다.

만약, ODBC Manager가 64bit로 설치됐다면 내부적으로 사용하는 Tibero ODBC 역시 64bit여야 하며 재설치가 필요할 경우 make clean 이후에 진행합니다.

```
$ cd $HOME/iodbc/bin

$ file iodbctest
iodbctest: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically 
linked (uses shared libs), for GNU/Linux 2.6.32, 
BuildID[sha1]=9074c37e82e67ad88dfcf2534021d0b3d45edda4, not stripped
```

{% hint style="info" %}
**참고:** 다음은 OS별로 iodbc 64bit 설치와 설치 확인 방법에 대한 설명입니다.
{% endhint %}

* **Linux**

a. 사전 환경 점검

```
export CFLAGS=-m64
./configure --prefix=$HOME/iodbc --disable-gui
```

b. 컴파일

```
./make
```

c) 설치

```
./make install
```

d) 설치 확인

```
$ file iodbctest
iodbctest: ELF 64-bit LSB executable, AMD x86-64, version 1(SYSV),
for GNU/Linux 2.6.9, dynamically linked(uses shared libs), not stripped
```

* **AIX**

a) 사전 환경 점검

````
```
export CFLAGS=-maix64
export LDFLAGS="-maix64 -brtl"
./configure --prefix=$HOME/iodbc --disable-gui
```
````

b) 컴파일

<pre><code>```
export OBJECT_MODE=64
<strong>./make
</strong>```
</code></pre>

c) 설치

````
```
./make install
```
````

d) 설치 확인

````
```
$ file iodbctest
iodbctest: 64-bit XCOFF executable or object module not stripped
```
````

2. **profile 설정**

profile 내에 아래와 같은 내용을 추가합니다.  IODBC\_HOME의 경우 iodbc를 설치한 위치로 설정합니다.

```
# iodbc setting
export IODBC_HOME=$HOME/iodbc
export LD_LIBRARY_PATH=$IODBC_HOME/lib:$LD_LIBRARY_PATH 
export PATH=$IODBC_HOME/bin:$PATH
```

{% hint style="warning" %}
**주의:** OS에 맞게 환경변수 LD\_LIBRARY\_PATH(Linux), LIBPATH(AIX)를 설정합니다.
{% endhint %}

3. **ODBC 환경 파일 설정 및 확인**

ODBC Driver Manager의 환경 파일에 Tibero ODBC Driver를 등록하는 방법입니다. 연결 테스트 전에 Tibero 클라이언트 또는 서버의 설치 및 관련 환경설정이 되어야 합니다.

**1) 환경 파일 위치 및 이름 설정**

$HOME/.odbc.ini(개인 설정) 또는 /etc/odbc.ini(공통 설정)으로 설정 가능합니다. 우선순위는$HOME/.odbc.ini(개인 설정)이 높습니다.

* **ODBC 환경 파일 설정 방법**

```
[ODBC Data Sources]
<ODBC Data Sources> = Tibero7 ODBC driver 
[ODBC]
Trace = 1
TraceFile = /yuha/oracle/iodbc/tmp/odbc.trace 
[<ODBC Data Sources 세부설정>]
Driver = <Tibero ODBC Driver 파일>
Description = Tibero5 ODBC Datasource 
SID = <tbdsn.tbr 파일에 설정한 alias 정보> 
User = dbtech
Password = dbtech
```

<table data-header-hidden><thead><tr><th width="240"></th><th></th></tr></thead><tbody><tr><td><strong>항목</strong></td><td><strong>설명</strong></td></tr><tr><td>&#x3C; ODBC Data Sources ></td><td>Datasource 이름으로 Oracle Gateway 설정 파일에 해당 내용이 들어간다.</td></tr><tr><td>&#x3C; ODBC Data Sources 세부 설정 ></td><td>ODBC Data Sources에서 설정한 이름으로 대소문자까지 일치해 야 한다.</td></tr><tr><td>Driver</td><td>ODBC Manager에서 로드하는 Tibero ODBC Driver 파일이다. 해당 파일 존재 여부 및 권한에 대해서 확인이 필요하다.</td></tr><tr><td>SID</td><td>Tibero 클라이언트 또는 서버의 tbdsn.tbr 파일에 설정한 Alias 정 보이다.</td></tr><tr><td>User</td><td><p>사용자를 의미한다.</p><p>테스트 및 링크 생성의 경우 별도로 사용자를 가져가므로 크게 의 미는 없다.</p></td></tr><tr><td>Password</td><td>사용자 패스워드를 의미한다. 테스트 및 링크 생성의 경우 별도로 사용자를 가져가므로 크게 의미는 없다.</td></tr></tbody></table>

* **ODBC 환경 파일 설정 예**

```
$ cat .odbc.ini 
[ODBC Data Sources]
tibero7 = Tibero7 ODBC driver

[ODBC]
Trace = 1
TraceFile = /yuha/oracle/iodbc/tmp/odbc.trace

[Tibero7]
Server = 192.168.17.24
Port = 5555 
Database = tibero
Driver = /yuha/oracle/tibero7/client/lib/libtbodbc.so 
Description = Tibero7 ODBC Datasource
SID = tibero 
User = tibero 
Password = tmax
```

**2) 연결 테스트**

'$IODBC\_HOME/bin' 폴더에 있는 iodbctest를 이용하여 연결 테스트를 수행합니다. 테스트에 문제가 발생하는 경우 ODBC 환경 파일 이름 및 위치와 설정을 확인합니다. 다음은 iodbctest를 이용한 연결 테스트 설정 방법입니다.

```
iodbctest "DSN=<dsn>;UID=<user>;PWD=<pwd>"
```

<table data-header-hidden><thead><tr><th width="198"></th><th></th></tr></thead><tbody><tr><td><strong>항목</strong></td><td><strong>설명</strong></td></tr><tr><td>DSN</td><td>ODBC 환경 파일에서 설정한 ODBC Datasources 이름이다.</td></tr><tr><td>UID, PWD</td><td>테스트 할 접속 계정 및 패스워드이다.</td></tr></tbody></table>

다음은 iodbctest를 이요한 연결 테스트 사용 예입니다.&#x20;

```
$ iodbctest "DSN=Tibero7;UID=tibero;PWD=tmax" 
iODBC Demonstration program
This program shows an interactive SQL processor
Driver Manager: 03.52.0709.0909
Driver: 07.00.0218 (libtbodbc.so)

SQL>select * from test;

C1
----------------------------------
10
20

result set 1 returned 2 rows.
```

4. **Oracle Gateway 환경설정 (init{DSN}.ora)**

HS\_FDS\_CONNECT\_INFO, HS\_FDS\_SHAREABLE\_NAME에 ODBC Driver 관련 설정을 합니다.

```
HS_FDS_CONNECT_INFO=tibero 
#HS_FDS_TRACE_LEVEL=DEBUG
# Tibero ODBC Driver 
HS_FDS_SHAREABLE_NAME=/home/ora11/tibero5/client/lib/libtbodbc.so

# iODBC Driver Manager 
#HS_FDS_SHAREABLE_NAME=/home/ora11/iodbc/lib/libiodbc.so 
#HS_LANGUAGE=AMERICAN_AMERICA.KO16MSWIN949
#
# ODBC specific environment variables 
#
#set ODBCINI=<full path name of the odbc initilization file>
#set ODBCINI=/home/ora11/.odbc.ini 
#
# Environment variables required for the non-Oracle system
#
#set <envvar>=<value>
#set TB_NLS_LANG=UTF8 
#set TBCLI_LOG_LVL=TRACE
```

```
HS_FDS_CONNECT_INFO=Tibero7

# iODBC Driver Manager 
HS_FDS_SHAREABLE_NAME=/yuha/oracle/iodbc/lib/libiodbc.so
```

### 문제 해결 <a href="#bookmark16" id="bookmark16"></a>

Oracle to Tibero DB Link 설정 및 사용할 때 자주 발생하는 문제점에 대해서 설명합니다.

#### DB Link 설정 문제 <a href="#id-4.4.1.-db-link" id="id-4.4.1.-db-link"></a>

**Oracle 캐릭터 셋이 AL32UTF8일 경우**

DB Link Object를 생성하는 Oracle 서버의 캐릭터 셋이 AL32UTF8일 때 발생하는 문제입니다.\
Gateway 서버가UNIX 계열일 때 발생하며 Windows 계열은 해당하지 않습니다.

다음은 해당 문제의 현상과 해결방안에 대한 설명입니다.

* **현상**\
  Oracle 서버에서 아래와 같이 에러가 발생합니다.&#x20;

```
SQL> select name, value$ from sys.props$ where name like 'NLS_CHAR%';

NAME
-----------------------------------------------------------------
VALUE$
-----------------------------------------------------------------
NLS_CHARACTERSET 
AL32UTF8
```

```
SQL> conn scott/tiger 
Connected.
SQL> select * from dual@tlink; 
select * from dual@tlink
*
ERROR at line 1:
ORA-28511: lost RPC connection to heterogeneous remote agent using 
SID=ORA-28511: lost RPC connection to heterogeneous
remote agent using
SID=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.70.185)(PORT=1522)) 
(CONNECT_DATA=(SID=tibero)))
ORA-02063: preceding line from TLINK 
Process ID: 14824
Session ID: 8 Serial number: 14464
```

* **해결방안**\
  Oracle Gateway 파일인 init{DSN}.ora 파일에 HS\_LANGUAGE 설정을 통해 해결합니다.\
  다음 설정값은 사이트 환경에 따라 다를 수 있습니다.

```
HS_LANGUAGE=AMERICAN_AMERICA.KO16MSWIN949
```

위와 같이 설정한 후에 재접속 및 테스트를 수행하면 정상적으로 수행됩니다.

```
$ sqlplus scott/tiger
SQL*Plus: Release 11.2.0.1.0 Production on Tue Jun 4 14:23:11 2013 
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production 
With the Partitioning, OLAP, Data Mining and Real Application Testing options 
SQL> select * from dual@tlink;
DUM
--- 
X
```

{% hint style="info" %}
**참고**

Oracle을 AL32UTF8로 생성한 상태에서 Oracle generic ODBC Gateway를 이용해 다른 데이터베이스와 DB Link 구성을 하여 접속할 경우 SQLDriverConnectW로 주는 인자가 wchar\_t 형태(UTF-16형태)가 아니라 UTF- 8 형태로 들어옵니다.
{% endhint %}
