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-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名>
- ここでは
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
だと成功して完了という状態です。
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())"
で確認するようにしましょう。
以上です!