Amazon RDS for Db2: 同一インスタンスに複数データベースを作成

Amazon RDS for Db2 で、1つのデータベースインスタンス内に複数の Db2 データベースを作成できるようになりました。
- [Amazon RDS for Db2が1つのインスタンス内の複数のデータベースをサポート](https://aws.amazon.com/jp/about-aws/whats-new/2024/12/amazon-rds-db2-multiple-databases-instance/)

当記事では実際に1つのインスタンス内に複数DBを作成してみます。



# 1. DB インスタンスが保持できるデータベースの最大数
参考: [Amazon RDS for Db2 DB インスタンス上の複数のデータベース](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/db2-multiple-databases.html)
1つの RDS for Db2 DB インスタンスに作成できるデータベースの数は**50個**です。この数には、アクティブ状態と非アクティブ状態の両方のデータベースが含まれます。

さらにメモリリソースによって、アクティブ化されるデータベースの数には制限があります。
DB インスタンスが保持できるアクティブなデータベースの最大数は、次の式を使用して計算できます。
```
Active database limit = (total server memory - 2 GB) / 1 GB 
```
RDS for Db2 DB の最小構成は2vCPU,2GB RAMですが、この最小構成では複数DB構成はとれない、ということになります。最低4GB RAMが必要です。

ただし、実際に作成してみると4GB RAMで3つのDBが作成できたので、作成する際の制限ではなく、動作する際のメモリの最低要件のようです。

詳細は[Amazon RDS for Db2 DB インスタンス上の複数のデータベース](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/db2-multiple-databases.html)を参照してください。




# 2. 同一インスタンスに複数データベース作成
では実際に1つのデータベースインスタンス内に複数の Db2 データベースを作成してみます。
DB2のCLIを使用します。



### 2.0 前提
- 既にGUIなどで1つのDBを持つインスタンスを作成済み
    - ここではインスタンス`database-2`に **`rdstest1`** というDBを**2024年11月15日以降に**既に作成済みとします
    - 尚、インスタンスのみ作成済みでその後コマンドで全てのDBの作成も可能です
    - 
    
- 作成済みのDBのnodeをカタログ済み
    - ここでは **`RDS_ND2`** でカタログしているとして進めます
    - コマンド例 
    - `db2 catalog tcpip node <node名(ここではRDS_ND2)> remote <エンドポイント> server <ポート>`
    - 
- 作成済みのインスタンスの管理DB `rdsadmin`　をカタログ済み
    - ここでは **`RDSADMIN`** としてカタログしているとして進めます
    - コマンド例  
    - `db2 catalog database rdsadmin as <DB別名(ここではRDSADMIN)> at node <node名> `
    -

:::note
2024年11月15日より前に作成された RDS for Db2 DB インスタンスに複数のデータベースを作成する場合は、DB インスタンスを再起動して、複数のデータベースのサポートを有効にする必要があるそうです。
:::

### 2.1  RDS for Db2 DB インスタンスのマスターユーザー名とマスターパスワードを使用して、rdsadmin データベースに接続

以後のコマンドは、マスターパスワードは環境変数`db2_pw`に入っているとして進めます。
参考までにLinuxでのこの環境変数設定コマンドは以下です(xxxxxはパスワード)：
`export db2_pw=xxxxxx`

環境変数未設定の場合は`$db2_pw`を自分のパスワードに置き換えて使用してください。


```
 db2 connect to rdsadmin user admin using $db2_pw
```


```:実行例
[db2inst1@db2server11 ~]$  db2 connect to rdsadmin user admin using $db2_pw

   Database Connection Information

 Database server        = DB2/LINUXX8664 11.5.9.0
 SQL authorization ID   = ADMIN
 Local database alias   = RDSADMIN

[db2inst1@db2server11 ~]$
```
接続できました！

今現在のデータベースを以下のコマンドでリストしてみます：
```sql
db2 "select * from table(rdsadmin.list_databases())"
```

```:実行例
[db2inst1@db2server11 ~]$ db2 "select * from table(rdsadmin.list_databases())"

DATABASE_NAME   CREATE_TIME
--------------- --------------------------
rdsadmin        2025-03-17-05.50.18.081002
RDSTEST1        2025-03-17-05.52.04.111263

  2 record(s) selected.

[db2inst1@db2server11 ~]$
```
管理用のDB `rdsadmin`とインスタンス作成時にGUIで作成した`RDSTEST1`がリストされました。

### 2.2 追加で新しいデータベースを作成

追加で新しいデータベースを[rdsadmin.create_database](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/db2-managing-databases.html#db2-creating-database)で作成します。

ここでは`rdstest2`というデータベース　を作成してみます。
```
db2 "call rdsadmin.create_database('rdstest2')"
```
尚、データベースのコードセットなどパラメータも設定可能ですので、設定したい場合は[こちら](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/db2-sp-managing-databases.html#db2-sp-create-database)を参照お願いします。

```:実行例
[db2inst1@db2server11 ~]$ db2 "call rdsadmin.create_database('rdstest2')"

  Return Status = 0
[db2inst1@db2server11 ~]$
```
これは一瞬にして終わるのですが、実際の実行完了の確認は以下のSQLで確認します:
```
db2 "select varchar(r.task_type,25) as task_type, r.database_name, 
    varchar(r.lifecycle,15) as lifecycle, r.created_at, r.database_name,
    varchar(bson_to_json(task_input_params),256) as input_params, 
    varchar(r.task_output,1024) as task_output 
    from table(rdsadmin.get_task_status(null,null,'create_database')) 
    as r order by created_at desc
    FETCH FIRST 1 ROWS ONLY"
```
[AWSのドキュメント](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/db2-managing-databases.html#db2-creating-database)ではタスク履歴を全て(35日間分)取得してしまうSQLとなっていましたが、上記SQLは最後に`FETCH FIRST 1 ROWS ONLY`をつけて最新のもののみ取得するようなSQLとなっています。最新のレコード以外も取得したい場合は最後の`FETCH FIRST 1 ROWS ONLY`を削除してください。

```:実行例
[db2inst1@db2server11 ~]$ db2 "select varchar(r.task_type,25) as task_type, r.database_name,
>     varchar(r.lifecycle,15) as lifecycle, r.created_at, r.database_name,
>     varchar(bson_to_json(task_input_params),256) as input_params,
>     varchar(r.task_output,1024) as task_output
>     from table(rdsadmin.get_task_status(null,null,'create_database'))
>     as r order by created_at desc
>     FETCH FIRST 1 ROWS ONLY"

TASK_TYPE                 DATABASE_NAME   LIFECYCLE       CREATED_AT                 DATABASE_NAME   INPUT_PARAMS                                                                                                                                                                                                                                                     TASK_OUTPUT
------------------------- --------------- --------------- -------------------------- --------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CREATE_DATABASE           RDSTEST2        IN_PROGRESS     2025-03-25-01.38.25.078380 RDSTEST2        { "CODESET" : "UTF-8", "TERRITORY" : "US", "COLLATION" : "IDENTITY", "AUTOCONFIGURE_CMD" : "", "PAGESIZE" : 8192 }                                                                                                                                               2025-03-25T01:38:30.078Z Task execution has started.
```
CREATE_DATABASEコマンドの実行状況がリストされます。
LIFECYCLEの値が`IN_PROGRESS`だと実行中です。
LIFECYCLEの値が`SUCCESS`だと成功して完了という状態です。 

```:LIFECYCLEの値がSUCCESSの例
TASK_TYPE                 DATABASE_NAME   LIFECYCLE       CREATED_AT                 DATABASE_NAME   INPUT_PARAMS                                                                                                                                                                                                                                                     TASK_OUTPUT
------------------------- --------------- --------------- -------------------------- --------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CREATE_DATABASE           RDSTEST2        SUCCESS         2025-03-25-01.38.25.078380 RDSTEST2        { "CODESET" : "UTF-8", "TERRITORY" : "US", "COLLATION" : "IDENTITY", "AUTOCONFIGURE_CMD" : "", "PAGESIZE" : 8192 }                                                                                                                                               2025-03-25T01:38:30.078Z Task execution has started.
2025-03-25T01:40:24.988Z Task execution has completed successfully.
```
上記は約2分で完了したようです。
完了したので現在のデータベースを以下のコマンドでリストしてみます：
```sql
db2 "select * from table(rdsadmin.list_databases())"
```

```:実行例
[db2inst1@db2server11 ~]$ db2 "select * from table(rdsadmin.list_databases())"

DATABASE_NAME   CREATE_TIME
--------------- --------------------------
rdsadmin        2025-03-17-05.50.18.081002
RDSTEST1        2025-03-17-05.52.04.111263
RDSTEST2        2025-03-25-01.40.05.922957

  3 record(s) selected.

[db2inst1@db2server11 ~]$
```
無事`RDSTEST2`が作成されています。
尚、LIFECYCLEの値が`IN_PROGRESS`の時にこのコマンドを実行すると、`RDSTEST2`はリストされません。長いコマンドをコピペで打つのが面倒な場合はこのSQLでリストされるまで待ってもいいかもしれません。ただしエラーの場合はわからないので、実行時間が長い場合はやはり実行完了の確認SQLの実行が必要です。

<br>
この後新しいデータベース用のバッファープールとテーブルスペースを作成することもできます。オプションなのでここでは省略します。

作成する場合は以下を参考にしてください:
 - [rdsadmin.create_bufferpool](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/db2-sp-managing-buffer-pools.html#db2-sp-create-buffer-pool)
 - [rdsadmin.create_tablespace](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/db2-sp-managing-tablespaces.html#db2-sp-create-tablespace)

<br>

:::note
参考:
デフォルトでは、Amazon RDS はデータベースの作成時にデータベースをアクティブ化します。メモリリソースを最適化するために、使用頻度の低いデータベースを非アクティブ化したり、必要に応じて後でアクティブ化したりできます。詳細については、[データベースの非アクティブ化](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/db2-managing-databases.html#db2-deactivating-database)および[データベースのアクティブ化](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/db2-managing-databases.html#db2-activating-database)を参照してください。
([Amazon RDS for Db2 DB インスタンス上の複数のデータベース](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/db2-multiple-databases.html) より抜粋)
:::

# 3. 接続確認
新たに作成した2個目のデータベースに接続してみます。

### 3.1 作成したデータベースをカタログ
以下のコマンドで作成したデータベースをカタログします。`db2 terminate`はディレクトリー・キャッシュをリフレッシュするために実行しています。
```
db2 catalog database rdstest2 at node rds_nd2 
db2 terminate
```
```:実行例
[db2inst1@db2server11 ~]$ db2 catalog database rdstest2 at node rds_nd2
DB20000I  The CATALOG DATABASE command completed successfully.
DB21056W  Directory changes may not be effective until the directory cache is
refreshed.
[db2inst1@db2server11 ~]$ db2 terminate
DB20000I  The TERMINATE command completed successfully.
[db2inst1@db2server11 ~]$
```

### 3.2 作成したデータベースに接続
以下のコマンドで 作成したデータベースに接続します。
尚ユーザーはadmin、パスワードは環境変数`db2_pw`に入っている前提のコマンドです。環境変数未設定の場合は`$db2_pw`を自分のパスワードに置き換えて使用してください。

```
db2 connect to rdstest2 user admin using $db2_pw
```

```:実行例
[db2inst1@db2server11 ~]$ db2 connect to rdstest2 user admin using $db2_pw

   Database Connection Information

 Database server        = DB2/LINUXX8664 11.5.9.0
 SQL authorization ID   = ADMIN
 Local database alias   = RDSTEST2

[db2inst1@db2server11 ~]$
```
無事接続できました！



せっかくなのでテーブルを作成してデータを入れ、selectしてみます:
```
db2 "create table test.tb1 (c1 int not null primary key, c2 varchar(32))"
db2 "insert into test.tb1 values(1,'a')"
db2 "select * from test.tb1"
```

```:実行例
[db2inst1@db2server11 ~]$ db2 "create table test.tb1 (c1 int not null primary key, c2 varchar(32))"
DB20000I  The SQL command completed successfully.
[db2inst1@db2server11 ~]$ db2 "insert into test.tb1 values(1,'a')"
DB20000I  The SQL command completed successfully.
[db2inst1@db2server11 ~]$ db2 "select * from test.tb1"

C1          C2
----------- --------------------------------
          1 a

  1 record(s) selected.

[db2inst1@db2server11 ~]$
```

無事データも入ってSELECTもできました！

尚、データベースが複数あるかどうかは、AWSのWebコンソールのRDS画面では確認できません。**rdsadmin データベースに接続して**
`db2 "select * from table(rdsadmin.list_databases())"`
で確認するようにしましょう。

以上です!