Technical Articles
SAP SQL Anywhere Tips – LinuxでのODBC接続設定
はじめに
*今回もリクエストを受け作成した記事となります。こういうのを解説してほしいとかありましたらお気軽にリクエストいただければと思います。
SAP SQL Anywhere をWindowsサーバーからLinuxサーバーへ移行するという事例が増えています。Windowsサーバー上で動作させていたアプリケーションもLinuxへ移行することになりますが、アプリケーションがODBC接続で接続していた場合、Linuxではどのように設定すればよいのか?こちら、マニュアル上ではあまりにもさらっと触れているだけですので方法を説明したいと思います。
本投稿ではVer.17を使用しましたが、おそらくは他のバージョンでも若干の変更動作すると思われます。他のバージョンでうまく行かないなど有りましたらコメント欄よりお問い合わせいただければと思います。
説明で使用している環境
本説明で使用しているLinuxディストリビューションはUbuntu 16.04LTSです。またSAP SQL Anywhere は17の64bit版を使用しています。おそらくは若干の変更でどのようなLinuxディストリビューションでも活用できると思いますが、お使いのディストリビューションでうまく動かないなど有りましたらコメント欄よりお問い合わせいただければと思います。
また、今現在はLinuxでもGUIでODBCデータソースの設定を行うためのツールが提供されるようになりましたが、Linuxサーバー機の場合、GUI環境をインストールしないという場合がありますので今回はCUIでの設定方法の解説をしたいと思います。SSH、Telnet、あるいはコンソールで接続して行うことになります。
ODBCドライバマネージャ
Windowsと違いLinuxではODBCを使用する上で必要となるODBCドライバマネージャがOSをに標準で付属していませんので通常は追加で導入する必要があります。(ディストリビューション、あるいはOSをインストール時のオプションで標準でインストールされている場合もあるかもしれませんが。)
ここで一つ問題というか、厄介な点があり、OS標準機能として提供されているWindowsと違い、LinuxではODBCドライバマネージャ自体が何種類か存在します。また、Linux版SAP SQL Anywhere自体にもSAP製の独自のODBCドライバマネージャが付属しています。
ではどれを使うべきなのか?に関してですが、これはそのアプリケーションにより異なるという事態が発生します。例えばスクラッチでCで開発したアプリケーションの場合、これは開発者様が決定する必要があります。ODBCドライバマネージャから提供されるライブラリをリンクしてアプリケーションをビルドするということになるからです。つまりこの場合であればどのODBCドライバマネージャを使用しても良いということになります。SAP SQL Anywhere 付属のODBCドライバマネージャを使用してSQL Anywhere専用のアプリケーションとしても良いですし、様々な種類のデータベースで使用できるようにするためにunixODBCやiODBCといったオープンソースのODBCドライバマネージャのライブラリにリンクしてアプリケーションを開発するという方法もあるでしょう。
第三者が開発したアプリケーションや、ランタイム系の開発環境、例えばPythonを使用するといった場合、そちらの指針に従う必要があります。Pythonでpyodbcというモジュールを使用したアプリケーションを使用する場合、このモジュールはunixodbcが必要となりますので、SQL AnywhereのODBCドライバをunixodbcで使用するように設定する必要があります。
*Pythonに対してはSAP SQL Anywhereでも専用の接続モジュールを提供していますのでそれを使用する方法もあります。
本説明ではODBCドライバマネージャとしてunixODBCを使用た例を解説します。unixodbcパッケージがインストールされていない場合、追加でインストールする必要があります。ubuntuの場合であれば
# sudo apt install unixodbc |
としてインストールすることになるかと思います。
SQL Anywhere側は「SQL Anywhereクライアント」のインストールが必要です。(これはインストールをディフォルトで行った場合は含まれています。)
システムデータソースとユーザーデータソース
-
- ユーザーDSN
設定したユーザーでのみ参照できるODBCデータソース。
-
- システムDSN
このOS上で(権限を持つ)全てのユーザーが参照できるODBCデータソース。但し管理権限がないと設定できない
という違いがあります。これはLinux上でも同様の概念であり、それによりODBC設定を行うファイルの場所が違います。Windowsから移行の場合であればWindows上でどちらを設定していたか、新規に設定するのであればどのように使用するのかを加味して決定する必要があります。
Linuxではデータソースをテキストファイルで定義します。ODBCデータソースを定義するファイルは「.odbc.ini」というファイルです。SAP SQL Anywhere ODBCドライバは以下の順で定義ファイルを検索し、使用します。(見つかったらそこで検索終了ですので、同一のDSNが存在する場合は早く見つかったほうが使用されます。)
- ODBCINI 環境変数
- ファイル名を定義したフルパスで定義してください。そのため、ファイル名が「.odbc.ini」である必要はありません。
例 export ODBCINI=/etc/odbc.ini
- ファイル名を定義したフルパスで定義してください。そのため、ファイル名が「.odbc.ini」である必要はありません。
- ODBC_INI 環境変数
- ファイル名を定義したフルパスで定義してください。そのため、ファイル名が「.odbc.ini」である必要はありません。
例 export ODBC_INI=/etc/odbc.ini
- ファイル名を定義したフルパスで定義してください。そのため、ファイル名が「.odbc.ini」である必要はありません。
- ODBCHOME 環境変数
- パスを定義します。そのパスにある.odbc.iniファイルを使用します。
例: export ODBCHOME=/opt/odbcsettings
- パスを定義します。そのパスにある.odbc.iniファイルを使用します。
- HOME 環境変数
- パスを定義します。そのパスにある.odbc.iniファイルを使用します。
- ユーザのホームディレクトリ (~)
- ホームディレクトリにある.odbc.iniファイルを使用します。
- PATH 環境変数
- これを使うことは推奨しません。その前で見つけられるようにしてください。
LINUXにおいてはユーザーDSNとシステムDSNはファイルやディレクトリのパーミッションと関連します。例えば1のODBCINI環境変数で誰もが見られるodbc.iniファイルを設定すればそれはシステムDSNという扱いです。そして5のホームディレクトリ上に.odbc.iniを配置すれば、これは通常他のユーザーから閲覧できないことになりますのでユーザーDSNとなります。見ている限りでは1と5が使用されることが多いです。
odbcinst.iniの設定
odbcinist.iniはODBCドライバのライブラリファイルの定義です。WindowsのODBCアドミニストレータではDriversという部分に相当します。odbcinst -jで設定内容を表示させた場合に「DRIVERS」で示されるファイルとなります。上記例では/etc/odbcinst.iniです。
このファイルは直接書くのではなくodbcinstコマンドで登録するという形になります。
まず、sqladriver.templateという名称で下記のテキストファイルを作成します。
[SQL Anywhere 17] Description=SAP SQL Anywhere 17 ODBC Driver Driver=/opt/sqlanywhere17/lib64/libdbodbc17_r.so Setup=/opt/sqlanywhere17/lib64/libdbodbc17_r.so |
*/opt/sqlanywhere17はディフォルトのインストールディレクトリですが、違うディレクトリにインストールした場合は適宜変更してください。また、例では64bit版で設定しています。32bit版を使用する場合はlib64など64の部分を32に置換してください。
そしてSQL Anywhereの環境変数を読み込み、odbcinstコマンドで作成したsqladriver.templateファイルを指定してインストールを行います。
$ source /opt/sqlanywhere17/bin64/sa_config.sh $ sudo odbcinst -i -d -f sqladriver.template |
odbcinstコマンドは通常root権限でインストールする必要があります。なお、上記例ではUsage countは1と表示されていますが、これはカウントですので違う数字になる場合があります。
コマンドが成功すれば/etc/odbcinst.iniに下記の様なエントリが書かれます。
[SQL Anywhere 17] Description=SAP SQL Anywhere 17 ODBC Driver Driver=/opt/sqlanywhere17/lib64/libdbodbc17_r.so Setup=/opt/sqlanywhere17/lib64/libdbodbc17_r.so UsageCount=1 |
これでODBCドライバが「使える」ようになりました。
odbc.iniの設定
例で接続するデータベース
ここからの例で接続するデータベースは下記のものとします。
・ホスト:Localhost、ポート2638で稼働
・データベースサーバー名、データベース名はdemo
ローカルホスト上で
dbsrv17 -n demo -x “tcpip(port=2638)” demo.db
で起動したデータベースとしてお考えいただければと思います。
システムデータソースとして定義する
システムデータソースとして複数のユーザーで使用できるようにします。ここでは/etc/odbc.iniとしてODBCデータソース定義ファイルを作成します。このファイルは一般的なユーザーでは変更できないようにすべきでしょう。たとえば
# sudo nano /etc/odbc.ini |
としてroot権限で作成します。
ファイルの中身は以下のように入力します。
[demodb1] Driver=SQL Anywhere 17 DatabaseName=demo ServerName=demo CommLinks=tcpip(host=localhost;port=2638) |
[demodb1]:データソース名
Driver:使用するODBCドライバ名
DatabaseName:データベース名
ServerName:データベースサーバー名
CommLinks:ネットワーク設定、上記はtcpip接続でHostがlocalhost、portが2638で接続ということです。
設定内容はSQL CentralやInteractive SQLから接続する場合と同じですのでSQL Anywhereのマニュアルを参照してください。
注意として、Driverはodbcinst.iniで定義した名称、sqladriver.templateの1行目の[]で囲んだ中身と一致させるようにしてください。これでodbcinst.iniで定義したライブラリが使用され、ODBC接続されるようになります。
ユーザーデータソースとして定義する
*説明の都合上、システムデータソースとして設定したデータベースと同じデータベースに対しての接続を違うDSN名を使用して作成しています。(同じDSN名を使用した場合は上で説明したとおり、先に見つかった方の接続設定が使用されます。)
ユーザーデータソースとしてあるユーザーしか使用できないデータソースを作成します。ホームディレクトリに.odbc.iniとしてODBCデータソース定義ファイルを作成します。これで(管理者ユーザーを除けば)そのディレクトリをホームディレクトリとしているユーザーしか設定ファイルが読めなくなりますのでユーザーデータソースとして機能することになります。
% cd $HOME % nano .odbc.ini |
中身は以下のように入力します。
[demodb2] Driver=SQL Anywhere 17 DatabaseName=demo ServerName=demo CommLinks=tcpip(host=localhost;port=2638) |
これでユーザーデータソースが完成しました。
テスト接続してみる
テスト接続してみます。ここではunixodbc付属のisqlというコマンドラインのSQLツールを使用してみます。
使用する前には環境変数の読み込み・設定を忘れないようにしてください。
# source /opt/sqlanywhere17/bin64/sa_config.sh # export ODBCINI=/etc/odbc.ini |
*下の行はシステムデータソースを使用する場合のみ必要です。
isqlのコマンド書式は以下になります。
isql <DSN名> <ユーザー名> <パスワード> |
これに従い接続してみます。下記はdemodb1を使用して接続します。
# isql demodb1 DBA sql +—————————————+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +—————————————+ SQL> |
Connected!と表示されれば接続成功です。適当なSQL文を打って正しく接続できているか確認しましょう。
# isql demodb1 DBA sql +—————————————+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +—————————————+ SQL> select * from customers; +————+———————+———————+——————————-+———————+—————–+—————–+———–+————–+———————————+ | ID | Surname | GivenName | Street | City | State | Country | PostalCode| Phone | CompanyName | +————+———————+———————+——————————-+———————+—————–+—————–+———–+————–+———————————+ | 101 | Devlin | Michaels | 114 Pioneer Avenue | Kingston | NJ | USA | 07070 | 2015558966 | The Power Group | | 102 | Reiser | Beth | 33 Whippany Road | Rockwood | NY | USA | 10154 | 2125558725 | AMF Corp. | | 103 | Niedringhaus | Erin | 190 Windsor Street | Tara | PA | USA | 19301 | 2155556513 | Darling Associates | | 104 | Mason | Meghan | 5520 Dundas Street East | Cheslea | TN | USA | 37919 | 6155555463 | P.S.C. | | 105 | McCarthy | Laura | 110 Highway 36 | Clinton …………….(中略)………………….5165552549 | The Apple Farm | +————+———————+———————+——————————-+———————+—————–+—————–+———–+————–+———————————+ SQLRowCount returns 126 126 rows fetched SQL> quit # |
..次は実際に使用されるアプリケーションでテストしてみてください。
まとめ
上記のようにしてLinux上でもODBC接続できるようになります。まだまだ使用されることが多い形式ですのでお役に立てば幸いです。