2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2025-03-27

Amazon RDS for Db2 で、1つのデータベースインスタンス内に複数の Db2 データベースを作成できるようになりました。

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

1. DB インスタンスが保持できるデータベースの最大数

参考: Amazon RDS for Db2 DB インスタンス上の複数のデータベース
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 インスタンス上の複数のデータベースを参照してください。

2. 同一インスタンスに複数データベース作成

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

2.0 前提

  • 既にGUIなどで1つのDBを持つインスタンスを作成済み

    • ここではインスタンスdatabase-2rdstest1 という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名>

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 ~]$

接続できました!

今現在のデータベースを以下のコマンドでリストしてみます:

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で作成します。

ここではrdstest2というデータベース を作成してみます。

db2 "call rdsadmin.create_database('rdstest2')"

尚、データベースのコードセットなどパラメータも設定可能ですので、設定したい場合はこちらを参照お願いします。

実行例
[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のドキュメントではタスク履歴を全て(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分で完了したようです。
完了したので現在のデータベースを以下のコマンドでリストしてみます:

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の実行が必要です。


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

作成する場合は以下を参考にしてください:


参考:
デフォルトでは、Amazon RDS はデータベースの作成時にデータベースをアクティブ化します。メモリリソースを最適化するために、使用頻度の低いデータベースを非アクティブ化したり、必要に応じて後でアクティブ化したりできます。詳細については、データベースの非アクティブ化およびデータベースのアクティブ化を参照してください。
(Amazon RDS for Db2 DB インスタンス上の複数のデータベース より抜粋)

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())"
で確認するようにしましょう。

以上です!

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?