Posting

Machbase의 최신 소식을 지금 만나보세요

[MACHBASE 연동] 리눅스 ODBC

마크베이스(Machbase)  리눅스 기반  ODBC 연동

시작

마크베이스를 윈도우에 설치할 경우에는 자동으로 ODBC를 설정해 주기 때문에 큰 문제가 없다. 그러나, 리눅스에서는 ODBC를 연동하기 위해서는 다음과 같은 순서에 따라 확인하도록 하자. 일단 우분투 14.04 기준으로 unixodbc를 통해서 연동해 본 것이고, 다른 리눅스 패키지에서도 동일할 것이라고 생각된다.  

unixodbc 설치

이 설치는 다음과 같이 수행하면 되며, 혹시 안될 경우에는 관련 자료를 참조한다.

#우분투 계열
sudo apt-get install unixodbc unixodbc-dev unixodbc-bin

# 레드햇 계열 
yum install unixODBC unixODBC-devel -y

위와 같이 설치하자.  

unixodbc 공유 라이브러리 에러 발생시

위와 같이 설치해도 간혹 /usr/lib에 unixodbc의 링크가 없는 경우가 있다. 이 경우에는 아래와 같이 심볼릭 링크를 생성하여,  공유 라이브러리 에러를 제거할 수 있다.

cd /usr/lib
sudo ln -s /usr/lib/x86_64-linux-gnu/libodbccr.so.1 libodbcccr.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libodbcinst.so.1 libodbcinst.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libodbc.so.1 libodbc.so
machbase@4bbdce10db9b:/usr/lib$ ls -al *odbc*
lrwxrwxrwx 1 root root 38 Aug 9 07:05 libodbc.so -> /usr/lib/x86_64-linux-gnu/libodbc.so.1
lrwxrwxrwx 1 root root 40 Aug 9 07:05 libodbcccr.so -> /usr/lib/x86_64-linux-gnu/libodbccr.so.1
lrwxrwxrwx 1 root root 42 Aug 9 07:05 libodbcinst.so -> /usr/lib/x86_64-linux-gnu/libodbcinst.so.1
machbase@4bbdce10db9b:/usr/lib$ echo $LD_LIBRARY_PATH
/home/sjkim2/machbase_home/lib::/usr/lib:/lib:/usr/lib:/lib:/usr/lib/x86_64-linux-gnu

위와 같이 심볼릭 링크를 통해 에러를 제거한다. 그리고, LD_LIBRARY_PATH에 /usr/lib 및 관련 라이브러리 위치가 포함되었는지 반드시 확인한다.  

ODBC 라이브러리 확인

(화일명 변경을 하지 않는다면 스킵해도 무방하다..) 우선 마크베이스 패키지에서 ODBC 라이브러리가 있는지 확인해 보자.

sjkim2@myhost:~$ cd $MACHBASE_HOME/lib
sjkim2@myhost:~/machbase_home/lib$ pwd
/home/sjkim2/machbase_home/lib
sjkim2@myhost:~/machbase_home/lib$ ls -al
합계 7524
drwxrwxr-x 2 sjkim2 sjkim2 4096 8월 3 12:12 .
drwxrwxr-x 16 sjkim2 sjkim2 4096 8월 4 14:18 ..
-rw-rw-r-- 1 sjkim2 sjkim2 1778354 8월 3 12:12 libifluxcli.a
-rwxrwxr-x 1 sjkim2 sjkim2 1155991 8월 3 12:12 libifluxcli_dll.so
-rw-rw-r-- 1 sjkim2 sjkim2 1778354 8월 3 12:12 libmachbasecli.a
-rwxrwxr-x 1 sjkim2 sjkim2 1155991 8월 3 12:12 libmachbasecli_dll.so
-rwxrwxr-x 1 sjkim2 sjkim2 1151083 8월 3 12:12 libmachbaseodbc_dll.so
lrwxrwxrwx 1 sjkim2 sjkim2 17 8월 3 12:12 libncurses.so.5 -> libncurses.so.5.7
-rwxrwxr-x 1 sjkim2 sjkim2 158919 8월 3 12:12 libncurses.so.5.7
-rw-rw-r-- 1 sjkim2 sjkim2 378087 8월 3 12:12 log4j.jar
-rw-rw-r-- 1 sjkim2 sjkim2 107463 8월 3 12:12 machbase.jar
-rw-rw-r-- 1 sjkim2 sjkim2 4826 8월 3 12:12 machbaseLog.jar
sjkim2@myhost:~/machbase_home/lib$ cp libmachbaseodbc_dll.so libmachbaseodbc.so
sjkim2@myhost:~/machbase_home/lib$

절대 경로는 /home/user/machbase_home/lib 이고, 위 디렉토리에 화일이 있는 것을 확인할 수 있다. (혹은 _dll이 없는 화일이 있는데, 이는 버젼에 따라 약간씩 다르다.) 그런데, _dll 이름이 붙은 것이 좀 이상하므로, _dll 을 제거한 화일을 하나 더 만들어 놓자. (향후에는 이렇게 변경될 것으로 예상된다)

sjkim2@myhost:~/machbase_home/lib$ cp libmachbaseodbc_dll.so libmachbaseodbc.so
sjkim2@myhost:~/machbase_home/lib$ ls -al
합계 8652
drwxrwxr-x 2 sjkim2 sjkim2 4096 8월 9 12:36 .
drwxrwxr-x 16 sjkim2 sjkim2 4096 8월 4 14:18 ..
-rw-rw-r-- 1 sjkim2 sjkim2 1778354 8월 3 12:12 libifluxcli.a
-rwxrwxr-x 1 sjkim2 sjkim2 1155991 8월 3 12:12 libifluxcli_dll.so
-rw-rw-r-- 1 sjkim2 sjkim2 1778354 8월 3 12:12 libmachbasecli.a
-rwxrwxr-x 1 sjkim2 sjkim2 1155991 8월 3 12:12 libmachbasecli_dll.so
-rwxrwxr-x 1 sjkim2 sjkim2 1151083 8월 9 12:36 libmachbaseodbc.so
-rwxrwxr-x 1 sjkim2 sjkim2 1151083 8월 3 12:12 libmachbaseodbc_dll.so
lrwxrwxrwx 1 sjkim2 sjkim2 17 8월 3 12:12 libncurses.so.5 -> libncurses.so.5.7
-rwxrwxr-x 1 sjkim2 sjkim2 158919 8월 3 12:12 libncurses.so.5.7
-rw-rw-r-- 1 sjkim2 sjkim2 378087 8월 3 12:12 log4j.jar
-rw-rw-r-- 1 sjkim2 sjkim2 107463 8월 3 12:12 machbase.jar
-rw-rw-r-- 1 sjkim2 sjkim2 4826 8월 3 12:12 machbaseLog.jar
sjkim2@myhost:~/machbase_home/lib$

이제 libmachbaseodbc.so 화일이 생겼다. (_dll 형태가 좋은 사람은 그대로 사용해도 무방하다)  

.odbc.ini 초기 화일 설정

unixodbc는 기본적으로 수행되는 사용자 디렉토리에서 .odbc.ini 를 찾아서 ODBC의 DSN을 검색하게 된다. 기본 구조는 다음과 같으며, 사용자에 맞는 디렉토리를 사용하면 될 것이다.
vi ~/.odbc.ini 를 수행해서 아래의 화일을 복사해서 만든다.

[machbase]
Driver=/home/sjkim2/machbase_home/lib/libmachbaseodbc_dll.so
#Driver=/home/sjkim2/machbase_home/lib/libmachbaseodbc.so # 둘다 무방하다...
DBNAME=mydb
SERVER=127.0.0.1
PORT_NO=5656
UID=SYS
PWD=MANAGER
NLS_USE=UTF8

이제 서버를 구동하고, 테스트해 보자. 콘솔에서 isql machbase 라고 치면 된다. 이 machbase가 .odbc.ini에 등록된 DSN이 된다.

sjkim2@myhost:~$ machadmin -u
-----------------------------------------------------------------
Machbase Administration Tool
Release Version - 3.5.0.826b8f2.community
Copyright 2014, InfiniFlux Corp. or its subsidiaries
All Rights Reserved
-----------------------------------------------------------------
Waiting for Machbase server start.
Machbase server started successfully.
sjkim2@myhost:~$ isql machbase
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL> select * from m$tables;
+-----------------------------------------+------------+---------------------+---------------------+------------+------------+
| NAME | TYPE | DATABASE_ID | ID | USER_ID | COLCOUNT |
+-----------------------------------------+------------+---------------------+---------------------+------------+------------+
| M$SYS_COLLECTOR_COLUMNS | 1 | -1 | 1000049 | 0 | 11 |
| M$COLUMNS | 1 | -1 | 1000043 | 0 | 13 |
| M$SYS_COLUMNS | 1 | -1 | 1000042 | 0 | 13 |
| M$SYS_INDEX_COLUMNS | 1 | -1 | 1000045 | 0 | 9 |
| M$SYS_COLLECTOR_SOURCES | 1 | -1 | 1000050 | 0 | 7 |
| M$SYS_TABLESPACE_DISKS | 1 | -1 | 1000020 | 0 | 8 |
| M$SYS_COLLECTORS | 1 | -1 | 1000048 | 0 | 25 |
| M$SYS_TABLES | 1 | -1 | 1000038 | 0 | 8 |
| M$TABLES | 1 | -1 | 1000040 | 0 | 8 |
| M$SYS_INDEXES | 1 | -1 | 1000044 | 0 | 15 |
| M$SYS_USERS | 1 | -1 | 1000046 | 0 | 4 |
| M$SYS_TABLESPACES | 1 | -1 | 1000016 | 0 | 5 |
| M$SYS_COLLECTORMANAGERS | 1 | -1 | 1000047 | 0 | 7 |
+-----------------------------------------+------------+---------------------+---------------------+------------+------------+
SQLRowCount returns 13
13 rows fetched
SQL>

위와 같이 연결되면 연동이 성공한 것이다. 혹시나 아래와 같은 에러가 발생하면 위에서 언급한  UNIXODBC 공유 라이브러리 설정을 다시 참조한다.

machbase@4bbdce10db9b:/$ isql machbase
Cannot find SQLGetPrivateProfile: nbp_dl_open(libodbcinst.so) error:
 libodbcinst.so: cannot open shared object file: No such file or directory
[ISQL]ERROR: Could not SQLConnect
............

간단한  ODBC 테스트

unixodb에서 제공하는 isql 을 통해서 간단하게 테이블 생성 및 데이터를 넣어 보았다.

SQL> help
+----------+------------+-----------------------------------------+-----------+--------+
| TABLE_CAT| TABLE_SCHEM| TABLE_NAME | TABLE_TYPE| REMARKS|
+----------+------------+-----------------------------------------+-----------+--------+
| IFLUX | SYS | SAMPLE_TABLE | TABLE | |
+----------+------------+-----------------------------------------+-----------+--------+
SQLRowCount returns 2
2 rows fetched
SQL> create table mach (id integer);
SQLRowCount returns 0
SQL> insert into mach values(1);
SQLRowCount returns 0
SQL> insert into mach values(2);
SQLRowCount returns 0
SQL> insert into mach values(3);
SQLRowCount returns 0
SQL> select * from mach;
+------------+
| ID |
+------------+
| 3 |
| 2 |
| 1 |
+------------+
SQLRowCount returns 3
3 rows fetched
SQL> insert into mach select * from mach;
SQLRowCount returns 0
SQL> insert into mach select * from mach;
SQLRowCount returns 0
SQL> insert into mach select * from mach;
SQLRowCount returns 0
SQL> insert into mach select * from mach;
SQLRowCount returns 0
SQL> insert into mach select * from mach;
SQLRowCount returns 0
SQL> select count(*) from mach;
+---------------------+
| count(*) |
+---------------------+
| 96 |
+---------------------+
SQLRowCount returns 1
1 rows fetched
SQL> select id, count(id) from mach group by id;
+------------+---------------------+
| id | count(id) |
+------------+---------------------+
| 2 | 32 |
| 3 | 32 |
| 1 | 32 |
+------------+---------------------+
SQLRowCount returns 3
3 rows fetched
SQL> help
+----------+------------+-----------------------------------------+-----------+--------+
| TABLE_CAT| TABLE_SCHEM| TABLE_NAME | TABLE_TYPE| REMARKS|
+----------+------------+-----------------------------------------+-----------+--------+
| IFLUX | SYS | MACH | TABLE | |
| IFLUX | SYS | SAMPLE_TABLE | TABLE | |
+----------+------------+-----------------------------------------+-----------+--------+
SQLRowCount returns 2
2 rows fetched
SQL> help
+----------+------------+-----------------------------------------+-----------+--------+
| TABLE_CAT| TABLE_SCHEM| TABLE_NAME | TABLE_TYPE| REMARKS|
+----------+------------+-----------------------------------------+-----------+--------+
| IFLUX | SYS | SAMPLE_TABLE | TABLE | |
+----------+------------+-----------------------------------------+-----------+--------+
SQLRowCount returns 2
2 rows fetched
SQL> create table mach (id integer);
SQLRowCount returns 0
SQL> insert into mach values(1);
SQLRowCount returns 0
SQL> insert into mach values(2);
SQLRowCount returns 0
SQL> insert into mach values(3);
SQLRowCount returns 0
SQL> select * from mach;
+------------+
| ID |
+------------+
| 3 |
| 2 |
| 1 |
+------------+
SQLRowCount returns 3
3 rows fetched
SQL> insert into mach select * from mach;
SQLRowCount returns 0
SQL> insert into mach select * from mach;
SQLRowCount returns 0
SQL> insert into mach select * from mach;
SQLRowCount returns 0
SQL> insert into mach select * from mach;
SQLRowCount returns 0
SQL> insert into mach select * from mach;
SQLRowCount returns 0
SQL> select count(*) from mach;
+---------------------+
| count(*) |
+---------------------+
| 96 |
+---------------------+
SQLRowCount returns 1
1 rows fetched
SQL> select id, count(id) from mach group by id;
+------------+---------------------+
| id | count(id) |
+------------+---------------------+
| 2 | 32 |
| 3 | 32 |
| 1 | 32 |
+------------+---------------------+
SQLRowCount returns 3
3 rows fetched
SQL> help
+----------+------------+-----------------------------------------+-----------+--------+
| TABLE_CAT| TABLE_SCHEM| TABLE_NAME | TABLE_TYPE| REMARKS|
+----------+------------+-----------------------------------------+-----------+--------+
| IFLUX | SYS | MACH | TABLE | |
| IFLUX | SYS | SAMPLE_TABLE | TABLE | |
+----------+------------+-----------------------------------------+-----------+--------+
SQLRowCount returns 2
2 rows fetched
SQL>

  지금까지 리눅스에서 마크베이스를 위한 ODBC 연결을 해 보았다.

Contact the Machbase team with your questions!
info@machbase.com

연관 포스트

C언어로 Binary data를 Machbase에 넣기

1.개요 Data를 다루다 보면 numeric, varchar 형 데이터뿐만 아니라 JPG, PNG, MP3와 같은 Binary data도 database에 저장해야 할 때가 존재한다. 그러나 일반 data들과는 달리 Binary

[MACHBASE 연동] Android studio에서 JDBC 연결하기

마크베이스 기술지원본부 이현민 1. 개요 수많은 데이터들이 많은 환경에서 생성되고 있는 오늘날, 우리 현대인들의 동반자인 스마트폰 또한 데이터생성의 주체로써 또는 전달자로서 알게 모르게 그 구실을