PostgreSQL + unixODBC without X-Window

purewell의 이미지

PostgreSQL + unixODBC on console HOWTO

쓴 사람 : 임 유 빈
쓴 사람 집 : http://www.dalmuri.net/~purewell
처음 쓴 날 : 2003년 2월 14일

이 문서는 GPL 사용권을 따릅니다.

차례
0. 누구를 위한 것인가
1. PostgreSQL 설치하기
2. unixODBC 설치하기
3. 맺음말

0. 누구를 위한 것인가
이 문서는 PostgreSQL과 unixODBC를 XWindow를 쓰지 않고 연결 및 설정하기 위한 일종의 삽질 기록이다. (보라~ 2월 14일에 애인이랑 놀러가지 않고 검은 화면에 하얀 글씨만 봤다!)

이 문서는 PostgreSQL을 예로 들었지만, ODBC를 지원하는 모든 DBMS를 쓸 수 있다.

약간의 사족을 붙이자면 PostgreSQL은 ORDBMS로 성장한 Database Management System이다. PostgreSQL은 소스가 공개되어 있으며, BSD 라이센스를 따르고 있다. unixODBC는 M$가 지원하고 있는 ODBC(Open Data Base Connectivity)를 다른 OS에서도 쓸 수 있도록 삽질한 것이다. 이 역시 소스가 공개되어 있으며 LGPL을 따르고 있다. ODBC는 DBMS에 관계없이 동일한 Interface를 제공하기 때문에 C/C++/Python 등의 개발자들이 OS에 맞춰 소스를 고칠 필요가 없으며 추후에 DBMS를 다른 상품으로 교체할 때도 프로그램을 재컴파일할 필요가 없는 장점을 제공한다.

1. PostgreSQL 설치하기
본인은 RedHat 8.0을 썼으며, 당연히 컴파일하기 귀차니즘 압박으로 RPM 버전을 깔아쓴다. 이미 많은 PostgreSQL 소스로 설치하는 문서가 인터넷에 널려 있으니 그런 것은 알아서 찾아 쓰기 바란다. :)

http://www.postgresql.org : PostgreSQL 공식 홈페이지 (소스를 구할 수 있다)
http://database.sarang.net : PostgreSQL 소스 설치 문서가 잘 정리 되어 있다.

설치를 위해 사용한 RPM은 다음과 같다.

postgresql-server-7.2.3-5.80.rpm : 인터넷 서버로 동작하게 해주는 도구들
postgresql-libs-7.2.3-5.80.rpm : 클라이언트용 공유 라이브러리
postgresql-devel-7.2.3-5.80.rpm : 개발을 위한 라이브러리 및 헤더 파일
postgresql-odbc-7.2.3-5.80.rpm : ODBC 드라이버
postgresql-7.2.3-5.80.rpm : 핵심 파일들

RPM을 설치한다. 물론 현재 권한은 root이다.

$ rpm -Uvh postgresql*.rpm

RPM의 스크립트가 알아서 기본 관리 유저(postgres)와 데이터베이스(template1)을 만들어줄 것이다.

이제 인터넷 서버가 작동하도록 PostgreSQL의 환경설정을 바꾸자. 아쉽게도 /etc에서 죽어라고 postgresql.conf를 찾아봤자 찾을 수 없다. :( RPM으로 설치된 PostgreSQL의 설정파일은 /var/lib/pgsql/data 에 존재한다.

$ vi /var/lib/pgsql/data/postgresql.conf

여기서 tcpip_socket 값을 찾자. 아마 그 값은 false로 설정되어 있을 것이다. 이것을 true로 바꾸자. (없다면 추가하라!)

tcpip_socket=true

인증 방식도 바꿔야한다. 같은 위치에 있는 pg_hba.conf 파일을 열어보면 주석이 몽창 있을 것이다. 맨 아래에 다음의 줄을 넣어주자.

host all 0.0.0.0 0.0.0.0 password

(pg_hba.conf 파일에 대한 설정 방법은 http://database.sarang.net 에서 찾도록 하자 :D)

이제 서버를 구동해보자.

$ /etc/rc.d/init.d/postgresql restart

구동에 문제가 생겼다면 인터넷에서 해결책을 찾길 바란다. 구동에 문제가 없다면 포트가 열렸는지 확인한다. 기본 포트 값은 5432이다.

 $ netstat -a
 Active Internet connections (servers and established)
 Proto Recv-Q Send-Q Local Address           Foreign Address         State
 (중략)
 tcp        0      0 *:postgres              *:*                     LISTEN
 (하략)

별 문제 없다면 위와 같이 나올 것이다.

2. unixODBC 설치하기
역시 RedHat 8.0에서 쓴 것이며, 시디롬 뒤져보면 있다. 현재 나와 있는 것은 Update한 패키지이므로 버전 번호가 다를 수 있지만 큰 문제는 아니다.

http://www.unixodbc.org : UNIXODBC 소스를 얻을 수 있는 웹사이트

소스를 컴파일한다면 말리지 않겠다. GNU의 Autotools로 ./configure;make;make install로 간단히 설치할 수 있으니 말이다. 다만 설정파일의 위치가 바뀌고 실행 파일 위치가 바뀌므로 ./configure 할 때, 알맞은 옵션을 주기 바란다.

본인은 아래의 RPM을 설치했다.

unixODBC-2.2.2-3.rpm : unixODBC 핵심 파일
unixODBC-devel-2.2.2-3.rpm : C/C++ 따위로 개발하기 위한 헤더/라이브러리

역시 root 권한으로 RPM을 설치한다.

$ rpm -Uvh unixODBC*.rpm

아마 unixODBC에서 무슨 QT 패키지를 요구할 것이다. 환경설정을 위한 실행파일이 X-Window용으로 개발됐기 때문이다. :( 뒤에 --nodeps를 집어넣어서 의존성을 무시하고 설치한다. :)

$ rpm -Uvh unixODBC*.rpm --nodeps

/etc에 두개의 ODBC 환경설정 파일이 생성된다. 일단 드라이버를 인식시켜야 한다. 만약 RPM 사용자라면 설치와 동시에 odbcinst.ini 파일에 PostgreSQL용 드라이버가 설치되었을 것이다.

아래는 본인의 odbcinst.ini 이다.

 ---------------------------------------- odbcinst.ini
 [PostgreSQL]
 Description     = ODBC for PostgreSQL
 Driver          = /usr/lib/libodbcpsql.so
 Setup           = /usr/lib/libodbcpsqlS.so
 FileUsage       = 1
 ----------------------------------------

위에서 Driver는 ODBC와 DBMS를 연결해주는 파일이다. RPM으로 postgresql-odbc.*.rpm을 깔았다면 위의 경로에 파일이 있을 것이다. :)

Setup은 GUI환경에서 DBMS환경설정을 위한 것이다. 슬프게도 이 문서는 X-Window가 깔려있지 않은 환경의 사용자를 위한 생쑈 하우투이기에 안 써도 무관하다. 만약 RPM으로 설치했다면 역시 파일의 위치는 위와 같다.

ODBC엔 그게 두가지 접근방식을 제공한다. User DSN과 System DSN이다. Windows에 보면 File DSN가 존재하는데 결국 접속하는 방법을 적어놓은 Text 파일을 로드하는 것이다.

Windows에서 regedit.exe를 실행해서 HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI라는 키가 있다. 왠지 어디서 많이 본 것 같지 않은가? :) 위에서 우리가 드라이버를 설정한 /etc/odbcinst.ini 파일의 내용이 거기에 들어 있다. 또한 ODBC.INI 키가 존재한다. :) 뭔가 감이 오기 시작하는가? 여기에 System DSN 설정 내용이 담기게 된다. /etc/odbc.ini처럼 말이다. (레지스트리는 Windows 3.1 시절에 설정파일을 담아놓던 ini 파일을 시스템 내부로 옮기는 것을 모토로 하고 있기 때문이다~)

만약 레지스트리에 PostgreSQL로 세팅된 것이 있다면 그것을 Export해서 알맞게 수정해서 /etc/odbc.ini에 옮겨 넣으면 System DSN이 생성되며, ~/.odbc.ini에 옮겨 넣으면 User DSN이 생성된다.

아래는 본인의 odbc.ini 파일이다.

 ---------------------------------------- odbc.ini
 [ODBC Data Sources]
 MyDBMS   = My Database Management System

 [MyDBMS]
 Driver=/usr/lib/libodbcpsql.so
 Fetch=100
 CommLog=0
 Debug=0
 Optimizer=1
 Ksqo=1
 UniqueIndex=1
 UseDeclareFetch=0
 UnknownSizes=0
 TextAsLongVarchar=1
 UnknownsAsLongVarchar=0
 BoolsAsChar=1
 Parse=0
 CancelAsFreeStmt=0
 MaxVarcharSize=254
 MaxLongVarcharSize=8190
 ExtraSysTablePrefixes=dd_;
 Description=My Database Management System
 Database=template1
 Servername=localhost
 Port=5432
 Username=
 Password=
 ReadOnly=0
 ShowOidColumn=0
 FakeOidIndex=0
 RowVersioning=0
 ShowSystemTables=0
 Protocol=6.4
 ConnSettings=
 DisallowPremature=0
 UpdatableCursors=1
 LFConversion=1
 TrueIsMinus1=0
 BI=0
 ----------------------------------------

길어지니까 왠지 모르게 뒷골이 땡겨온다. :( 사실 저 위의 값이 모두 다 쓰일 필요는 없다. 대부분 Default 값이기 때문이다.

먼저 [ODBC Data Sources] 영역이 필요하다. ODBC는 제일 먼저 이 부분을 검색하며 이 부분에서 어떠한 DSN이 있는지 알아낸다. 형식은 "[DSN 이름] = [설명]"이다.

다음에 [ODBC Data Sources]에서 정의한 DSN 이름으로 속성을 나열한다. :D 여기에 쓰이는 속성 중에서 중요한 것만 언급하겠다. (쓰지 않은 값은 모두 기본값 처리된다)

Driver : 여기에 쓰일 드라이버 파일을 명시한다. odbcinst.ini 파일에 명시된 파일명을 쓴다.
Description : 이 DSN이 무엇인가를 간단히 설명하는 문자열이다.
Database : 쓰일 Database 이름이다. 처음 만들었다면 template1 밖에 없을 것이고, 만약 만든 것이 있다면 기본적으로 찾을 Database이름을 적자.
ServerName : 혹은 Host로도 쓰이는 것으로 서버의 주소이다. IP든 도메인 네임이든 모든 것을 다 쓸 수 있다.
Port : DBMS와 대화할 포트번호를 적으면 된다. 안 적으면 PostgreSQL의 기본 포트인 5432가 될 것이다.
Username : 기본적으로 접속할 때 쓰일 사용자 이름이다.
Password : 기복적으로 접속할 때 쓰일 암호이다. 될 수 있으면 적지 말자.

자, 이제 제대로 돌아가는지 실험을 해보자. unixODBC의 기본 테스터기로 odbctest가 존재한다.

 $ odbctest
 odbctest: error while loading shared libraries: libqt-mt.so.3: cannot open shared object file: No such file or directory

아뿔싸... GUI환경에서 돌아가는 것이었다. :( 그럼 isql을 사용해보자.

 $ isql MyDBMS
 +---------------------------------------+
 | Connected!                            |
 |                                       |
 | sql-statement                         |
 | help [tablename]                      |
 | quit                                  |
 |                                       |
 +---------------------------------------+
 SQL>_

저렇게 뜨면 성공한 것이다.

3. 맺음말
본인이 unixODBC를 쓰게 된 것은, Linux용으로 서버를 개발하고 있는데 어떤 DBMS가 좋을지 판단이 안 서서였다. 그때 당시 Oracle 설치할 줄도 몰랐고, 미래를 위해 잘 설계를 해야했고 프로젝트 기간 안에 끝내야했기 때문에 DBMS의 선택을 추후로 미룰 수 있도록 ODBC를 선택하게 됐다. 물론 JDBC도 있지만 설치 및 C/C++과의 연동에 대한 문서를 찾을 수 없어서 ODBC를 선택하게 됐다. 일단 PostgreSQL로 ANSI표준안에 맞게 테이블을 생성해서 프로젝트를 진행하였다. 지금도 별일 없기 때문에 PostgreSQL로 돌리고 있으나, 만약 DBMS를 바꾸거나 확장하는 일이 있더라도 소스를 고칠 필요도, 재컴파일 할 필요도 없기 때문에 :) 좋은 것 같다.

본인도 리눅스나 DBMS 등등의 상세한 부분은 모른다. 다만 프로젝트를 하면서 unixODBC를 X-Window가 없는 환경에서 써봤으며, 잘 실행되길래 문서화해서 무릇 같은 삽질을 하는 리돌이, 리순이들에게 약간의 도움이 되길 바랄 뿐이다.

Forums: 

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.