Ingres データベース活用研究

ホーム > Ingres インデックス > 概要 >

■ 概要

 2004/05 に、CA(Computer Associates International) が、Ingres を
オープンソース化する事を発表しました。
また、実際に、2004/08/04 付けで、同社ホームページにて、ソースコードと、Linux 用の
評価版が公開されました。
(2004/12/22 時点で、Linux と、Windows の RC 版が公開されています)

CA Open Source Project Site - Ingres

日本国内においては、あまり反響は無かったようですが、
私のように、長年、数少ない日本国内のユーザーとして、使ってきた者にとっては、
驚きと同時に、多少の期待もあります。
今後の展開にも注目していきたいと思います。

Ingres の特徴を挙げれば、これまでオープンソースとして公開されている、
どのデータベースよりも、スケーラビリティ(大規模なシステムへの適用)と
可用性で、優れていると思われます。
例えば、大企業(従業員 1,000人以上)の基幹システムにも使える性能と、
機能を既に持っています。

さらに、今回のオープンソース化と併せて、クラスタリングへの対応が
図られているようです。これは、Oracle9i 以降のクラスタリング(RAC)と同等のものを
目指していると述べられています。
(かなり昔から、OpenVMS 上では、クラスタ環境をサポートしていた)

現状でも、Ingres は、DB2、Oracle、SQL Server(Enterprize) に匹敵する性能と
機能を持っています。
これが、無償で使えるとなれば、これまで、オープンソースの適用が難しかった、
全社展開するような業務システムの分野でも、高価な商用 RDBMS を使わずに、
システムを構築できる機会が、増すものと思われます。

なお、CA は、商売を諦めた訳ではなく、「有償サポート」というメニューを
用意しているようです。料金設定の詳細についてはわかりませんが、
必要なサポートに対する対価であるならば、それは結構な事かと思います。
少なくとも、ソースが公開されていれば、「サポート切れ」等の心配から
解放されます。

私は、「全てのケースで、同じデータベース製品を使う事が望ましい」、
というような考えは持っておりません。
例えば、Windows 環境で、ちょっとした情報共有なら、
MS SQL Server(または、MSDE) が最適だと思います。
管理も簡単ですし、特別なチューニングを行わなくても、そこそこの性能が出ます。
Office 製品との親和性も良いです。
Linux(UNIX)なら、MySQL、PostgreSQL が良いと思います。 
MySQL や、PostgreSQL は、いろいろなツールとの組み合わせで、使われる実績が多く、
ともかく、情報が豊富です。

しかし、それ以上になると、どうでしょう?
「Windows サーバーは、メモリリークを良く起こし不安定だから、
UNIX(Linux)を使いたい」とか、「ユーザーが増えたので、2GB 以上の
メモリを使いたい」とか、「信頼性を上げる為に、クラスタやレプリケーション構成
にしたい」「負荷を下げる為に、分散データベース構成にしたい」とか、そうなると、
突如として、技術的にも、金銭的にも、大きなものになりがちです。

昨今の、サーバーのハードウエア価格は、非常に安くなりました。
OS も、Linux のように、安価で、安定性のある環境が手に入ります。
ハイエンドの DBMS 製品だけが、依然割高だと思うのは、私だけでしょうか?
Ingres はまさに、そういった用途に使うのに、現状では適していると思います。

発表後も、特に有益な情報が、日本国内で見つからないので、
私の経験も踏まえて、このページを作成し、皆様に、少しでも
興味を持っていただけたらとの思いで、公開する事に致しました。
また、もし、有益な情報等がございましたら、ぜひ、御一報をお願い致します。

ここでは、Redghat 9.0 での Ingres の使い方を中心に、機能の概要を紹介して
いきたいと思います。
また、Windows 版も公開されていますので、管理ツールは、Windows 版に付属する
GUI ツールも使って、初めての方でも、解り易く解説していきたいと思います。

■ インストール(Windows編)

  2004/09/20 付けで、WINDOWS バイナリのベータ版が公開されました。
 CA の Ingres オープンソースプロジェクト から Linux 版と同様に、ダウンロードできます。

  ※ 2004/12/22 付けで、RC 版が公開されています。

ここでは、Windows2000(Pro) 環境にインストールしてみました。
インストール自体は非常に簡単です。

ZIP で圧縮されたファイルを展開し、フォルダーの Install.exe を実行するだけです。

インストールしたユーザー(例えば、"Administrator")が、Ingres の"システム管理者"
として登録されます。
("Administrator" である必要はありません。むしろ、UNIX との相互運用を
考えた場合、"ingres" というユーザーを作成して、特権を与えたほうが良いでしょう)

(注意)インストールに先立って、
「ローカル セキュリティの設定」を確認しておく必要があります。
そうしないと、インストールは正常でも、後で、リモートマシンから、
ユーザー認証が行えず、接続できません。

「管理ツール」
  「ローカル セキュリティの設定」
    「ユーザー権利の割り当て」
      「オペレーションシステムの一部として機能」

で、インストールするアカウントが登録されているか確認します。
※「Administrator」であっても、登録されていない場合があります。
言語も "Japanese"、文字コードも "SJIS" が選択できます。 上記の私の環境では、全て正常にインストールされ、インストール後に、 サーバーも起動されました。 「Ingres Visual Manager」を起動して、プロセス(サービス)の状況を 確認できます。 サーバーを起動(停止)するには、上記の他に、「Ingres Service Manager」でも行えます。 サーバーは、"アプリケーション"として動かす事も、"サービス"として動かす事も出来ます。 一般的には、"サービス"で動かすだろうと思います。(ログアウト後も稼動を続ける必要がある) 「停止」の際に、現在のセッションを "kill" するかどうかの選択があります。 "特に重要なユーザージョブ"が動いていない限り、"kill" するで良いと思います。
"kill" にしないと、監視クライアント等が動作していると、いつまで待っても停止できません。
"kill" したからといって、データが不整合になるような事は決してありませんので、ご安心下さい。

■ インストール(Linux & RPM編)


 Ingres のファイルは、以下から入手できます。

 CA の Ingres オープンソースプロジェクト 

ユーザー登録が必要ですが、無料ですし、ユーザ名と、E-Mail 程度の簡単な情報です。

2004/08 現在では、全ソースと、Linux 用(i386)の RPM ファイルが公開されています。
(2004/11/03 現在は、GA 版になっています)
ソースは、tar ボールで、80MB 程度あります。
ここでは、RPM ファイルを使ってインストールする例をご紹介します。

Ingres の製品自体は、Windows、UNIX、OpenVMS 等、多くのプラットフォームに
対応していますし、日本語等のマルチバイトにも対応しています。

ただ、オープンソースで公開するにあたっては、ビルド方法を構築し直しているようで、
Linux、Windows を皮切りに、順次対応していくようです。
また、2004/09 の RC1 版までは、日本語に対応していませんでしたが、
GA 版で、日本語も使えるようになりました。

注意)日本語を使いたい方は、ソースからビルドして下さい。
ここで試した限り、RPM では、2004/11/01 の GA 版でも日本語は有効にならないようです。
別に方法があるのかも知れませんが...。
まず、個々のファイルを個別にダウンロードするか、 tar ファイルをダウンロードして、展開します。 Ingres のサーバーを実行するアカウントとして、"ingres" というユーザーを 作成しておきます。 RPM のインストール自体は、root 権限で行う必要があります。 RPM のインストールに先立って、ingres-CATOSL スクリプトを実行し、ライセンスの 許諾をする必要があります。
# ./ingres-CATOSL
次に、一つ一つ RPM をインストールする変わりに、スクリプトを実行する事で、 簡単にインストールできます。 日本語を使う場合は、設定を先に行っておく必要があります。
$ export II_TIMEZNE_NAME=JAPAN
$ export II_CHARSET=kanjieuc
続いて、
# ./ingres_express_install
メッセージで、正常にインストールされた事を確認します。

■ Linux でのインストール後の利用環境設定


 ここでは、インストール直後の環境設定について解説します。

管理者として、"ingres" アカウントでログインします。

インストール直後では、データベースサーバーは既に稼動しているはずです。
RPM 版でインストールした場合、/etc/rc.d/init.d/ingresII というスクリプトが
登録されますので、マシンを再起動した場合でも動作しているはずです。
もし、稼動していないようなら、以下の環境設定を行った後に、
ingstart コマンドでも起動する事が出来ます。
まず、ユーザの環境変数の設定を行います。 (ここでは、bash を使う場合を例示します) "ingres" ユーザのログインディレクトリには、既に、.ingIIbash というスクリプトが 作成されているはずです。 これを、ログインスクリプト内で、実行するようにします。
$ ls -a
$ vi ~/.bash_profile
source .ingIIbash の行を追加します。 これで、Ingres の環境変数と、コマンド等へのパスが設定されます。 データベースを使用する、他のユーザについても、同様に行う必要があります。 では、テストしてみましょう。 何でも良いのですが、ここでは、"sql" という、「対話型 SQL モニタ」を 起動してみます。
$ sql iidbdb                                         
INGRES TERMINAL MONITOR Copyright 2004 Computer Associates Intl, Inc.    
Ingres Linux Version II 3.0.1 (int.lnx/101) login                        
Thu Nov 11 21:04:40 2004                                                 
                                                                         
continue                                                                 
* \q                                                                     
Ingres Version II 3.0.1 (int.lnx/101) logout                             
Thu Nov 11 21:04:53 2004                                                 
プロンプト「*」が表示されれば正常です。 終了は、"\q" を入力して下さい。 その他に、Ingres のサーバーの明示的な起動は、 $ ingstart 停止は、 $ ingstop で行えます。

■ データベースの作成

  インストール後に、使用するにあたって、最初にデータベースを作成する必要があります。

インストール時に作成されている "iidbdb" 等のデータベースは、システム用で、
通常、直接更新する事はありません。
Ingres では、"データベース"は、複数作成できます。
ただし、同じサーバー上であっても、異なるデータベースのデータを、
同じセッション(接続)ではアクセス出来無いので注意して下さい。
例えば、部門ごとにデータベースを分けるというような使い方は、
共通なデータの参照が困難になるので、なるべく避けたほうが良いです。
Windows 版には、ビジュアルツールが付いていますので、 Ingres が初めての人でも、比較的簡単に操作できます。 Linux 上で動作しているサーバーも、操作出来ます。 コマンドで行いたい場合は、この章の終りを参照して下さい。 データベースの作成は、「Visual DBA」というツールを使います。 「Nodes」を展開して、「{local}」を選択し、「Connect/DOM」を実行します。
Linux 上のサーバー、または、別のホストで稼動している、
Ingres を操作する場合は、「vnode」を登録する必要があります。
登録後、「local」の代わりに vnode 名 を選択します。
続いて、「Database」タブを右クリックして、「Create...」を選択します。 以下のダイアログが表示されます。 必須なのは、「Database Name」だけです。 項目だけ見ておきますと、ページサイズは、デフォルトで、2KB です。 (8KB 程度にしておくほうが無難ですが、後で変更は可能です) ABF(4GL開発環境) 等、使うソリューションのシステムカタログ(テーブル)も 生成します。必要無いものもありますが、特に気にしなくても良いでしょう。 Database や Journal(更新履歴)等のロケーション(物理ファイルの作成場所) を論理名で指定できます。(後でディスクの分散配置も可能です)
Ingres の "データベース"には、オーナー(DBA)が存在します。
これは、"システム管理者"(ex. "Ingres")でもかまいませんが、
あえて権限を分けようとすれば、DBA は、別のユーザーにもできます。
この場合、先にユーザーを作成し、そのユーザーログインして
データベースを作成します。

 GUI のツールが好きでは無い場合、createdb コマンドを使って、
データベースを作成する事も出来ます。
Windows の場合、「Ingres Command Prompt」(要するに「DOS」画面)を起動します。
例えば、testdb というデータベースを作成する例では、

$ createdb testdb
とします。 また、データベースを削除する場合は、destroydb コマンドを使います。
$ destroydb testdb

■ テーブルの作成


 データベース内に、テーブルを作成してみましょう。

Windows の「Visual DBA」を使ってもテーブルの作成は出来ますが、
ここでは、より一般的に、SQL ツールを使って、SQL 文で行う方法を紹介します。

Ingres では、コンソール上で、データベースへアクセスし、SQL 文を実行する
ツールには、2つあります。

一つは、「sql」コマンド(「sql モニタ」)で、行モードの(履歴編集機能が無い)の
ツールです。
sql コマンドは、SQL 文をファイルに作成しておいて、リダイレクトを利用した、
実行に便利です。

もう一つは、「isql」コマンドで、「フォーム」ベースの全画面型のツールです。
isql では、行編集だけでなく、履歴の編集、画面のスクロール等が可能です。
「全画面」と言っても、今では、Window による、GUI が多い中で、
今更、"文字ベース"というのも何ですが、ちょっとした用途には、お手軽で、便利です。
Linux では、「フォーム」ベースのツールについては、設定が必要です。

ここでは、sql コマンドを使ってみましょう。

$ sql testdb

continue      
* create table test_t (i1 integer, a1 varchar(40));
* insert into test_t values(1,'abc');
* insert into test_t values(2,'123');
* insert into test_t values(3,'漢字');
* select * from test_t;
* commit;
* \g
* \q

+-------------+----------------------------------------+
|i1           |a1                                      |
+-------------+----------------------------------------+
|            1|abc                                     |
|            2|123                                     |
|            3|漢字                                    |
+-------------+----------------------------------------+
「sql モニタ」の内部コマンドは、バックスラッシュ(日本では、"\")文字で始まります。 簡単に、コマンドを例示します。 (ファイルに作成し、リダイレクト出来ますので、覚えるのは、この程度で十分と思います) \g 実行 \q 終了
Ingres と同じ源流をもつ、PosgreSQL でも、isql コマンドは、同じコマンドが使えます。
最近では、Oracle のように、";" での実行を好むようです。

■ コマンドツールの概要


 Ingres は、GUI ツールより、CUI ツールの歴史の長いデータベースです。
その中で、ユーザーインターフェースを容易にする方法として、
「フォーム」ベースのインターフェースが使われるようになりました。
今でも、多くのユーティリティが、この共通のインターフェースを使って
構築されています。

「フォーム」は、"curses" と同様な、画面ライブラリです。
FRS(Form Runtime System) と呼ばれ、ユーティリティに限らず、
ユーザー自身が、これを使って、アプリケーションを開発する事もできます。 
最近では、Windows で動く GUI の管理ツールもありますが、 UNIX 上では、X-Windows が不要なので、上級者の場合、このほうが便利な 場合もあります。 具体的な操作ですが、X-Windows 上の ターミナル(Kterm 等)より、 カスタマイズの容易さから、別途、Windows マシンから、「TeraTerm」を 使ったほうが、使い易いでしょう。 以後の説明は、TeraTerm を使っている事を前提とします。 isql コマンドを実行してみましょう。
$ isql testdb
コマンドは、画面下の一行にガイダンスが表示されています。 右下の">" はまだコマンドがあるという意味で、 TeraTerm の場合、[NumLock]キーで切り替えできます。 コマンドや、カッコ内が該当するキーです。 はて?[Enter]キーや、数字のキーを打っても反応しません。 これは、実際のキーと、ガイダンスの表示が一致していないせいです。 どうすれば良いかと言えば、まずは、[NumLock]キーを押して、コロン":"を表示し、 その横に、実行したい機能の文字列をそのまま打つか、Copy&Paste して、 [Enter](改行)キーを押します。 例えば、終了は、
<  File(6)  OnError(7)  LineEdit(8)  Help(PF2)  Quit(PF4)  : Quit
という感じです。 さすがにこれでは不便です。 キーマップについて説明すると、かなり複雑なので、次に示すような 設定例を使ってみていただければと思います。 キーマップの例 "例" のように設定していただくと、画面下の表示が次のように変わります。
 Go(F6)  Resume(F2)  Complete(F3)  Blank(F4)  Edit(F7)  > 
カッコ内が、キーのガイダンスです。 ユーティリティによっては、時々、() 内に適切なガイダンスが表示されない場合も ありますが、その場合には、先ほどのように、「:」を表示し、 文字列を直接入力して下さい。 Ingres のユーティリティの中には、(ABF等の)ユーザーアプリケーション開発用のものも 多く含まれています。 しかし、今更、これらを使って、アプリケーションを開発する事は、まず考えられません。 次に、本来のデータベース管理で、良く使うユーティリティを提示しておきます。 フォームに○があるのは、フォームベースのユーティリティです。
コマンド説明フォーム
accessdbユーザ登録と、データベースへの権限付与
cbfサーバーのコンフィグレーション
ckpdbチェックポイントを作成する 
copydbデータベース(テーブル)のコピー、格納するスクリプトを生成する 
createdbデータベースを作成納する 
destroybデータベースを破棄する 
ingstartデータベースサーバーの起動 
ingstopデータベースサーバーの停止 
ipmパフォーマンスモニタ
isqlSQL ターミナルモニタ
netutilIngres/NET設定
optimizedbオプティマイザの統計情報の更新 
rollforwarddbバックアップからデータベースの復元 
sqlSQL ターミナルモニタ 
unloaddbデータベースのアンロードとリロードを行う為のスクリプトを生成する 

■ ユーザー登録


 まず、最初に、Ingres の「ユーザー認証」の考え方について述べておきます。
Ingres では、「SQL Server」や「Oracle」等と違い、基本的に
「データベース認証」という考え方はありません。
(IMB の「DB2」に近いかもしれません)

つまり、Ingres で独自に、ユーザー名とパスワードを登録して、OS の認証と無関係に、
データベースを参照させる、という事はありません。
あくまで、OS の認証と連動しています。
ですので、ユーザー登録を行う場合は、サーバー OS 上で、ユーザーが登録されている
事が前提になります。

クライアントから接続する場合にも同様です。
ただし「インストールパスワード」を設定する事で、サーバーの認証ではなく、
クライアント側の認証だけで済ます事も出来ます。
(一種の"信頼関係"を結ぶと考えると良いと思います)
この場合、クライアントマシンが適切に運用されていないと、データベース全体に
セキュリティ上の大きな穴が空くことになるので、注意が必要です。
ユーザーの登録は、accessdb ユーティリティや、「Visual DBA」を使えば、 対話形式で、簡単に登録出来ます。 ここでは、あえて、Ingres のユーザー登録の仕組みを知る上で、 SQL コマンドを使ってみます。 大量のユーザー登録や、ユーザー登録を自動化する場合に便利です。 新しいユーザーを登録する場合、iidbdb データベースに接続して行います。 iidbdb は、「データベースのデータベース」と思っていただければ良いと思います。 (「SQL Server」で言えば、ちょうど、"master" データベースにあたります) Ingres のユーザーは、"接続"出来るユーザーの登録と、データベースごとの アクセス権限とは別になっています。(これも、「SQL Server」と似ています) 次は、ユーザーの作成と、そのユーザーが、testdb にアクセス出来るようにする例です。
$ sql iidbdb
* create user ユーザー名;
* grant all on database testdb to ユーザー名;
* \g
* \q
パスワードを設定していない(できない)点に注意して下さい。 ユーザー名は、あくまで、サーバー OS 上で認証されるユーザーです。 なお、サーバー OS 上に登録されていないユーザーも登録はできます。 (ネットワーク経由では、「インストールパスワード」を使えば、 使用可能な場合があります) この場合、そのサーバー上(Localhost)から、そのユーザーでアクセスする事は 出来ない訳ですが、特権ユーザーだけは、Ingres のデータベース 接続時のオプションで、ユーザーを明示して接続する事が出来ます。 例えば、
$ isql -uユーザー名
これを良く「成り代わり」と読んでいます。 これには、「Security Administrator」特権が必要になります。 (かなり強力なので、通常は付与しません) 既存の登録されたユーザーを見る場合、iidbdb の iiusers システムカタログを 参照できます。
$ sql iidbdb
* select * from iiusers
* \g
* \q

■ デーブルの作成

  Ingres のテーブルは、データベースの接続を許可されたユーザーは、
誰でも作成出来ます。
ただし、作成されたテーブルは、そのロールの下でのみ参照可能です。
例えば、ユーザー baba で作成した場青、

create table test_t ( i1 integer )

このテーブルは、baba.test_t というテーブルになります。
自分で参照する場合は、test_t だけでも参照できます。
さらに、これを、他のユーザーに参照させる事が出来ます。

grant all on baba.test_t to public
他ユーザーは、この場合、必ず、baba.test_t でアクセスする必要があります。
synonym(別名) も作成出来ますが、Ingres の synonym は、oracle で言う synonym 
とは、かなり異なります。
名前の通り、別名をつけるだけで、あくまで、"ロール名.synonym名" が定義されるだけです。
Ingres では、synonym を使う場面は少ないでしょう。
データベース所有者が作成するテーブルだけは、事情が異なります。 この場合、上記と同様に、grant まで与えると、ユーザーは、 ロール名を省略して、テーブルにアクセス出来ます。 また、その場合、もし同じ名前で、自分が作成たテーブルがある場合は、 自分の作成したテーブルの方が優先されます。 明示的にテーブルを参照したい場合は、ロール名を付ます。
これらの参照の仕組みは、SQL Server と良く似ています。
よって、共通で参照するテーブルは、データベース管理者が作成すると都合が良いでしょう。 なお、データベース管理者を、"ingres" のままにしておくと、権限が強すぎる場合があります。 Ingres システムの管理者と、各データベース管理者を分離したい場合は、 各データベースごとに、管理者を分ける事が出来ます。
Ingres は、「成り代わりオプション」が使えるので、各データベースへのアクセス権限を
間接的に持っている事になります。
逆に言えば、データベース管理者に、安易に「成り代わり権限」を与えてはなりません。

■ デーブルの作成(2)〜記憶構造〜

  Ingres のテーブルやインデックスには、データがディスク上に
格納される、記憶構造があります。
サポートしている形式は、

heap、hash、isam、btree、rtree

があります。
テーブルは全て、"heap" になっています。

Ingres 1.2 までは、テーブルにも上記の構造が適用されましたが、
現在は、無いようです。
(代わりに、"主キー"を指定した場合、その構造のインデックスが作成されます)
テーブルの参照は、SQL 文で、 help table テーブル名 で、参照できます。 主な特徴として、 hash は、主にキーアクセスしかしないデータに向いています。 isam は、データの追加や更新が、余り無いようなデータに向きます。 btreeは、データの追加や更新が起こった場合でも、索引がある程度、最適になるよう保たれます。 rtreeは、(私は、正直良くわかりませ) GIS 等の図形のように、複数の範囲で対象を絞り込みを行う用途に 適しているようです。 という事で、通常は、btree を指定するのが無難だと思います。 ・ページサイズ データは、ページ単位で管理されます。 古くは、2K バイトでしたが、現在は、2K 〜 64K まで可変です。 デフォルトでは、8K バイトまでは、自動で行われるようです。 SQL Server 2000 が、8KB である事を考えると、8K、16K あたりが適当ではないでしょうか。 パフォーマンス的な要素はともかく、ページサイズが直接影響するのは、レコードに実際に 格納できるデータの合計が、ページサイズを越えられません。(BLOB 等特殊な型は除く) 後で、変更する事も可能ですが、事前に解っていれば、作成時に指定しておいたほうが無難です。 2048、2096、8192、16384、32468、65536 が指定可能です。 例) create table test_t ( i1 integer not null primary key with structure = btree ) with page_size = 8192
char、varchar 型は、1〜32000 まで長さを指定出来ます。
ページサイズは、これより小さくてもかまいませんが、実際にデータを格納できる大きさは、
ページサイズによって制限されますので、大きめにしておいたほうが良いでしょう。
なお、cbf コマンドで、予め、データベースのデフォルトを変えておくのも良いでしょう。
16K 以上のページサイズを指定する為には、$II_SYSTEM/ingres/files/cinfig.dat で、
サーバーのメモリサイズを変更しておく必要があります。
具体的には、

ii.nfssv01.dbms.private.*.cache.p16k_status: OFF -> ON

のように変更するだけです。
テーブルの構造は、作成後、SQL の modify コマンドで変更出来ますが、 データを全て移す為の時間や、スペースが必要ですので、百万レコードを超えるような、 データ量が多い場合は、注意して下さい。

■ VisualDBA によるリモートサーバーの管理

 コマンドラインでの管理が苦手な方には、Windows で動く、VisualDBA ツール
によるリモート管理が便利かもしれません。

リモートのサーバーに接続する為には、まず「vnode」の登録が必要です。
「VisualDBA」を起動し、「Nodes」にフォーカスを当て、メニューの「Node」
「Add...」を選択します。



"ノード名"は何でもかまいません。
"リモートノード"は、ここでは、IP アドレスを直接指定しています。

正常に接続出来ると、以下のような画面が参照できます。
(Linux の Ingres サーバーに接続した状態です)




■ データ型

 以下に、Ingres が使用できるデータ型を示します。

種類型名補足
文字(固定長)c
char
nchar(character)
 
文字(可変長)text
varchar(character varying)
clob
nvarchar
 
数値(誤差なし) tinyint(integer1)
smallint(integer2)
integer(integer4)
bigint(integer8)
decimal
 
数値(近似) float(float8, doubel presision)
float4
 
バイナリbyte
byte varying
long byte(blob)
 
日付、時間date 
金額money 
文字と数字については、DBMS に携わった方には、特に説明しなくても、お解りになろうかと思います。 Ingres で、他のデータベースと大きく異なるのは、日付と時間(interval)の 取扱いです。 日付は、内部ではバイナリ形式で格納されています。 これを取り出す際には、一般には、受け側で、文字列で表現する必要があります。 これは、受け取り側(クライアント)の表示形式の指定で変わります。 日付の表示形式は、II_DATE_FORMAT 環境変数で、指定します。 デフォルトでは、"US" です。
select date('today')

1-aug-2004 
のような文字列で返ります。
$ export II_DATE_FORMAT=iso4
では、
20040801
という結果が返ります。 残念ながら、日本でお馴染みの、"2004/08/01" のようなスラッシュの付いた フォーマットは無いようです。 なお、入力に関しても、この書式が有効です。("US" 形式のものもは常に入力時も受け付けます) 例えば、II_DATE_FORMAT=iso4 なら、
select date('20040801')
select date('1-oct-2004')
でも同様に受け付けられます。 さて、日付については、歴史のある DBMS は、多かれ少なかれ、いずれも過去の仕様を引きずっている ものです。 そのせいか、ANSI SQL 標準に照らすと、SQL Server にしても、Oracle にしても、 かなり、おかしなものがありますが、Ingres は特にそれが強いようです。 利点もあるのですが、さすがに、標準に準拠しないのは、ややマイナス面があります。 Ingres には、時間型(timestamp) がありません。 date 型がその役割ももっています。 また、Ingres の日付型は、"+" と、"-" による演算が可能です。 例えば、次のような SQL を実行してみましょう。
select date('today')+date('1 days')
で、明日の日付が返ります。
select date('now')-date('today')

17 hrs 5 mins 27 secs 
というように、この場合は、時間文字列が返ります。
このように、日付を「演算子」で計算できるところが、恐らく、こういった仕様に
なったのだろうと想像します。
日付と時間を計算する四則演算関数を幾つも揃えるより、スマートだと考えたのでしょう。
もっとも、そのおかげだろうと思いますが、今だに、「ユーザー定義関数」機能が
無いのは、実装が面倒がからだと想像します。
さらに、日付に「空文字列」が許される という特徴を持っています。 これは、NULL とは別に扱われます。
日付の内部形式は、単純な、ある日時からの経過時間を持っているのではなく、
年、月、日、秒数(ms)で管理されています。
また、インターバル、日時、空白かの識別フラグを持っています。
(日付の内部形式は、アプリケーションの「動的 SQL」で取得可能です)
月と秒を別に持っている事で、次の結果が、当年が閏年か否かにかかわらず、常に正しくなります。

select date('0201') + date('1 month')

20040301
month は、日数に変換されるのではなく、"月"のまま加算され、結果が表示されるので、 閏年に関係なく、常に正しい日を返します。
日付にスペースが許される理由は良くわかりませんが、NULL 不許可(not null)で運用する 場合には、更新されたか否かの識別が出来ますので、便利です。 例えば、日付の検索で、変数に、実行時に何が入るかわからない場合でも、 select * from tableA where update_date_column > ? で済みます。何も入力されていない"日"を探す場合、"is null" と場合分けする 必要が無いので、プログラムが簡単になります。 日付の空文字は、「いかなる日付、時間より小さい」と定義されています。 経験上、Ingres でテーブルを定義する際、全て、not null にしておくと、 後で、プログラムは楽になります。(null をいちいち判断しなくて済む) 金額型については、日本の場合、"\" が付く以外は、あまり使う意味が 無いかもしれません。 小数以下をもつ通貨の場合、使うメリットが多少ありますが、 逆にそうでないと、long integer に比べ、精度桁が少ないのと、演算時に、誤差を持ちます。 (内部表現があくまで、8 byte で、小数以下2桁をもつ) money 型の表示を "$"->"\"に変える場合は、 export II_MONEY_FORMAT='L:\' export II_MONEY_PREC=0 とします。 ・型変換規則  これも、他の DBMS とかなり違います。 Ingres には、SQL の convert 文がありません。 明示的に型変換を行う関数として、型と同じ名前の関数があります。 例えば、数字を文字に変える場合、 select varchar(123) の様に出来ます。 一方、暗黙的な型変換が行われるのも特徴です。例えば、 select date('today') + '1 day' 普通の DBMS で考えれば、日付と文字の演算は"無効"ですが、 Ingres では、日付と文字の演算は、文字が日付に型変換される規則になっています。 これらは、いろいろな場合に適用されます。 select 123 + '456' \579 なぜ、money 型になるかと言えば、文字と数値の演算は、文字列は money に変換され、 money 型と他の数値型では、money 型が優先されます。 ※ あまり便利だとは思いません。型は、関数で、明示したほうが無難です。

■ ロック制御

  Ingres のロック機構は、SQL Server や、DB2 と似ています。
一応、行ロックには対応していますが、ロックリストで管理する点は
同じです。
当然、ロックのエスカレーション(ページや、テーブルロックに上がる)が起こり得ます。
ロックの競合を避ける為にも、その仕組みを知っておく事が大事です。

まず、トランザクションを処理する原則は、速やかに、ロックを解放する事です。
これは、どのようなデータベースを使っていても同じだと思います。
まれに、座席の予約システムのように、競合があるとまずい場合にのみ、
ロックをかけたまま、オペレーションを待つ、という処理が想定できますが、
その用途には、この程度の行ロック機構で、十分かと思われます。

Ingres のロック制御は、「ロックレベル」と、「読取りロックモード」の2つの
組み合わせになります。
また、ロックタイムアウトもロックを制御する要素です。

ロックレベルは、3種類あります。

    row      行単位
    page     ページ単位
    table    テーブル単位

    session  セッションのデフォルト
    system   システムのデフォルト

読取りロックモードは、3種類あります。

    nolock     ロックをかけない
    shared     共有ロック
    exclusive  排他ロック

    session  セッションのデフォルト
    system   システムのデフォルト

Ingres でのロック制御は、Set コマンドで、トランザクションでのモードを
指定します。
(対して、Oracle や、SQL Server では、select 文にロックオプションを指定します)
デフォルトでは、page 単位の shared ロックになります。
(ANSI SQL の「トランザクション分離レベル」では READ COMMITTEDです)

※ ANSI SQL を考慮して、set transaction コマンドがありますが、上記の指定の
   ほうが細かく制御できます。

それ以外では、locktimeout と、maxlocks を指定できます。
locktimeout は、一定時間(秒数)待った場合、タイムアウトエラーで、制御が
アプリケーションに戻ります。長い時間ロックが掛かる場合に有効です。

maxlocks は、ロックエスカレーションをコントロールする事が出来ます。
(ロック資源は、システムでグローバルですので、あまり大きくすると、不足します)


・ダーティリード

  ANSI SQL の分離レベルでは、「uncommitted read」での処理に当たります。
よく言われる事ですが、Ingres、それに、SQL Server や、DB2 等では、デフォルトでは、
読取りロックが shared(共有ロック) の為、ロックが掛かっていると、リストや、検索だけの処理でも
待たされる場合があります。
Oracle や、PostgreSQL、InterBase 等は、仕組み上、デフォルトで、ロックを待たずに処理が行えます。

利点である事は確かですが、同様な事は、Ingres、DB2、SQL Server でも、
ダーティリード(nolock モード)を使えば可能です。
「ダーティ」という言葉は、まだ commit されていないデータを読んでしまうので、
整合性が取れていかなったり、取り消される(rollback)かもしれないデータまで読んでしまうからです。

ロック待ちが生じないデータベースの場合、逆に、トランザクションが開始された後に 
commit されたデータは読めません。
実のところ、何かを集計する際には、過去の更新日付等を条件に入れる場合が多く、
また、検索でも、後で取り消される(rollback)事が問題になるようなケースは
まれだと思います。
ですので、個人的には、ダーティリードを多様してもかまわないと思っているのですが。
(当然、更新においては、注意が必要な事は、言うまでもありません)

Ingres で便利だと思うのは、Set コマンドで、select 文の外で指定できる点です。


■ アプリケーション開発環境の概要(ESQL、ODBC、JDBC等)

  Ingres でのアプリケーション開発には、ODBC や、JDBC といった、汎用的な
インターフェースを用いる方法と、ABF(4GL) や、ICE(Webコンテナ) のような、
Ingres 独自の開発環境を使う方法があります。

Ingres では、クライアントと通信する為の手段として、Oracle の "Net8"、
SQL Server の "TDS" に相当するもとして、"Ingres/NET" という機能があります。
クライアントから、リモートで使う場合は、先に、クライアント側に、Ingres/NET を
インストールし、"vnode 名" 等の設定をしておく必要があります。 
(JDBC、.NET の場合は、不用です)

汎用的なインターフェースとして、以下のものがサポートされています。
  • ESQL (埋め込み型 SQL プリコンパイラ)
  • ODBC
  • JDBC
  • .NET プロバイダ
  • CLI
ESQL および、CLI Ingres の埋め込み型 ESQL 言語は、一般的な、ANSI 準拠です。 ESQL は、ホスト言語により、次のプリコンパイラがあります。 主に使われるのは、ESQL/C だと思います。 esqlc Enbedded SQL for C esqla Enbedded SQL for Ada esqlcbl Enbedded SQL for COBOL esqlcc Enbedded SQL for CC++ esqlf Enbedded SQL for Fortran ※ マニュアルには、Pascal(esqlp)もあるようですが、バイナリ中には見つかりません。 ホスト言語のコンパイラは付属しませんが、ANSI 標準の コンパイラ(gcc や、VC++等)なら、問題無く使えます。 Ingres では、昔から、ESQL/C が標準的な開発言語と位置付けられて きました。
例えば、「SQL Reference Guide」では、ESQL の構文が併記されている事からも
うかがえます。
API(CLI) が公開されたのも、つい最近の、IngresII からだったと思います。
クライアントからの接続は、データベース名に、vnode 名を 付加するだけで、サーバーにアクセス出来ます。 vnode名::データベース名 ESQL/C での開発の詳細は、別の章で詳しく解説します。 Oracle で言う、"OCI" にあたる、CLI(Call Level Interface) も 用意されていますが、Ingres の ESQL/C はかなり強力なので、 まず使う必要は無いと思います。 ODBC Ingres の ODBC ドライバは、内部で、CLI(Call Level Interface) を使います。 Windows および、Linux 上でも使用する事が出来ます。 (このあたりは、特定のプラットフォームしかサポートしない、 Oracle や、Microsoft より優れています) Windows 環境での設定例を以下に載せておきます。
※ 2004/12/22 のバージョンでは、日本語がうまく使えません。
不具合の個所は、私が報告済みですので、次のバージョンでは使えるはずです。
Linux の場合は、別途、「ODBC ドライバマネジャ」が必要です。 ここでは、「unixODBC」を使った例を示します。 ※ unixODBC のインストール方法については、別途、お調べ下さい。 Ingres の ODBC ドライバは、 $II_SYSTEM/ingres/lib/libiodbcdriver.1.so です。 次に示すのは、ODBC の「データソース名」を、unixODBC の「システム DSN」に登録する例です。 "ingres" という名前のデータソースを登録します。 vnode 名は、"server" に指定するか、"server" は指定せず、"database" に、 "vnode名::データベース名" を指定するか、どちらでもかまいません。
$ vi /usr/local/etc/odbc.ini
※ RPM 等で unixODBC をインストールした場合、パスが異なる場合があります。
[ODBC Data Sources]
ingres = ingres ODBC Driver

[ingres]
driver=/opt/CA/IngresII/ingres/lib/libiiodbcdriver.1.so
server=vnodename
database=testdb
テストは、unixODBC 付属の isql ユーティリティを使います。
なお、2004.08.04 の RPM 版は、サポート言語が、"English" だけだったので、
II_LANGUAGE を下記のように設定しておかないとエラーになりましたが、
2004.09.20 版では、修正されているようです。
$ export II_LANGUAGE=English
$ /usr/local/bin/isql -v ingres
※ Ingres の isql ユーティリティと同じ名前なので、フルパスで指定します。 ユーザー名とパスワードを指定すれば、そのユーザーでも接続できます。 $ /usr/local/bin/isql -v ingres username password JDBC Java は、サーバー側で、JDBC 用プロセス(iigcd)が別途動く事から、 Ingres/NET(iigcc) とは、仕組みが異なります。 現状では、JDBC は、Type-3 のドライバに位置付けられるようです。 JDBC での開発の詳細は、別の章で詳しく解説します。 .NET プロバイダ Microsoft の .NET Framework に対応した、ネイティブなモジュールです。 サーバー側では、JDBC と共用のプロセス(iigcd)と通信を行います。 Ingres/NET(iigcc) とは、仕組みが異なります。 .NET での開発の詳細は、機会があれば取上げたいと思います。

■ 独自のアプリケーション開発環境の概要

  データベースにアプリケーション開発環境があるのは、今では主流ではありません。
Ingres では、過去の歴史的な経緯で、現在でも、独自の開発環境がいくつか残っています。
特に、FRS(Form Runtime System) という画面制御ライブラリを使ったものは、
現在でも、Ingres のユーティリティとして使われています。

「Ingres/4GL」「QUEL」「Reportwriter」「ice」があります。

「QUEL」は、SQL 言語が主流になる前の、独自の照会言語ですので、過去の遺物です。
まず使う事は無いと思います。(私も使った事はあいません)

「4GL」は、その名の通り、4GL 全盛時代の、これも遺物と言って良いと思います。
言語製品ですが、「ABF」(Application By Form) という IDE(開発環境)を使います。
クライアントに、主に、Telnet を使う、キャラクタ(文字)ベースの画面しか使えないので、
まず使われないでしょう。

私は仕事柄、今も 4GL と付き合っていますが、生産性は、非常に高いですし、
C 言語にコンパイルされ、実行イメージになるので、高速です。
しかし、ユーザーインターフェース(今では見向きもされない、文字ベース)が言語仕様と、
一緒になっているところが、良くありません。
「ICE」は使った事がありませんが、Web で使うスクリプト言語環境 (アプリケーションサーバ)のようです。 「ReportWriter」は、レポート作成用の簡易言語です。 日本人好みの罫線機能はありません。
ReportWriter は、データベース中に、中間言語を格納するインタプリタなので、
OS 非依存とは言え、実行速度は、非常に遅いです。
「FRS」(Form Runtime System) は、言語ではなく、curses のような画面制御ライブラリです。 また、「VIFRED」というフォーム(画面)を設計する為のツールがあります。 フォームは、4GL や、ESQL/C から共通で使う事が出来ます。 Ingres のフォームベースのユーティリティもこの FRS を使って作られています。

■ アプリケーションの開発(ESQL/C)

  Ingres のメインの言語である、ESQL/C について解説します。

ESQL/C 自体の仕様は、どの DBMS でも似たようなものですから、
ここでは、ビルド方法を中心に解説します。
まず、簡単なプログラムを書いてみましょう。
ファイルの拡張子は、".sc" が標準です。
ソースは、Linux でも、Windows でも、VMS でも同じです。
ここでは、Linux を例に、単純な、接続と切断の例をとりあげます。

$ vi test.sc

#include 
EXEC SQL INCLUDE SQLCA;

int main() {
    EXEC SQL CONNECT 'testdb';
    if( sqlca.sqlerr >= 0 ) {
        printf("Connect OK!\n");
    } else {
        printf("Connect BAD!\n");
    }
    EXEC SQL DISCONNECT;
}

$ esqlc test
$ gcc -o test test.c -L $II_SYSTEM/ingres/lib -l interp.1
$ ./test
Connect OK!
といった具合になります。 Windows の場合は、Visual C++ の例です。 lib 環境変数に、%II_SYSTEM%\lib を追加しておきます。
$ esqlc test
$ cl test iilibapi.lib
$ test

■ サーバーの監視

  フォームベースツールがあります。

ipm ユーティリティ

・サーバープロセスの状態監視。
・ロック状態の監視
・ログファイルの監視

が、行えます。

iimonitor ユーティリティ

DBMS サーバーのセッション(スレッド)を監視します。
サーバーのシャットダウンも可能です。(起動は出来ない)
ユーザーセッションの一時停止(suspend/resume)、
削除(remove) が行えます。

プロセス中のスレッドは、OS から制御できないので、
特定のデータベースセッションが暴走(例えば、異常に重い実行)している
場合に、このツールで、強制終了できます。

サーバーのシャットダウンは、通常、ingstop コマンドで行います。
iimonitor を使うのは、マルチサーバー(プロセス)構成で運用している場合に、
一方のサーバーだけを止める事が出来ます。

全てのサーバーのエラーログは、

$II_SYSTEM/ingres/files/error.log

で、参照できます。

■ 監査

 auditdb コマンドで、ジャーナルから、更新トランザクションのレポートを抽出できます。

■ 分散データベース(Ingres/Star)


■ システムアーキテクチャ

  マルチスレッド・マルチサーバーモデル。

Ingres の特徴の一つです。
マルチスレッドサーバーは、良くあります。
Ingres では、必要に応じて、データベースサーバープロセスを複数起動できます。
Oracle や、SQL Server のような、「インスタンス」とは異なります。
シングル CPU での運用では、あまりメリットはありませんが、
マルチ CPU 構成の場合、OS によっては、マルチプロセスサーバー構成が
有効に働く場合があります。
「インスタンス」と異なるのは、同じデータベース(例えば、testdb)を、
複数のデータベースサーバーが共通にアクセス出来ます。
もっと言えば、サーバーごとに、どのデータベースをアクセス出来るかを設定
出来ます。

Ingres には、ネームサーバーというプロセスがあります。
ユーザーがデータベースサーバーに接続する際には、必ず、このサーバーを
経由します。
データベースプロセスが1つの場合、あまり感じませんが、
複数プロセスの場合、ネームサーバーがセッションの振り分けを行います。
(単純なセッション数による割り振りのように思えます)
iinamu コマンドで、一時的に、特定のサーバーを外す事が出来ます。