インメモリ RDBMS ”Altibase A+ Edition”の紹介

## はじめに

証券取引業務のトレーディングシステム向けの高信頼性と高性能を担保するインメモリテーブルを実現したリレーショナル・データベース管理システム（以下RDBMSと略します）の一つとして、"Altibase"があります。
この程、使用用途によるライセンス上の制限がありますが、"Altibase 7.3"の無料バージョンである"Altibase A+ Edition"がリリースされ、ライセンス上の制限はありますが、自由に利用が可能になりました。ここでは、新たに利用可能となった"Altibase A+ Edition"をインストールし、テーブル作成を行ってみました。以下でその内容を簡単にご紹介致します。

注１）ライセンス上の制限事項：https://altibase.com/en/product/edition.php より
Available completely free for development, testing, and educational purposes, A+ Edition provides most of the
features found in commercial database systems without any cost. (Cannot use for commercial purposes)
注２）Altibase RDBMSの詳細は http://www.kissco.co.jp/service/altibase/index.php  を参照してください。

## 内容

* "Altibase RDBMS"の特徴
* "Altibase A+ Edition"の入手
* インストール
* DBサーバーの起動
* スキーマの作成
* DBテーブルの設定
  * DB設計
  * DBテーブルの生成
  * データの初期設定
* DBサーバーの停止
* DBeaverについて

## "Altibase RDBMS"の特徴
"Altibase RDBMS"は、リレーショナル・データを保持するテーブルを主メモリ上に配置し、データの参照、書込み、削除を高速で実行します。また、テーブルはインメモリ上だけでなく、通常のRDBMSと同様にディスク上に配置させ、しかも一つのスキーマの中にインメモリ上のテーブルとディスク上のテーブルを混在して配置が可能となっています（ハイブリッドRDBMS）。
なお、インメモリ上に配置されたテーブルのデータは、定期的にバックアップされ、RDBMSの再スタート時に、RDBMSのログとバックアップデータからDBが停止した直前のデータを復元します。そのため、**ユーザから見た場合、インメモリテーブルであってもディスクに配置された一般的なRDBMSのテーブルと同じ感覚で扱うこと**ができそうです。

## "Altibase A+ Edition"の入手

"Altibase A+ Edition"は以下のダウンロードサイトから入手可能となっています。

　https://altibase.com/en/product/edition.php?ckattempt=1

上記のサイトから以下のファイル（Linux用）をダウンロードします。

 altibase-server-7.3.0.0.7-A+_Edition-LINUX-X86-64bit-release.run

## インストール

"Altibase A+ Edition"の実行環境はUnix系のOSとなっています。加えてGNU glibcのバージョンが2.12 ～ 2.33であることも条件となっています。詳細は以下のURLを参照してください。

https://github.com/ALTIBASE/Documents/blob/master/Technical%20Documents/eng/Supported%20Platforms.md#altibase-73-server--client

ここでは、上記の条件を満たすOSとして、RockyLiux8.8（glibc 2.28）を選択しました。
ダウンロードしたファイルをRockyLinux8.8にコピーし、ルート権限下でインストール用のファイルに実行権を付加し、実行します。
```bash:Altibase A+ Editionのインストール
chmod +x altibase-server-7.3.0.0.7-A+_Edition-LINUX-X86-64bit-release.run
./altibase-server-7.3.0.0.7-A+_Edition-LINUX-X86-64bit-release.run
```
なお、インストール中にいろいろ聞いてくるパラメータがあるが、機能の試用が目的なので、ここではすべてデフォルトに設定します（Enterキーの押下）。
最後に以下の表示が出れば、インストールは成功です。
```bash:
==============================================
Please perform [re-login]
or [source /root/.bash_profile]
or [. /root/.bash_profile]
==============================================
Press [Enter] to continue :
```
デフォルトでインストールすると、”/opt/”下に"Altibase A+ Edition"がインストールされます。
インストール完了後、引き続き”postinstall"を行い、実行に必要な環境変数等を設定します。
```bash:postインストール
cd /opt/altibase-server-7.3.0/install/
./post_install.sh setenv
```
この後、最後に以下のメッセージが表示されれば"postinstall"は成功です。
```bash:
==============================================
Please perform [re-login]
or [source /root/.bash_profile]
or [. /root/.bash_profile]
==============================================
```

注）ここではテスト用と言うことで、RocyLinux8.8は"Windows11 Hyper-V"にインストールした仮想マシンを使用しました。

## DBサーバーの起動

引き続き、以下のコマンドを実行します。
```bash:Altibase RDBサーバーの起動
source /root/.bash_profile
server start
```
コマンドを起動すると以下に示すログをコンソールに出力し、"Altibase A+ Edition"のRDBMSサーバーが起動します。
```bash:
*****************************************************************
     Altibase A+ Edition.
     This software is for non-commercial use only.
*****************************************************************
-----------------------------------------------------------------
     Altibase Client Query utility.
     Release Version 7.3.0.0.7
     Copyright 2000, ALTIBASE Corporation or its subsidiaries.
     All Rights Reserved.
-----------------------------------------------------------------
ISQL_CONNECTION = UNIX, SERVER = localhost
Connected to idle instance.
Connecting to the DB server.... Connected.


TRANSITION TO PHASE : PROCESS


TRANSITION TO PHASE : CONTROL


TRANSITION TO PHASE : META
  [SM] Recovery Phase - 1 : Preparing Database
                          : Dynamic Memory Version => Parallel Loading
  [SM] Recovery Phase - 2 : Loading Database
  [SM] Recovery Phase - 3 : Starting Recovery
                            Initializing Active Transaction List
                            Redo

                            Refine Disk Table..
                            Undo
  [SM] Refine Memory Table : .......................................................................................................................................................................... [SUCCESS]
  [SM] Rebuilding Indices [Total Count:134] ...................................................................................................................................... [SUCCESS]

TRANSITION TO PHASE : SERVICE
  [CM] Listener started : TCP on port 20300 [IPV4]
  [CM] Listener started : UNIX
  [CM] Listener started : IPC
  [RP] Initialization : [PASS]

--- STARTUP Process SUCCESS ---
Command executed successfully.
```
なお、デフォルト設定では、RDBMSのTCP-IPの接続ポート番号は上記のログに出力されているように"20300"番となります。

## スキーマの作成

”Altibase A+ Edition”の機能を確かめる目的でユーザとスキーマを作成して見ます。
ユーザ名として"fruitdb"を以下のコマンド（AltibaseのiSQLを使用）を実行して作成します。
```bash:スキーマの作成
isql -s 127.0.0.1 -u SYS -p MANAGER -sysdba
iSQL> CREATE USER fruitdb IDENTIFIED BY fruit123;
iSQL> ALTER USER fruitdb ACCESS SYS_TBS_DISK_DATA ON;
iSQL> ALTER USER fruitdb ACCESS SYS_TBS_MEM_DATA ON;
```
ユーザを作成する際に、インメモリとディスクの両方にテーブルを生成可能なようにアクセス権を設定して置きます。
DBeaverツールで見る（以下の図）とスキーマに「fruitdb」が追加されていることが分かります。

![dbeaver_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934281/b08340a5-4dda-4bfa-a8ae-c038912cdb1f.png)


注）Altibaseのアクセス権は、テストには不便ですが、デフォルトでは必要最小限となっている様なので、必要な権限は明示的に与える必要があります。

## DBテーブルの登録

### テスト用テーブル設計例
テスト用DBテーブルの例題として、商品（ここでは果物）について（極端に？）単純化した取引市場を仮定します。
以下のER図で示すインメモリとディスクが混在したもの（ハイブリッドデータベース）を扱ってみます。

![table_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934281/a848c12a-8826-7765-2193-7bf1c928e0ee.png)

また、外部キーによるテーブル間の関係も定義してみます。


## テスト用テーブルの生成例
ER図より作成したテーブルの以下に示すテーブル生成文を使用してテーブルを生成します。

<details><summary>テーブル定義のSQLコード詳細</summary>

```bash:テスト用テーブルの定義
-- Project Name : 果物市場(fruitdb)
-- 市場入荷中商品（インメモリ）
create table fruitdb.entry_item (
  item_id varchar(12) not null
  , item_sum integer not null
  , primary key (item_id)
) ;
-- 出荷ログ
create table fruitdb.output_log (
  log_number integer not null
  , output_time date not null
  , item_id varchar(12) not null
  , stock_sum integer not null
  , user_id varchar(64) not null
  , primary key (log_number)
)  TABLESPACE "SYS_TBS_DISK_DATA" ;
CREATE SEQUENCE fruitdb.output_log_log_number START WITH 1 INCREMENT BY 1;
-- 入荷ログ
create table fruitdb.input_log (
  log_number integer not null
  , imput_time date not null
  , item_id varchar(12) not null
  , stock_sum integer not null
  , user_id varchar(64) not null
  , primary key (log_number)
)  TABLESPACE "SYS_TBS_DISK_DATA" ;
CREATE SEQUENCE fruitdb.input_log_log_number START WITH 1 INCREMENT BY 1;
-- 商品種類（インメモリ）
create table fruitdb.item_type (
  item_id varchar(12) not null
  , item_name varchar(64) not null
  , item_comment varchar(256)
  , primary key (item_id)
) ;
-- 会社情報
create table fruitdb.company_info (
  company_id varchar(12) not null
  , company_name varchar(256) not null
  , company_post_num varchar(7)
  , company_address varchar(256)
  , company_tel varchar(32)
  , primary key (company_id)
)  TABLESPACE "SYS_TBS_DISK_DATA" ;

-- ユーザ情報（インメモリ）
create table fruitdb.user_info (
  user_id varchar(64) not null
  , user_name varchar(96) not null
  , company_id varchar(12) not null
  , primary key (user_id)
) ;
-- FKの定義
alter table fruitdb.output_log
  add constraint output_log_FK1 foreign key (user_id) references user_info(user_id);

alter table fruitdb.input_log
  add constraint input_log_FK1 foreign key (user_id) references user_info(user_id);

alter table fruitdb.entry_item
  add constraint entry_item_FK1 foreign key (item_id) references item_type(item_id);

alter table fruitdb.output_log
  add constraint output_log_FK2 foreign key (item_id) references item_type(item_id);

alter table fruitdb.input_log
  add constraint input_log_FK2 foreign key (item_id) references item_type(item_id);

alter table fruitdb.user_info
  add constraint user_info_FK1 foreign key (company_id) references company_info(company_id);
```
</details>

テーブル生成のSQLコードの内容を”altibase_create_tables.sql”に格納し（エンコーディングがUTF-8のテキストファイル）、RockyLinux8.8側にコピーし、ルート権限下で以下のコマンドを実行します。
```bash:テーブル生成
isql -s localhost -u fruitdb -NLS_USE UTF8 -f altibase_create_tables.sql;
```
DBeaverツールで見る（以下の図）と指定したテーブルが生成されていることが分かります。

![create_tables_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934281/2e5b17a6-f00e-a68e-5037-5511e7b5dd85.png)


テーブルの配置ですが、デフォルト設定ではインメモリ配置となる様です。ディスク配置のテーブルを生成するには、生成用のSQLにて「TABLESPACE "SYS_TBS_DISK_DATA"」を追記する必要がありました。また、コメントは各テーブルの定義の中では無く、独立して記述する必要がありました。時刻については”date”のみしか型を持たないので、年/月/日、年/月/日 時：分：秒、タイムスタンプ等の時刻に関するものはすべて"date"型となります。
自動でテーブルの主キーの値を設定する場合、"Altibase"では、PostgreSQL等と同様にシーケンステーブルを利用します。MySQL等で使用する"AUTO_INCREMENT"は使えません。


### データの初期設定
テーブルの初期値を設定する場合、データ挿入のインサート文（以下）をUTF-8で作成し、iSQLツールで読み込み、対応するテーブルにデータを設定します。
今回定義したテーブルについて、データを設定してみます。
```bash:テーブルの初期値定義例
INSERT INTO fruitdb.item_type(item_id, item_name, item_comment) VALUES
  ('p01000001011','リンゴ袋','6個入りのリンゴ'),
  ('p01000001022','イチゴパック','パック入りのイチゴ'),
  ('p01000002022','イチジクパック','パック入りのイチジク'),
  ('p01000001031','冬みかんパック','10個入りの冬みかん'),
  ('p01000001061','シャインマスカット','ひと房のシャインマスカット'),
  ('p01000001075','グレープフルーツ','グレープフルーツ1個'),
  ('p01000001080','キウイフルーツ','キウイフルーツ1個'),
  ('p01000001081','柿','柿1個'),
  ('p01000001082','柿パック','パック入りの柿'),
  ('p01000002083','バナナ','バナナ一房');
```
以上のテキストを”data_insert.sql"ファイルに書き込み(UTF-8エンコーディング)、以下のコマンドを実行します。
```bash:テーブルの初期値設定の実行
isql -s localhost -u fruitdb -NLS_USE UTF8 -f data_insert.sql;
```
DBeaverツールで該当のテーブルを開くと挿入したデータが設定されていることを確認できます。

![data_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934281/089d858c-5649-0221-99b1-cc9bd75b8f62.png)


注意事項として、Altibaseのテーブルの初期設定では、日付や時刻データの値を設定する場合、”to_date('2024-11-10','YYYY-MM-DD')”のようにフォーマットを指定して値を記述する必要があります。また、Altibaseに付属するiSQLツールを用いてテーブルの内容を参照すると日付はデフォルトだと"03-JUN-2024"のように日本ではなじみの無いフォーマットで表示されます。

## DBサーバーの停止

DBサーバーを停止するにはルートユーザで以下のコマンドを実行します。
```bash:Altibase RDBサーバーの停止
source /root/.bash_profile
server stop
```
一旦停止後、再度起動し、テーブル内容をDBeaver等のツールで確認するとインメモリ・テーブルであっても停止前の状態が復元されていることが確認できます。

## DBeaverについて

DBeaver Community（https://dbeaver.io/ ）は、"Free Universal Database Tool"であり、Altibase RDBMSのアクセスをサポートしているツールの一つです。Altibaseがプラグインを提供しており、Altibase 固有の属性データの表示等がビジュアルに行えるようになっており、Altibase情報のアクセスに重宝します。
なお、DBeaverには有料のCommercial versionsとフリーのDBeaver Communityがあります。