Db2 の SAMPLE DB とライセンスについて

#Db2 の SAMPLE DB とライセンスについて

今日はDb2 の SAMPLE DB とライセンスについてです。
私自身は Db2 を専門的にやっているわけではありませんが、
Db2 のライセンスについて確認する機会があったため、その時に確認した情報をお伝えしたいと思います。

末尾の db2sampl コマンドのマニュアルをご覧いただければわかりますが、
Db2 の一部のエディションで、db2sampl コマンドで SAMPLE DB を作成すると、ライセンス違反になる可能性があります。

例として、　[v10.5 のマニュアル](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_10.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0001934.html)には以下の記載があります。

>DB2® Workgroup Server Edition および Db2 Express® Server Edition では、SAMPLE データベースにはマテリアライズ照会表 (MQT) とマルチディメンション・クラスター表 (MDC) が含まれており、これはライセンス違反の原因になります。 この違反状態を除去する唯一の方法は、Db2 Enterprise Server Edition にアップグレードすることです。

v11.x には、Express 系のエディションが無いため、マニュアルの表記は異なります。（Workgroup Server Edition になっています）ご利用のバージョンに合わせて確認したほうが無難ですね。

現在利用中の Db2 にライセンス違反があるかどうかに関しては、 ライセンス準拠レポートで確認することができます。


#ライセンス準拠レポートの出力

現在、ライセンスに準拠しているどうかを確認するためには db2licm コマンドを利用します。
Db2 のインスタンスオーナーのID で以下のコマンドを発行します。

```shell
$ db2licm -g ./output.txt

LIC1440I  License compliance report generated successfully.

```

ライセンスレポート（上記の例では output.txt）には、以下のような情報が出力されます。

```shell
ライセンス準拠レポート

ライセンス準拠リセットの最終日付:                "mm/dd/YYYY"

DB2 Express-C   準拠
```

上記の例は、 v10.5 での　Db2 Express-C エディションの例です。

なお、「ライセンス準拠リセット」というのは、ライセンスに関する情報を一度クリーンアップする、という意味です。
ライセンスに関する情報が実環境とずれている可能性もあるため、ライセンス準拠のリセット →　インスタンスの再起動　→ ライセンスレポートの生成、というのが正しい手順です。
（ db2licm -x   ->   db2stop  ->  db2start ->  db2licm -g <output> )

異常がある場合は、下記のような出力となります。

```shell
ライセンス準拠レポート

DB2 Express-C   違反
	マテリアライズ照会表
	マルチディメンション・クラスタリング表
```

ライセンス状況を確認したい場合は、上記のレポートで確認しましょう。
また、現在導入されているライセンスを確認したい場合は、 インスタンスオーナーで、db2licm -l です。

```shell
$ db2licm -l
Product name:                     "IBM DB2 Developer-C Edition"
License type:                     "Community"
Expiry date:                      "Permanent"
Product identifier:               "db2dec"
Version information:              "11.5"
Max amount of memory (GB):        "16"
Max number of cores:              "4"
Max amount of table space (GB):   "100"
```

これは、 Db2 v11.5 の Developer-C エディションの例です。

#SAMPLE DB について

さて、冒頭に記載した SAMPLE DB ですが、マテリアライズ照会表(MQT)、マルチディメンション・クラスター表(MDC)が含まれています。
そのため、一部のエディションでは、SAMPLE DB を利用していると知らずにライセンス違反になります。

SAMPLE DB が作られるのは、大きく言うと以下のケースがあります（もしかしたら他にもあるかもしれません）
● GUI インストーラーを利用した導入途中で、インストール・タイプに「標準」を選択した場合
● GUI インストーラーを利用した導入後の「DB2 ファーストステップ」画面で、「サンプル・データベースの作成」ボタンをおして作成した場合
● db2sampl コマンドを利用して作成した場合

１点目に関しては、そのような記載をしている Db2 導入手順の Web ページがありました。
（ただ、すみませんが自分自身では確認していません）

また、インターネット上の各種 Web ページで紹介されている Db2 のインストール手順の中には
テスト的にサンプルDB を作成してみる手順になっているものがあります。
何も考えずにサンプルDB を作成し、そのままにしておくと問題になるケースがあります。
（あくまでエディションによります）

なお、コマンドで SAMPLE DB を作成する場合、以下のようになります。（db2inst1 がインスタンスオーナーの場合）

```shell
$ whoami
db2inst1

$ db2sampl

  Creating database "SAMPLE"...
  Connecting to database "SAMPLE"...
  Creating tables and data in schema "DB2INST1"...
  Creating tables with XML columns and XML data in schema "DB2INST1"...

  'db2sampl' processing complete.

$
```

#マテリアライズ照会表、マルチディメンション・クラスター表の識別

SAMPLE DB 、もしくは各種アプリケーションで利用しているDB に、マテリアライズ照会表、マルチディメンション・クラスター表があるかどうかは、以下の方法で確認できます。

<dl>
<dt>マテリアライズ照会表</dt>
<dd>syscat.tables カタログ・ビューの type 列が "S" になっている</dd>
<dt>マルチディメンション・クラスター表</dt>
<dd>syscat.tables カタログ・ビューの clustered 列が "Y" になっている</dd>
</dl>

詳しくは、末尾の参考リンクの syscat.tables カタログ・ビューマニュアルや、「MDC表への…」　という技術情報をご覧ください。

以下で、実際に確認してみます。

まず、DB の有無を確認します。
以下、すべてインスタンスオーナーで実施しています。（インスタンスオーナーでなくとも、適切な権限があれば確認できます）

```shell
$ db2 list db directory

 System Database Directory

 Number of entries in the directory = 2

Database 1 entry:

 Database alias                       = TESTDB
 Database name                        = TESTDB
 Local database directory             = /database/data
 Database release level               = 15.00
 Comment                              =
 Directory entry type                 = Indirect
 Catalog database partition number    = 0
 Alternate server hostname            =
 Alternate server port number         =

Database 2 entry:

 Database alias                       = SAMPLE
 Database name                        = SAMPLE
 Local database directory             = /database/data
 Database release level               = 15.00
 Comment                              =
 Directory entry type                 = Indirect
 Catalog database partition number    = 0
 Alternate server hostname            =
 Alternate server port number         =
```

例では、TEST、SAMPLE DBがあります。
以下では、 SAMPLE DB について確認しますが、すべての DB、テーブルについて確認する必要があります。

SAMPLE DB に接続します。

```shell
$ db2 connect to sample

   Database Connection Information

 Database server        = DB2/LINUXX8664 11.5.0.0
 SQL authorization ID   = DB2INST1
 Local database alias   = SAMPLE

$
```

ここで、 エラー `SQL1032N  No start database manager command was issued.  SQLSTATE=57019` が表示される場合は
Db2 インスタンスが起動していませんので、インスタンスオーナーで `db2start` を実行し、起動します。
OS レベルのコマンドで起動を確認する場合、　`ps -ef | grep db2sysc`  でプロセスが表示されるかどうかを確認してください。
（該当インスタンスオーナーユーザーの db2sysc プロセスがあるかどうかを確認）

接続後、SQL を発行して確認しますが、その際に syscat.tables ビューの定義を確認する必要があるかもしれません。
その場合は、以下のコマンドで確認します。

```shell
$ db2 describe table syscat.tables

                                Data type                     Column
Column name                     schema    Data type name      Length     Scale Nulls
------------------------------- --------- ------------------- ---------- ----- ------
TABSCHEMA                       SYSIBM    VARCHAR                    128     0 No
TABNAME                         SYSIBM    VARCHAR                    128     0 No
OWNER                           SYSIBM    VARCHAR                    128     0 No
OWNERTYPE                       SYSIBM    CHARACTER                    1     0 No
TYPE                            SYSIBM    CHARACTER                    1     0 No
STATUS                          SYSIBM    CHARACTER                    1     0 No

…以下略

```

まず、マテリアライズ照会表の有無を、以下の SQL で確認します。

```shell
$ db2 "select substr( tabname, 1,20 ) as tabname, type from syscat.tables where type='S'"

TABNAME              TYPE
-------------------- ----
ADEFUSR              S
```

ADEFUSR　というテーブルがマテリアライズ照会表になっています。

次に、マルチディメンション・クラスター表を確認します。

```shell
$ db2 "select substr( tabname, 1,20 ) as tabname, type, clustered from syscat.tables where clustered='Y'"

TABNAME              TYPE CLUSTERED
-------------------- ---- ---------
EMPMDC               T    Y

  1 record(s) selected.
```

EMPMDC　というテーブルがマルチディメンション・クラスター表になっています。

まとめて確認するなら、 `db2 "select substr( tabname, 1,20 ) as tabname, type, clustered from syscat.tables"` で
全ての表を表示してしまってもよいかもしれません。

確認後は、セッションを切断します。

```shell
$ db2 connect reset
DB20000I  The SQL command completed successfully.
```

---
普段あまり気にしないエディションやライセンスですが、
インフラ担当者から見ると、　「アプリの担当者がどんな表を作成しているかわからない」
アプリ担当者から見ると、「エディションの細かい話やライセンスまで把握していない」という感じで
グレーゾーンに落ちてしまう可能性があります。

Db2 の機能がつかえればOK、というだけではなく、ライセンスや監査上も問題ないように注意しましょう！


#参考情報

● db2sampl コマンド
<dl>
<dt>v11.5 :</dt>
<dd>https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0001934.html</dd>
<dt>v11.1 :</dt>
<dd>https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0001934.html</dd>
<dt>v10.5 :</dt>
<dd>https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_10.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0001934.html</dd>
</dl>

● SYSCAT.TABLES カタログ・ビュー
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.sql.ref.doc/doc/r0001063.html

● [DB2 LUW] MDC 表への INSERT でエラーが発生すると、後続の INSERT で誤った MDC セルにデータが挿入されることがある
https://www.ibm.com/support/pages/db2-luw-mdc-表への-insert-でエラーが発生すると、後続の-insert-で誤った-mdc-セルにデータが挿入されることがある

---