2011年6月27日

CentOS5.6にSybase ASE 11.0.3.3 ESD#6をインストールしてみた

どこに需要があるのか不明ですが、ひょんなことから昔使われていた無料版Sybaseを最新のLinuxであるCentOS 5.6にインストールしてみました。

■Sybase ASE 11.0.3.3 ESD#6のダウンロード
公式サイトのここにダウンロードページがあるのですが、2011年6月時点ではNot Foundになっている模様です。
なので今回は、"sybase-ase-11_0_3_3-6_i386.rpm"あたりでググってミラーサイトからダウンロードしたものを利用します。

ダウンロードするファイルは以下のファイルです。念のため使用したファイルのSHA-1ハッシュ値も記載しておきます。

2570f7c7c2d9f79fbd19e142358167df9e326ee8
sybase-ase-11_0_3_3-6_i386.rpm
4027bb262bd0a2ebfc07b6a76b3ca8d0b2993c48
sybase-ocsd-10_0_4-6_i386.rpm


■インストール
ダウンロードが完了したらrootにスイッチしRPMパッケージをインストールします。

su -
rpm -ivh sybase-ase-11_0_3_3-6_i386.rpm
rpm -ivh sybase-ocsd-10_0_4-6_i386.rpm

デフォルトでは/opt/sybase以下にインストールされるため、ディスクの容量などに注意してください。

次にセットアップスクリプトを実行して初期設定を行います。ライセンス条項への同意やsybaseアカウント/グループの作成に答えていくと実行が完了します。

/opt/sybase/install/sybinstall.sh


■CentOS(最新Linux)向け設定
本来はこのままSybaseの設定に進むのですが、最新のLinux環境ではセキュリティ対策の影響かそのままでは動作しないため、sybaseユーザの環境変数におまじないを入れておきます。
(LD_LIBRARY_PATHだと思っていたのですが違ってました。ごめんなさい…)

perl -i -pe 'print "export LD_POINTER_GUARD=0\n" if $. == 1;' /opt/sybase/.profile

※/opt/sybase/.profileの1行目に"export LD_POINTER_GUARD=0"が追加されているはず


■Sybaseの設定
.profileの修正が完了した所でsybaseユーザにスイッチすると、sybinitコマンドの実行確認が行われます。そのまま実行して以下の設定を行います。
設定はメニュー番号を押すか、Ctrl-aキーで内容を適用したりCtrl-xで戻ったりします。間違ってexitしちゃった場合は/opt/sybase/install/sybinitで再実行します。

 su - sybase
 (またはsybaseユーザにスイッチ後、/opt/sybase/install/sybinitを実行)
 2.  Edit / View Interfaces File
   2.  Edit / View Interfaces File
     1.  Add a new entry
       1.  Server name:
         "SYBASE"と入力
       3.  Add a new listener service
         7100番ポートを追加
 3.  Configure a Server product
   1.  SQL Server
     1.  Configure a new Adaptive Server
       "SYBASE"のまま
       2.  MASTER DEVICE CONFIGURATION
         masterのサイズを128MBあたりに増やしておく
       3.  SYBSYSTEMPROCS DATABASE CONFIGURATION
         sybsystemprocsのサイズを64MBあたりに増やしておく
         (sybase起動後またはnew devicesを増やさないとダメかも)
       6.  CONFIGURE LANGUAGES
         japaneseのInstallとDefaultを"yes"にする
       7.  CONFIGURE CHARACTER SETS
         IBM/Microsoft CodeのInstallとDefaultを"yes"にする
       その他の項目もメニュー番号を押してCtrl-aで"Complete"にする


■Sybaseの起動と停止
sybinitの設定がうまくいけば自動的にSybaseが起動するはずですが、手動で起動と停止を行う場合は以下のコマンドを実行します。

 ・起動
 /opt/sybase/install/startserver -f /opt/sybase/install/RUN_SYBASE
 ・停止
 kill -9 [dataserverのPID]

 ※/opt/sybase/install/rc.sybaseに起動停止スクリプトがあるため、それをrootで実行しても可


■データベースの作成
これまでの手順でsybaseが起動していれば、isqlコマンドを使用して操作可能になっているはずです。
ここからは実際のデータを格納するデータベースの作成を行います。今回は日本郵便で公開されている郵便番号データを格納してみます。

/opt/sybase/bin/isql -Usa -SSYBASE -Jsjis -w${COLUMNS}

isqlコマンドプロンプトが起動したら、以下を実行してデータベース上の仮想デバイスを作成してそれを使ったデータベースを作成します。

 disk init name = "zip",
 physname = "/opt/sybase/zip.dat",
 vdevno = 2,
 size = 65536
 go
 create database zip on zip = 131072 with override
 go

作成したデータベースに各種オプションを設定し、ユーザを作成します。

 sp_dboption zip, "trunc log", true
 go
 sp_dboption zip, "allow nulls by default", true
 go
 sp_dboption zip, "select into/bulkcopy", true
 go
 sp_addlogin zipuser, password, zip, 'japanese'
 go
 use zip
 go
 checkpoint
 go
 sp_adduser zipuser
 grant all to zipuser
 go


■テーブルの作成
<a href="http://www.post.japanpost.jp/zipcode/dl/readme.html">郵便番号データファイルの形式</a>に従ったテーブルを作成します。

 /opt/sybase/bin/isql -Uzipuser -Ppassword -SSYBASE -Jsjis -w${COLUMNS}

 CREATE TABLE zip_code (
   code VARCHAR(10),
   zip5 varchar(5),
   zip7 varchar(7),
   pref_kana varchar(50),
   city_kana varchar(50),
   town_kana varchar(50),
   pref varchar(50),
   city varchar(50),
   town varchar(50),
   flag1 tinyint,
   flag2 tinyint,
   flag3 tinyint,
   flag4 tinyint,
   flag5 tinyint,
   flag6 tinyint
 )
 go


■bcpコマンドによるデータの格納
郵便番号データは<a href="http://www.post.japanpost.jp/zipcode/dl/kogaki-zip.html">ここ</a>にZIP形式で公開されています。
CSVデータファイルをダウンロードして、Sybaseのインポートツールであるbcpコマンドから作成したテーブルにデータをインポートします。

 unzip ken_all.zip
 /opt/sybase/bin/bcp zip_code in KEN_ALL.CSV -c -Uzipuser -Ppassword -SSYBASE -Jsjis

 ※対話形式でフォーマットを聞かれるので、プレフィックス長を0、フィールドターミネータに,(カンマ)を指定して下さい

isqlコマンドプロンプトでSELECT文を実行すれば、インポートしたデータが確認できます。


CASE文やテーブル名にクエリ結果を使えなかったりといろいろ制限の多かったデータベースでしたが、久しぶりに触ってみると意外とすんなり使うことができました。
近頃のSybaseはSAPに買収されてあまり見る機会も少なくなりましたが、当時の苦労を思い出しながらノスタルジーに浸った週末でしたw。