SQL Anywhere データベースサーバの自動起動
目的
このページでは、SQL Anywhereデータベースとデータベースサーバを自動起動する際に役立つ情報を提供します。
概要
様々なデータベースシステムに接続する場合、一般的な接続の枠組みとして、クライアントがデータベースに接続する前に、データベースサーバとデータベースを起動する必要があります。これはSQL Anywhereの典型的な接続シナリオです。
しかし、SQL Anywhereは自動起動と呼ばれるコンセプトもサポートしています。これはクライアントアプリケーションが十分な情報を与えていれば、データベースやデータベースサーバを見つけられない場合、動的に起動することができます。
これにより、データベースサーバが事前に起動されていなくても、クライアントアプリケーションを起動して実行することができます。
さらに、データベースやサーバを自動起動したアプリケーションが切断されると、データベースやデータベースサーバは自動的にシャットダウンすることができます。
(システムリソースを使用する)データベースサーバも常にシャットダウンすることで、管理が容易になり、アプリケーションは必要に応じてデータベースを使用できます。
自動起動機能は下記のクライアントアプリケーションプログラミングインターフェース(APIs)でSQL Anywhere データベースサーバへ接続した場合のみ使用可能となります。
- ESQL
- ODBC
- ADO.NET
- OLE DB
- JDBC (SQL Anywhere JDBC ドライバを使用)
Sybase Open ClientやjConnectを使用した SQL Anywhere サーバへの接続では、サーバを自動起動できない別のプロトコル(Tabular Data Stream(TDS))と接続メカニズムを使用します。本書は、これらのタイプの接続には当てはまりません。
データベースへの接続
SQL Anywhereデータベースへの接続は、2つのステップからなる処理です。
SQL Anywhereクライアントは、最初にデータベースサーバに接続する必要があります。
SQL Anywhere 12以前では、クライアントは CommLinks (LINKS) および EngineName (ENG) パラメータを使用して、検索するサーバと検索方法を決定します。
SQL Anywhere 16(および、それ以降)では、EngineNameの代わりに ServerName (SERVER) パラメータを使用する必要があります。
サーバレベルの接続が確立されると、クライアントはサーバに必要なデータベース(通常は DatabaseName(DBN) 接続パラメーターを使用)、
使用するユーザーID、および要求されたユーザーIDのパスワードを伝えます。 データベースが使用可能で認証が成功すると、サーバはデータベース接続を完了します。
クライアントアプリケーションは、データベース上でSQL文を自由に実行できます。
要求されたデータベースサーバまたはデータベースのいずれかが実行されていない場合、クライアントはそれらを自動起動しようとします。
接続処理の2つのステップに対応する自動起動には、データベースサーバの自動起動とデータベースの自動起動の2種類があります。
この2つの重要な違いの1つは、データベースサーバの自動起動の場合はクライアントソフトウェアが作業を行い、データベースの自動起動の場合はサーバソフトウェアが作業を行い、クライアントにとって透過的な処理であることです。
各タイプの自動起動については後述します。
データベースサーバが自動起動されると、該当するデータベースもそのサーバ上で自動起動されます。
わかりやすくするために、本書の「サーバの自動起動」とは、サーバとデータベースの自動起動を意味します。
実行中のデータベースに接続しなくても、サーバに接続してSQL文を実行できるようにすると便利なことがあります。
SQL Anywhereサーバはユーティリティデータベースを実行できます。ユーティリティデータベースは、データベースサーバの起動時に常に使用可能な仮想データベースです。
通常、ユーティリティデータベースは自動起動されます。 ただし、ルールとアクセス許可は実際のデータベースとは少し異なります。
ユーティリティデータベースの使用方法については、マニュアルの「ユーティリティデータベース」を参照してください。
サーバの自動起動
サーバが見つからなかったために接続が失敗した場合、クライアントは指定された接続パラメータを調べて、サーバの自動起動が可能かどうかを判断します。
つまり、適切なデータベースでサーバ実行可能ファイル(サーバの起動と呼ばれる)を起動してから接続します。
サーバを自動起動するには、データベースファイルをクライアントアプリケーションと同じ物理コンピューターに配置する必要があります。
リモートファイルの使用を参照。
さらに、クライアントライブラリによっていくつかの前提が設定されています。
- リモートコンピュータに存在する可能性のあるサーバに接続しようとしている場合(たとえば、LINKSでSharedMemory以外のプロトコルを指定した)、
そのようなサーバが見つからない場合は、サーバの自動起動を望まないとみなされます。 - DBFパラメータを使用してデータベースファイルのファイル名を指定しないと、サーバの自動起動を望まないとみなされます。
これらの前提条件は、サーバを自動起動するための次の条件を示しています。クライアントライブラリは、次の条件がすべて当てはまる場合にのみ、サーバの自動起動を試みます。
- Autostart (ASTART) パラメータが NO にセットされていない。
- LINKSパラメータにSharedMemoryがセットされているか、すべてが設定されていない。
- StartLine(START)および/またはDatabaseFile(DBF)接続パラメータが設定されています。
クライアントライブラリがサーバを自動起動しようとすると、サーバ起動コマンドが作成されます。
STARTパラメータが指定されている場合、ライブラリはそれで始まります。
それ以外の場合、コマンドはパーソナルサーバの実行可能ファイルの名前です。
たとえば、Windowsプラットフォームでは、16.0のクライアントはdbeng16.exeをデフォルトの開始行として選択します。
その他のパラメータは、他の接続パラメータ(Autostop、DatabaseKey、DatabaseFileなど)に応じて開始行に追加されます。
接続パラメータの詳細については、付録1を参照してください。
接続パラメータからサーバのコマンドラインへのマッピングは、次の図に従って行われます。
パラメータ | 短縮形 | 開始されるサーバのユーザ |
Autostop | ASTOP | デフォルトでは、コマンドラインに-ga サーバオプションが追加され、最後のデータベースが終了したときにシャットダウンするようにサーバーに指示します。 ASTOP = NOの場合、このオプションは付加されません。 |
DatabaseFile | DBF | 開始されるデータベースファイルの名前。 |
DatabaseKey | DBKEY | 開始されるデータベースファイルの暗号化キー。 -ekデータベースオプションを使用してコマンドラインに追加されます。 |
DatabaseName | DBN | 開始されるデータベースのデータベース名。 -n データベースオプションを使用してコマンドラインに追加されます。 |
DatabaseSwitches | DBS | コマンドラインに追加されるデータベースオプション(データベースファイルとキーの後、データベース名の前)。 |
ServerName | SERVER | 開始されたサーバに使用されるサーバ名。 データベースファイルの前に-n サーバオプションを使用してコマンドラインに追加します。 |
StartLine | START | 開始される実行可能ファイル、およびオプションで追加のサーバオプションを指定します。 |
たとえば、クライアントライブラリに接続文字列fragmentが指定されているとします。
…;ENG=sales;DBF=Sales.db;DBN=q1;DBKEY=EncKey;DBS=-r;…
salesという名前のサーバが見つからない場合、クライアントライブラリは次のコマンドを生成しようとします。
dbeng16 -ga -n sales Sales.db -ek EncKey -r -n q1
サーバが起動されると、クライアントライブラリは、サーバが接続を受け入れる準備が整うまで待ってから、再接続を試みます。
STARTパラメータを使用して、異なる実行可能ファイル名を指定したり、追加のサーバオプションを加えることができます。
たとえば、アプリケーションがローカルサーバへ多数の接続を行い、パーソナルサーバの10接続制限がこれを許可しないとします。
ネットワークサーバにはこのような制限がないため、パーソナルサーバではなくネットワークサーバを作成することができます。
ただし、リモートコンピュータ上のクライアントが作成した後でこのサーバに接続できるようにしたくないとします。
これを行うには、クライアントライブラリにネットワークサーバを自動起動させ、次の接続文字列フラグメントを使用して
(TCP / IPを無効にする)-x noneオプションを指定します(接続文字列全体はスペースのため引用符で囲まなければなりません ):
“…;START=dbsrv16 -x none;…”
データベースの自動起動
クライアントがサーバを検出したが、探しているデータベースが実行されていない場合、サーバはクライアントが(接続文字列を使用して)データベースの起動方法に関する情報を提供しているかどうかを確認します(「接続パラメータ」を参照)。
このとき、自動起動が許可されているならばサーバはデータベースを起動しようとします。 データベースが実行されると、サーバはまるでデータベースがすべて実行されているかのように接続要求を完了します。
デフォルトでは、自動起動されるデータベースはAutostopモードになります。つまり、そのデータベースへの最後の接続が閉じられると、データベースは自動的にシャットダウンします。
Autostopモードは、接続文字列の一部としてASTOP = NOを指定することで無効にすることができます。
接続パラメータ
データベースを自動起動するには、サーバは少なくとも1つの情報(データベースファイル名)を知る必要があります。
これは、DBF接続パラメータを介してサーバに与えられます。
ファイル名はサーバのカレントディレクトリからの相対パスでなければならないことに注意することが重要です。
これには2つの意味があります。
- アプリケーションのカレントディレクトリに sales.db というファイルが含まれていても、実行中のサーバのカレントディレクトリが異なる場合は、単に接続文字列の一部として DBF = sales.db を指定することはできません。
そうした場合、サーバは「指定されたデータベースが見つかりません」というエラーを報告するか、さらに悪いことに間違ったデータベースを起動しようとする可能性があります。 - 接続先のサーバが別のコンピュータで実行されている場合、クライアントアプリケーションのローカルデータベースを起動することはできません。
「リモートファイルの使用」を参照してください。
データベースの自動起動時に便利な4つの接続パラメータがあります。
- DBKEY – 起動するデータベースで強力な暗号化が行われている場合は、暗号化キーも指定する必要があります。
これは、DBKEY接続パラメータを使用して行います。 - DBN – デフォルトでは、データベースエイリアスは拡張子のないデータベースファイル名と同じです。
たとえば、データベースファイルが sales.db の場合、データベース名は sales です。
別のデータベース名を使用するには、DBN接続パラメータを指定します。 - DBS – 追加のデータベース固有のオプション (-ek と-n 以外のもの – DBKEYとDBNを使用する以外)を指定する必要がある場合は、DBS接続パラメータを使用できます。
- ASTOP – このパラメータが NO に設定されている場合、データベースは最後の接続が終了した後も実行を継続します。
DBF、DBKEY、DBS、およびASTOP接続パラメータは、必要な場合にのみ使用されることに注意することが重要です。
データベース名と一致するデータベースがすでに実行されている場合、クライアントはそのデータベースに接続し、データベースは自動起動されません。
パーミッション
デフォルトではパーソナルサーバ (dbeng16) はデータベースの自動起動を許可していますが、ネットワークサーバ (dbsrv16) はそうではありません。
これはネットワークサーバに接続し、探しているデータベースが実行されていない場合、サーバはデータベースの自動起動を拒否し、クライアントアプリケーションにエラーが発生することを意味します。
これは、-gdオプションを使用して変更できます。 パーソナルサーバのデフォルトは -gd all、ネットワークサーバのデフォルトは -gd dbaです。
注意:ただし、-gd オプションは自動起動だけでなく、データベースの起動を制御します。
サーバのデフォルトの -gd dba は、ユーザーが DBA 権限を持つユーザーとしてデータベースにすでに接続されている場合にのみ、
ユーザーが(START DATABASEステートメントで)新しいデータベースを起動できることを意味します。
これは、ユーザーが接続文字列を送信するときにデータベースに接続されていないため、自動起動には適用されません。
つまり、-gd all はデータベースの自動起動を許可しますが、他の設定では許可されません。
例
以下のすべての例では、waterloo というサーバに接続し、sales.db というデータベースを起動します。 各例では、関連する接続パラメータを含む接続文字列が示されています。
これらのすべてのケースで、一致するデータベース名を持つデータベースが waterloo サーバ上ですでに実行されている場合、クライアントはそのデータベースに接続し、データベースは起動されません。
例1: sales.db はサーバのカレントディレクトリにあります。
…;ENG=waterloo;DBF=sales.db;…
例2: sales.db はサーバコンピューターのc:\databases サブディレクトリにあり、強力な暗号化が行われています。暗号化キーは abcd です。
…;ENG=waterloo;DBF=C:\databases\sales.db;DBKEY=abcd;…
例3: sales.db は読み込み専用モード(database -r optionを使用)で起動されています、そしてデータベース名に sales_ro がセットされています。
…;ENG=waterloo;DBF=sales.db;DBN=sales_ro;DBS=-r;…
ユーティリティデータベース
ユーティリティデータベースはすべてのSQL Anywhere serverで使用可能な仮想データベースです。
このデータベースは(それを格納するデータベースファイルがないので)データを持っていません、しかし、実際のデータベースに接続できない場合は、特定のSQLステートメントをサーバ上で実行することが可能です。
ユーティリティデータベースに接続するには、接続文字列でDBNに utility_db を指定する必要があります。
ユーティリティーデータベースは、START DATABASE SQLステートメントを使用して起動することも、サーバの開始行で起動することもできません。 それを起動する唯一の方法は、それを自動起動することです。
ユーティリティデータベースは、接続文字列にDBN = utility_dbを指定することで自動起動できます。ユーティリティデータベースがすでに実行されている場合は、そのデータベースに接続されます。 もしそうでなければ、それは自動起動されるでしょう。
接続がなくなってもユーティリティーデータベースをシャットダウンしたくない場合、AUTOSTOP = NOを指定することができます。
ユーティリティデータベースは、-dオプションを指定するか、STOP DATABASE SQLステートメントを使用してdbstopを使用してシャットダウンするか、サーバがシャットダウンすると自動的にシャットダウンされます。
実行中のサーバがない場合は、他のデータベースと同様にutility_dbを実行しているサーバを自動起動できます。 DBN = utility_db のみを指定し、DBFを指定しないでください。
例:
…;ENG=waterloo;DBN=utility_db;UID=dba;PWD=sql;…
サーバの自動起動はSTART と DBF のどちらも指定されていない場合に限り成功します。
START パラメータを指定しないと、クライアントはパーソナルサーバを起動します。
デフォルトでは、パーソナルサーバ上の utility_db のパスワードは存在しないため、PWD パラメータの任意の値が機能します。
パーソナルまたはネットワークサーバで utility_db パスワードを設定するには、server -su オプションを使用します。
START パラメータを使用すると、ネットワークサーバを自動起動し、ユーティリティデータベースのパスワードを指定できます。
例:
“…;ENG=waterloo;DBN=utility_db;START=dbsrv16 -su secret;UID=DBA;PWD=secret…”
サーバの -su オプションで指定したのと同じパスワードを PWD フィールドに必ず入力してください。
また、START パラメータ値のスペースのため、接続文字列全体を引用符で囲む必要があります。
リモートファイルの使用
リモートコンピュータ上のデータベースファイルを起動することはサポートも推奨もされません。しかし、サーバがリモートコンピュータ上のでデータベースを起動することは可能です。
例:WindowsでUNC形式のファイル名を使うことができます、また。Linux上ではNFSマウントされたボリューム上のファイルを使うことができます。
リモートデータベースファイル
リモートデータベースの実行はパフォーマンスの低下、データの破損、サーバの不安定を招きます。
データベースファイルはサーバと同じ物理コンピュータ上に置くか、SAN設定を介してアクセスする必要があります。
まとめ
SQL Anywhereクライアントがデータベースへの接続を試みるとき、期待するサーバが見つからない場合、クライアントソフトウェアは自動的にサーバとデータベースを起動できます。
サーバが検出されたがデータベースが実行されていない場合、サーバは自動的に正しいデータベースを起動して接続を完了できます。
いずれの場合も、自動的に起動されるサーバやデータベースは、デフォルトでは最後の接続が閉じられると自動的にシャットダウンされます。
このページは、以下の英語ページの抄訳です。
Autostarting SQL Anywhere Databases and Servers