CentOS7.2にDB2の検証環境を作ってA5:SQLで接続する

DB2は有償だけれど、DB2 Express-Cはその小規模無償版。
小規模といっても数TB使えるので検証利用なら充分です。
探してもまとまった情報が出てこないのでまとめました。

ホストマシン: Windows10 + vagrant 2.0.1 + VirtualBox
ゲストマシン: CentOS7.2 + DB2
DB2はインストーラを使ったGUIでのインストールが基本。
[CUIで入れる方法もある](https://news.goo.ne.jp/article/enterprisezine/business/enterprisezine_4131.html)ようですが、折角なので最小構成のCentOSにGUIを入れるのもやってみました。

# 前提
VagrantとVirtualBoxがインストール済。
下記がVagrantとは？から始まりわかりやすいです。
[Vagrant + VirtualBoxでWindows上に開発環境をサクッと構築する](https://qiita.com/ozawan/items/160728f7c6b10c73b97e)

# 仮想マシン立ち上げ
ホストマシンの適当なフォルダで`vagrant init`、`Vagrantfile`を修正します。
boxファイルは[Discover Vagrant Boxes](https://app.vagrantup.com/boxes/search)で探します。

```:Vagrantfile
# L15　適当なボックスを記述。
config.vm.box = "bento/centos-7.2"

# L35 必要に応じてコメントイン
config.vm.network "private_network", ip: "192.168.33.10"

# L46 共有フォルダのマウント設定、必要に応じてコメントイン
config.vm.synced_folder "../data", "/vagrant_data"
```

```
vagrant up
```

# DB2インストーラのダウンロード
初回vagrant upは時間がかかるので、この間にDB2のインストーラをDLします。

[DB2 Express-C database server](https://www-01.ibm.com/marketing/iwm/iwm/web/signup.do?source=swg-db2expressc&S_TACT=000000VR&S_OFF_CD=10000761&lang=en_US&S_PKG=ov48105)
適宜情報を入力して同意し、`DB2 Express-C` と `National Language Pack for DB2`をダウンロード。
`jnlp`ファイルが落ちてきます。
（Javaのバージョンが古い場合はインストーラが出るのでアップデートします）。

`DownloadDirector.jnlp`をダブルクリックしてtar.gzファイルをダウンロード、ゲストマシンに設置します。
今回は`/home/vagrant/db2`に置いたものとして話を進めます。

# Gnomeデスクトップ導入
```Terminal:Virtualboxからログイン
//名前を確認する
$ sudo yum grouplist
$ sudo yum groupinstall "GNOME Desktop"

$ sudo startx
//セットアップ画面が開くので、言語・キーボード設定などするとGUI画面がたちあがる
```

# DB2インストール

```Terminal
# cd /home/vagrant/db2
# ls
//必要ファイルを解凍する
# tar zxvf v11.1_linuxx64_expc.tar.gz
//言語パックはexpcの中に解凍
# cd expc
# tar zxvf ../v11.1_linuxx64_nlpack.tar.gz
# ls
# ./db2setup
// インストーラが立ち上がる
```

インストーラの項目は基本選択するだけです。GUIってすごいですね。

- [Choose a Product] バージョンを確認
- [Configuration] Customを選択、「I agree」選択
- [Select Features] 全て選択
- [Select Languages] 日本語を選択
- [Documentation]「 On the IBM Web site」が選択されていることを確認
- [Instance Owner] Password, Confirm passwordのみ入力でOK
  - username: db2inst1
  - groupname:  db2iadm1
  - デフォルトユーザー名をメモするか希望のものに変更します
- [Fenced User] Password, Confirm passwordのみ入力でOK
  - Username: db2fenc1
  - groupname: db2fadm1
- [Instance Communication] OS起動時自動起動しない場合は`Autostart`のチェックを外す
  - service name: db2c_db2inst1
  - port number: 50000
  - デフォルトポート番号をメモするか希望のものに変更します
- [Text Search Service] デフォルトでＯＫ
  - service name: db2j_db2inst1
  - port number: 55000
- [Response File and Summary] 内容を確認して「Finish」クリック

## サンプルデータベースの作成、接続

```Terminal
//Instance Ownerで指定したユーザーが作られているのでユーザー切替
# su - db2inst1
//バージョン確認
$ db2level
Informational tokens are "DB2 v11.1.3.3"

//サンプルデータベース作成(eがないことに注意)
$ db2sampl

//db2起動、autostartをチェックした場合は起動済になっています
$ db2start
$ db2 "connect to sample"
$ db2 "list tables"
$ db2 "select * from staff where id = 10"
$ db2stop
```

## 検証用データベースの作成、接続
`db2`の後にコマンドを書けば他のRDBMSと同様にSQLを実行できます。
DB2の特異性のひとつに文字コードがあると思うので、その辺りは下記参照ください。
[DB2でデータベースを作る方法](http://db2.jugem.cc/?eid=56)

```Terminal
//オプションの指定がなくてもcreate database自体は実行できる
$ db2 "create database SAMPLE2"
//create tableはこんな感じ
$ db2 "create table users (
  id int,
  user_name varchar(255),
  agreement_flag boolean,
  entry_date date,
  entry_time time
)"
//DBに接続したまだとdatabaseをdropできないので接続を解除する。
$ db2 "connect reset"
$ db2 "list applications"
$ db2 "drop database SAMPLE2"

```

なお、`connect`や`list`のようなコマンドは`"`がなくても実行できるようです。
（SQL(DMLだけ？)の実行には`"`が必要っぽい）

2018/04/23追記:
コメントで、`"`を使うのは`*`等の記号がシェルに解釈されないようにする為とのご指摘いただきました。
ありがとうございます！

# A5:SQL Mk-2からの接続
普段使っているSQL開発ツールから接続します。
## ODBCドライバのインストール
[IBM Data Server Driver Package (DS Driver)](http://www-01.ibm.com/support/docview.wss?rs=0&uid=swg21385217&loc=ja)でタイトルのリンクをクリック（一番上）。
IBM ID未登録なら登録してSign in。
ホストマシンのPlatform(今回はWindows64bit)の通常版ファイルをDLします。
DLファイルをダブルクリックするとインストーラが起動するので、流れに沿ってインストール。
基本全部デフォルトでいいかと思います。

## ODBC接続設定
参考: [DB2設定方法](https://www.microlab.jp/xcutedoc/documents/sup_db/DB2.htm)
「データベース」>「データベースの追加と削除」>「64bit ODBCアドミニストレータ」>「システムDSN」>「追加」をクリック。
先ほどインストールした`ODBCドライバ`（IBM DB2 ODBC DRIVER-IBMDBCL1）が追加されているので選択します。

- [Data souce name]にDB名（SAMPLE）を入力して「add」押下。
  - [Data Souce]タブでDescription(null可), UserID(db2inst1), Passwordを入力します。
  - [Advanced Settings]タブで「Add」押下、「Hostname 192.168.33.10」「Port 50000」「Protocol TCP/IP」「Database SAMPLE」を入力。

## DB2への接続
参考: [DB2への接続](https://freebsd.sing.ne.jp/db/07/03.html)
「データベース」>「データベースの追加と削除」>「追加」>「ADO(OLD DB, ODBC)」をクリック。

- 「接続文字列」の「...」からで先ほど指定したODBCドライバ（IBM DB2 ODBC DRIVER-IBMDBCL1）を選択します。
  - 「Data Source」にDB名、「Password」「UserID」にdb2inst1を記入し「OK」。
  - 「テスト接続」ボタン押下で確認して、接続が成功したら「OK」で完了です。

## DBの変更
なお、接続するDB名を変更した時は、
`C:\users\all users\IBM\DB2\IBMDBCL1\cfg`
にある`db2cli.ini`のDB名（タイトル）の変更（要管理者権限）・A5の再起動も忘れずに。


参考リンク
[DB2 Express-C 11.1をCentOS 7.3へインストール](http://ossfan.net/setup/db2-01.html)
[DB2チートシート](http://portablecode.info/db2_cheat_sheet/)