안녕하세요. 지난번에 이어 Informix에서 Oracle 데이터베이스 참조하기 위한 구성을 테스트해봤습니다.
마찬가지로 Enterprise Gateway Manager를 사용했습니다. 그런데 Informix 데이터베이스에 접속한 상태에서 Oracle 데이터베이스를 참조하려고 하니 908 오류가 발생하면서 접속이 되지 않더군요. 그래서 이번에는 EGM 7.31.UD3 버전으로 테스트를 시도해봤습니다.
1. 테스트 환경
① O/S : CentOS 7
② 클라이언트 : Informix Server 12.10, Informix Server 14.10
③ 접속 대상 : Oracle 11gR2, SQL Server 2017 on Linux
④ EGM 버전 : 7.31.UD3
2. 환경변수 설정
별도 EGM 인스턴스를 기동해야해서 INFORMIXSERVER, INFORMIXDIR을 수정했습니다.
Oracle을 사용하려는 경우 egmenv.sh 에서 ORACLE_HOME 환경변수를 지정하라고 합니다.
사실 ODBC를 사용하는 경우 tnsnames.ora 파일만 지정하면 되고 별도 라이브러리는 필요없으므로 ORACLE_HOME 설정이 되어있지 않어도 접속이 되었습니다. 따라서 오라클 클라이언트를 별도로 설치하지 않아도 됩니다. 이건 기본 테스트라 그렇지 설치가 필요한 경우도 있겠죠?
3. odbc.ini 파일 수정
EGM 7.31.UD4 버전의 ODBC 드라이버와 odbc.ini 파일을 참고하여 설정했습니다. 앞서 egmenv.sh 스크립트에서 ODBC 드라이버 매니저는 7.31.UD3의 라이브러리를 참조하도록 했습니다. (LD_LIBRARY_PATH=$INFORMIXDIR/egm/odbc/lib)
그리고 접속 대상인 Oracle 서버의 접속정보인 tnsnames.ora 파일의 경로를 TNSNamesFile에 설정하면 됩니다.
[oracle]
Driver=/work1/informix/egm/egm/odbc/lib/IXora27.so
Description=DataDirect 7.1 Oracle
AlternateServers=
ApplicationUsingThreads=1
ArraySize=7.100
CatalogIncludesSynonyms=1
CatalogOptions=0
ClientVersion=9iR2
ConnectionRetryCount=0
ConnectionRetryDelay=3
DefaultLongDataBuffLen=1024
DescribeAtPrepare=0
EnableDescribeParam=0
EnableNcharSupport=0
EnableScrollableCursors=1
EnableStaticCursorsForLongData=0
EnableTimestampWithTimeZone=0
LoadBalancing=0
LocalTimeZoneOffset=
LockTimeOut=-1
LogonID=
OptimizeLongPerformance=0
Password=
ProcedureRetResults=0
ReportCodePageConversionErrors=0
ServerName=test
TimestampEscapeMapping=0
TNSNamesFile=/work1/informix/egm/tnsnames.ora
UseCurrentSchema=1
4. SQL 실행 테스트
Oracle의 샘플 스키마인 scott 계정의 emp테이블을 Informix 데이터베이스로 가져와봅니다.
$ export CLIENT_LOCALE=en_us.819
$ export DB_LOCALE=en_us.819
$ echo "create table emp as select * from oracle@egm731ud3:\"SCOTT\".emp" | dbaccess stores_demo
Database selected.
14 row(s) retrieved into table.
Database closed.
[informix@db2 1210FC12W1XC]$ echo "select * from emp" | dbaccess stores_demo
Database selected.
empno ename job mgr hiredate sal comm deptno
7369 SMITH CLERK 7902 1980-12-17 00:00:00 800.00 20
7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975.00 21
7782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450.00 11
7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500.00 0.00 30
7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000.00 20
7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600.00 300.00 30
7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250.00 1400.00 30
7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3000.00 20
7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100.00 20
7934 MILLER CLERK 7782 1982-01-23 00:00:00 1300.00 10
7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250.00 500.00 30
7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850.00 31
7839 KING PRESIDENT 1981-11-17 00:00:00 5000.00 10
7900 JAMES CLERK 7698 1981-12-03 00:00:00 950.00 31
Informix와 Oracle 테이블간의 inner join도 실행해보고 실행계획도 확인해봤습니다. 이것 참 재미있네요. Informix 테이블에 대한 정보만 표시되고 Oracle의 테이블에 대해서는 REMOTE PATH로 표시되네요.
$ echo "set explain on ;select b.* from emp a, oracle@egm731ud3:\"SCOTT\".emp b where a.empno = b.empno and a.empno = 7369" | dbaccess stores_demo
Database selected.
Explain set.
empno ename job mgr hiredate sal comm deptno
7369 SMITH CLERK 7902 1980-12-17 00:00:00 800.00 20
1 row(s) retrieved.
Database closed.
$ cat sqexplain.out
QUERY: (OPTIMIZATION TIMESTAMP: 09-14-2020 17:33:20)
------
select b.* from emp a, oracle@egm731ud3:"SCOTT".emp b where a.empno = b.empno and a.empno = 7369
Estimated Cost: 6
Estimated # of Rows Returned: 1
1) informix.a: SEQUENTIAL SCAN (Serial, fragments: ALL)
2) informix.b: REMOTE PATH
REMOTE SESSION ID FOR 'egm731ud3' is UNKNOWN
Remote SQL Request:
select x0.empno ,x0.ename ,x0.job ,x0.mgr ,x0.hiredate ,x0.sal ,x0.comm ,x0.deptno from oracle:"SCOTT".emp x0 where ((? = x0.empno ) AND (x0.empno = 7369 ) )
NESTED LOOP JOIN
Query statistics:
-----------------
Table map :
----------------------------
Internal name Table name
----------------------------
t1 a
type table rows_prod est_rows rows_scan time est_cost
-------------------------------------------------------------------
scan t1 14 1 14 00:00.00 4
type rows_prod est_rows time est_cost
-------------------------------------------------
remote 1 1 00:00.01 0
type rows_prod est_rows time est_cost
-------------------------------------------------
nljoin 1 1 00:00.01 7
SQL Server의 경우도 inner join이 잘 실행되었습니다. 테스트 환경이라 ODBC 라이브러리가 꼬인건지 모르겠지만.. 실행이 되는건 확인했네요. ODBC 드라이버 매니저와 드라이버가 적절하게 구성되는 것이 제일 중요한 것 같습니다. 인터넷에서 문서들을 찾다보면 unixODBC와 각 데이터베이스에서 제공되는 ODBC 드라이버로 구성한 사례들도 있는데 저는 라이브러리를 새로 컴파일하기가 귀찮아서 기본으로 제공되는 라이브러리들로 테스트했습니다. 깔끔한 상태의 컴퓨터에서 테스트해보시길 권장드립니다.
'Informix > informix reference' 카테고리의 다른 글
DECIMAL 형식의 컬럼 길이 확인하기 (0) | 2021.01.19 |
---|---|
Informix에서 함수 인덱스 찾기 (0) | 2021.01.06 |
Informix에서 MSSQL 데이터베이스 참조하기 (0) | 2020.09.14 |
Informix 14.10.xC4부터 SQL문장의 쿼리 플랜을 확인하는 getExplain 함수 제공 (0) | 2020.07.07 |
Informix 14.10.xC4의 MSG_DATE 설정 변화 (0) | 2020.07.07 |