Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
NaotoSakai
Product and Topic Expert
Product and Topic Expert

はじめに


*今回はリクエストを受け作成した記事となります。こういうのを解説してほしいとかありましたらお気軽にリクエストいただければと思います。


SAP SQL Anywhere Ver.17をLinuxで動作させる際に、OS起動と共にSAP SQL Anywhereデータベースをサービスとして起動させたいという場合があります。意外とマニュアルに記述がありませんでしたので、今回はその方法を解説します。



ちょっと余談:環境設定ファイル


LinuxでSAP SQL Anywhereを動作させる際、いくつか環境変数が必要です。これはSQL Anywhereをインストールしたディレクトリのbin64ディレクトリもしくはbin32ディレクトリに sa_config.sh (とsa_config.csh) というファイルがあります。このファイルにまとめられています。


*bin32のものを使用するのかbin64のものを使用するのかは32bit版SQL Anywhereを使用するのか64bit版SQL Anywhereを使用するのかの選択に依存します。


ディフォルトではSQL Anywhere 17であれば下記のようなファイルが作られています。



#!/bin/sh
#

# the following lines set the SA location.
SQLANY17="/opt/sqlanywhere17"
export SQLANY17

[ -r "$HOME/.sqlanywhere17/sample_env64.sh" ] && . "$HOME/.sqlanywhere17/sample_env64.sh"
[ -z "${SQLANYSAMP17:-}" ] && SQLANYSAMP17="/opt/sqlanywhere17/samples"
export SQLANYSAMP17

# the following lines add SA binaries to your path.
PATH="$SQLANY17/bin64:$SQLANY17/bin32:${PATH:-}"
export PATH
NODE_PATH="$SQLANY17/node:${NODE_PATH:-}"
export NODE_PATH

# the following lines are required to load the various shared objects of SA
PATH="$SQLANY17/bin64/jre180/bin:${PATH:-}"
LD_LIBRARY_PATH="$SQLANY17/bin64/jre180/lib/amd64/client:$SQLANY17/bin64/jre180/lib/amd64/server:$SQLANY17/bin64/jre180/lib/amd64:$SQLANY17/bin64/jre180/lib/amd64/native_threads:${LD_LIBRARY_PATH:-}"
export PATH
[ -z "${JAVA_HOME:-}" ] && JAVA_HOME="$SQLANY17/bin64/jre180"
export JAVA_HOME
LD_LIBRARY_PATH="$SQLANY17/lib32:${LD_LIBRARY_PATH:-}"
LD_LIBRARY_PATH="$SQLANY17/lib64:${LD_LIBRARY_PATH:-}"
export LD_LIBRARY_PATH

このファイルを読み込むことで必要な環境変数が設定されます。bashなどであれば以下の様な感じですね。









$ source /opt/sqlanywhere17/bin64/sa_config.sh

もちろんこのファイルを読み込まず同義の環境変数やパス類を設定しても構いません。SQL Anywhereを起動させるにはこの環境変数類が必要です。管理を行うOSユーザーの.bashrcなどに組み込んでログイン時に読まれるようにしてしまっても良いかもしれません。


 

SystemdとSysVinit


Linuxでサービスとして起動させる場合、かつてはSysVinit、現在はSystemdを使うことが多くなったように思います。これはお使いのLinuxディストリビューションによって異なりますので調べていただくことが必要です。比較的新しいディストリビューションはsystemdを使用していると思われます。SAP SQL AnywhereのLinux版に付属する"dbsvcユーティリティ"はVer.17ではSystemdで使用するServiceファイルを作成する機能があります。それ以前のバージョンのものはSysVinitに対応します。



Ver.17 - dbsvcユーティリティ


このユーティリティはSystemdで使用するServiceファイルを作成します。


http://dcx.sap.com/index.html#sqla170/ja/html/813df9e16ce21014bf5cdf75390e9c94.html


使用方法としてはまずdbsrv17/dbeng17で起動できるデータベースファイルと起動に使用するコマンドパラメータを用意してください。











dbsrv17/dbeng17 <options> <dbfile>

*<options>と<dbfile>の部分をメモしておいてください。

この部分をパラメータとして使用します。


そして/etc/init.dに書き込み権限を持ったユーザー、もしくはrootユーザーで先に解説したSQL Anywhere用の環境変数を設定したSSHなどのセッションを用意してください。最近はsudoで行う場合が多いようなので


















$ sudo bash

root # source /opt/sqlanywhere17/binXX/sa_config.sh

*XXは32か64で使用するビット数のものを選びます。
太字はLinuxのコマンドプロンプトと思ってください。



としてrootユーザーのShellを用意しても良いでしょう。そしてdbsvcコマンドを実行します。基本は以下です。









root # dbsvc -a <ユーザー名> -t <network|personal> -w <サービス名> <options> <dbfile>

<ユーザー名>:dbsrv17/dbeng17プロセスを実行するユーザー名です。通常実行しているユーザー名を指定するのが良いでしょう。


<network|personal> :dbsrv17かdbeng17かの選択です


<サービス名>:Systemd上で使用するサービス名です。自動的に「SA_」が先頭に付きます。


<options> <dbfile>:先にメモしたdbsrv17/dbeng17で起動時に使用しているパラメーターです


例:






root # dbsvc -a ubuntu -t network -w demo -n demo -o /home/ubuntu/database/serverlog.txt /home/ubuntu/database/demo.db
SQL Anywhere Service Utility 17.0.10.6127
Creating SQL Anywhere service: demo File: /lib/systemd/system/SA_demo.service

注意:Linux側にpkg-configパッケージがインストールされていないとエラーになります。
apt install pkg-configなどで事前にインストールしておいてください。

コマンド出力にあるように/lib/systemd/system/以下にserviceファイルが作成されます。このファイルは以下のようなものです。



[Unit]
Description=SQLAnywhere Network demo service
After=syslog.target network.target local-fs.target

[Service]
Type=forking
Nice=0
User=ubuntu
PIDFile=/run/SA_demo/service.pid
Environment="TMP=/tmp/\x2eSQLAnywhere"
Environment="ODBCINI="
Environment="PIDFILE=/run/SA_demo/service\x2epid"
Environment="SERVICENAME=demo"
Environment="SVC_IFACE=systemd"
Environment="SQLANYDIR=/opt/sqlanywhere17"
Environment="BIN=bin64"
Environment="BITNESS=64"
Environment="DBSVC_TYPE=network"
Environment="SVC_TOOL_CMDLINE='-n' 'demo' '-o' '/home/ubuntu/database/serverlog.txt' '/home/ubuntu/database/demo.db' '-ud' "
ExecStartPre=-/bin/rm -f "/run/SA_demo/service\x2epid"
ExecStopPost=/bin/rm -f "/run/SA_demo/service\x2epid"
ExecStart=/opt/sqlanywhere17/bin64s/dbsvc RUNSERVICECMD start

# INPUTCMD=dbsvc '-a' 'ubuntu' '-t' 'network' '-w' 'demo' '-n' 'demo' '-o' '/home/ubuntu/database/serverlog.txt' '/home/ubuntu/database/demo.db'

このファイルが出来たらこのファイル経由で起動できるか確認してください。以下のようにして確認します。なお、サービスとしての起動方法や確認方法も以下です。









*dbsvcを実行した後であれば一応 systemctl daemon-reload 」で再読み込みを行ったほうが良いです。

起動:








root # systemctl start SA_demo

です。ここで指定するサービス名は 「SA_」+dbsvcの-wで指定した名称 です。

起動しているかの確認:








root # systemctl status SA_demo

で行います。下記のように表示されactiveかどうかを確認出来ます。






SA_demo.service - SQLAnywhere Network demo service
Loaded: loaded (/lib/systemd/system/SA_demo.service; enabled; vendor preset:
Active: active (running) since Tue 2020-05-19 07:30:53 UTC; 8s ago
Process: 26239 ExecStopPost=/bin/rm -f /run/SA_demo/service.pid (code=exited,
Process: 26261 ExecStart=/opt/sqlanywhere17/bin64s/dbsvc RUNSERVICECMD start (
Process: 26258 ExecStartPre=/bin/rm -f /run/SA_demo/service.pid (code=exited,
Main PID: 26847 (dbsrv17)
Tasks: 25
Memory: 11.3M
CPU: 1.716s
CGroup: /system.slice/SA_demo.service
mq26847 /opt/sqlanywhere17/bin64s/../bin64/dbsrv17 -n demo -o /home/u

※この他にもps -ef| grep dbsrv17などで実際のプロセスが存在するか確認すると良いでしょう。


終了は






root # systemctl stop SA_demo

です。



自動起動させるには?


この作成されたServiceを自動起動させるには少々加工が必要です。
そのまま systemctl enable SA_<サービス名>  では自動起動は有効にならないことに注意して下さい。


具体的には



[Unit]
Description=SQLAnywhere Network demo service
After=syslog.target network.target local-fs.target

[Service]
Type=forking
Nice=0
User=ubuntu
PIDFile=/run/SA_demo/service.pid
Environment="TMP=/tmp/\x2eSQLAnywhere"
Environment="ODBCINI="
Environment="PIDFILE=/run/SA_demo/service\x2epid"
Environment="SERVICENAME=demo"
Environment="SVC_IFACE=systemd"
Environment="SQLANYDIR=/opt/sqlanywhere17"
Environment="BIN=bin64"
Environment="BITNESS=64"
Environment="DBSVC_TYPE=network"
Environment="SVC_TOOL_CMDLINE='-n' 'demo' '-o' '/home/ubuntu/database/serverlog.txt' '/home/ubuntu/database/demo.db' '-ud' "
ExecStartPre=-/bin/rm -f "/run/SA_demo/service\x2epid"
ExecStopPost=/bin/rm -f "/run/SA_demo/service\x2epid"
ExecStart=/opt/sqlanywhere17/bin64s/dbsvc RUNSERVICECMD start

# INPUTCMD=dbsvc '-a' 'ubuntu' '-t' 'network' '-w' 'demo' '-n' 'demo' '-o' '/home/ubuntu/database/serverlog.txt' '/home/ubuntu/database/demo.db'

[Install]
WantedBy=multi-user.target

上記のようにファイルの一番後ろに[Install]エントリとWantedByエントリを追加します。


※このServiceファイルの内容についてはLinux側のマニュアルや各種解説サイトをご参照の上設定いただければと思います。例えばアプリケーションの起動前にSAP SQL Anywhereが起動していなければならないなどの要件がある場合は必須です。この例では一番一般的な例になるのではないかと思われるものを設定しています。


そしてその後、









root # systemctl enable SA_demo

で、サービスを有効化します。


OSを再起動させてみましょう。psコマンドでdbsrv17/dbeng17プロセスが起動していれば完了です。


 

補足


上記の例ではdbsrv17/dbeng17への引数をそのままdbsvcへの引数として使用しましたが、サービス化する場合は設定ファイルを使用することを検討してください。そうしないとデータベースの設定パラメータ変更時にサービスファイルを編集する必要が発生します。設定ファイルを読むように設定すればそちらを読むことになりますのでサービスファイルは無編集で変更を反映させることが出来ます。



まとめ


Linuxでは自動起動させる方法は多数存在します。そのOS(ディストリビューション)によってはもっと簡単な方法があるかもしれませんのでOS側のマニュアルも確認の上どの方法を使用するか検討してください。