[アップデート] RDS for OracleがOracle Multitenantのマルチテナント構成をサポートしました

2023.11.12

しばたです。

先日よりRDS for OracleにおいてOracle Multitenantのマルチテナント構成をサポートする様になりました。

AWSからのアナウンスはこちらになります。

タイトルが若干意味不明な感じになっておりますが、本記事では過去の事情を踏まえつつ解説していきます。

どういうことか?

まず最初にRDS for OracleにおいてOracle Multitenant自体は2年前からサポートされています。
当時書いた記事を紹介しますので、まずはこちらをご覧ください。

当時から今日に至るまでOracleのコンテナデータベース(CDB)を使う構成は組めたものの実際にユーザーが利用するプラガブル・データベース(PDB)は1つだけという制限があったのですが、今回この制限が解除され複数のPDBを作ることができる様になりました。

今回の更新によりRDS for OracleにおいてCDB構成の環境が

  • CDB構成 (シングルテナント)
  • CDB構成 (マルチテナント)

の2種類に分離する形になります。

既存の環境は「CDB構成 (シングルテナント)」として扱われマルチテナントにしたい場合は設定変更が必要となります。
また、「CDB構成 (シングルテナント)」→「CDB構成 (マルチテナント)」への変更は可能ですが、その逆は出来ませんので要注意です。

RDS for Oracleの構成を改めてまとめると以下の通りです。

項目 non-CDB構成 CDB構成 (シングルテナント) CDB構成 (マルチテナント)
概要 旧来のシングルインスタンス構成 AWSによって単一PDBに制限された構成 複数PDB利用可能な構成
対応Oracleバージョン ~ 19c
(21c以降は利用不可)
12c (12.2) ~ 12c (12.2) ~
対応RDSバージョン ~ 19c 19c ~ 19c (19.0.0.0.ru-2022-01.rur-2022.r1) ~
RDSファミリー指定 oracle-se2
oracle-ee
oracle-se2-cdb
oracle-ee-cdb
oracle-se2-cdb
oracle-ee-cdb
利用可能PDB数 - 1 複数 (具体的な上限はライセンス次第)
特記事項 いずれ完全に利用不可になる CDB構成 (マルチテナント)への変更可能 CDB構成 (シングルテナント)に戻すことは不可

利用可能なエディションと費用

Oracle Multitenant自体エディションを選ばず利用可能であるため、RDSにおいてもSE2、Enterprise両エディションでマルチテナント構成を利用可能です。

Oracle 19cより標準で最大3PDBまで利用可能で、4PDB以上使う場合はEnterprise Edition + Oracle Multitenantライセンスの追加購入が必要となります。

RDSインスタンスの利用費はPDBの数に依らずインスタンス単位での課金となります。

試してみた

それでは早速試してみます。

検証環境

今回は検証用AWSアカウントの東京リージョンに用意したVPC環境にOracle 21c SE2の環境を作っていきます。
VPCやセキュリティグループは既に準備済みの状態から開始します。

0. 事前準備

CDB構成用のパラメーターグループとオプショングループを作成しておきます。

マルチテナント用の特別な設定は不要でデフォルトのままで構いません。

1. RDSインスタンスの作成

ここからRDSインスタンスの作成を開始します。

マネジメントコンソールから新規インスタンスの作成を開始し、エンジンに「Oracle」を選びます。

「マルチテナントアーキテクチャ」にチェックを入れると、新たに「シングルテナント設定」or「マルチテナント設定」を選ぶことができる様になっています。
ここで「マルチテナント設定」を選ぶと複数PDB作成可能になります。

エディションやバージョンは環境に応じて選ぶことになりますが、今回はSE2で最新のOracle 21.0.0.0.ru-2023-10.rur-2023-10.r1バージョンを選択します。

マルチテナント設定を選ぶとインスタンス設定欄が少し変わり、「テナントデータベース設定」欄で最初のPDBに対する設定を行います。

その他設定は従来通り変わりないので割愛します。
環境に応じた内容にしてください。

一応先述のパラメーターグループとオプショングループはこんな感じで指定しています。

RDSインスタンスの作成が完了すると下図の様な感じなります。
マルチテナント設定の場合はツリー形式で各PDBを参照できる様になっていました。

インスタンス側の詳細に新たに「テナントデータベース」欄が増えPDB情報を参照可能です。

その他の項目はほとんど変わりなく「設定」欄でアーキテクチャ構成を確認できる様になっています。

続けてPDBの詳細画面はこんな感じです。

各PDBの設定画面ではPDB名と管理者ユーザーのパスワードだけ変更可能でした。

2. 接続方法

PDBへの接続方法は従来通り変わりありません。
RDSのDNSエンドポイントは全PDB共通となり、接続情報のSID指定に各PDB名を設定してやればOKです。

接続例

# SQL*Plusでの接続例 : SIDにPDB名を指定する
sqlplus 'dbuser@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=endpoint)(PORT=port))(CONNECT_DATA=(SID=pdb_name)))'

接続した結果も従来通り変わらないため割愛します。

3. PDBを増やしてみる

PDBを増やすにはインスタンスの「アクション」から「テナントDBを追加 - 新規」を選びます。

PDB作成画面に遷移するので必要な情報を記載し「テナントを追加」します。

これで追加のPDBが作成開始され、しばらく待てば利用可能となります。

4. PDBの削除

PDBを削除するときは対象を選んで「削除」するだけです。

確認ダイアログが出るので間違いないことを確認して削除してやれば削除されます。

ただし、PDBの数を0にすることはできません。
最後のPDBを削除する場合はRDSインスタンスごと削除する必要があります。

制限事項

基本的な機能はこんな感じですが、本日時点においてRDS for Oracleのマルチテナント機能には結構多くの制限があります。

詳細は上記ドキュメントで確認して頂きたいのですが、本記事では個人的に気になった点をいくつかピックアップします。

制限1. テナント数の上限

最初に解説した通りデフォルトではPDBの上限は3つです。
SE2の環境において4つ目のPDBを作ろうとすると以下のエラーとなります。

Oracle doesn't support more than 3 tenant databases for Standard Edition.

適切なライセンスを保有していないのでEnterprise Editionについては未確認です。

制限2. バックアップとリストア

RDS for Oracleにおけるバックアップはインスタンス単位であり、PDB個別のバックアップはありません。
各PDBの詳細画面に「スナップショット」欄がありますが、これはあくまでも自分自身が含まれるバックアップをフィルタして表示しているだけです。

(PDB2とPDB3がある環境での表示例。PDB3の方が新しく作成されているため自身を含むバックアップの数が少ない)

制限3. PDB単位でのメンテナンス

現時点のRDS for OracleではPDB単位でメンテナンスを行うことはできません。
メンテナンスはインスタンス単位となり、すべてのPDBが同時にメンテナンスされる形になります。

制限4. PDB単位での設定

Oracleの仕組みとしてはPDB毎の設定が可能ですが、RDS for Oracleにおいては現状PDB毎の設定は不可となっています。
各PDBはパラメーターグループの設定(インスタンス単位の設定)をそのまま引き継ぎます。

PDB単位で変更可能なパラメーターはV$PARAMETERISPDB_MODIFIABLE列で確認できます。
ISPDB_MODIFIABLE列がTRUEのもので、セッション単位で変更できないものを列挙すると以下になります。

現状これらのパラメーターをPDB個別に設定する必要がある場合はRDS for Oracleを採用できないのででご注意ください。

-- 今のRDS for Oracleでは個別に変更不可のパラメーター一覧
SELECT NAME, ISPDB_MODIFIABLE, ISSES_MODIFIABLE
  FROM V$PARAMETER 
 WHERE ISPDB_MODIFIABLE = 'TRUE'
   AND ISSES_MODIFIABLE = 'FALSE'
 ORDER BY NAME

Oracle 21cでの実行結果。

クリックすると展開
NAME ISPDB_MODIFIABLE ISSES_MODIFIABLE
_system_trig_enabled TRUE FALSE
adg_account_info_tracking TRUE FALSE
allow_deprecated_rpcs TRUE FALSE
aq_tm_processes TRUE FALSE
auto_start_pdb_services TRUE FALSE
awr_pdb_autoflush_enabled TRUE FALSE
bitmap_merge_area_size TRUE FALSE
blank_trimming TRUE FALSE
blockchain_table_max_no_drop TRUE FALSE
cell_offload_decryption TRUE FALSE
client_result_cache_lag TRUE FALSE
client_result_cache_size TRUE FALSE
client_statistics_level TRUE FALSE
commit_point_strength TRUE FALSE
common_user_prefix TRUE FALSE
cpu_count TRUE FALSE
cpu_min_count TRUE FALSE
create_bitmap_area_size TRUE FALSE
db_block_checking TRUE FALSE
db_domain TRUE FALSE
db_files TRUE FALSE
db_performance_profile TRUE FALSE
distributed_lock_timeout TRUE FALSE
drcp_connection_limit TRUE FALSE
drcp_dedicated_opt TRUE FALSE
enable_automatic_maintenance_pdb TRUE FALSE
encrypt_new_tablespaces TRUE FALSE
fixed_date TRUE FALSE
forward_listener TRUE FALSE
heartbeat_batch_size TRUE FALSE
inmemory_automatic_level TRUE FALSE
inmemory_expressions_usage TRUE FALSE
inmemory_force TRUE FALSE
inmemory_optimized_arithmetic TRUE FALSE
inmemory_prefer_xmem_memcompress TRUE FALSE
inmemory_prefer_xmem_priority TRUE FALSE
inmemory_size TRUE FALSE
inmemory_virtual_columns TRUE FALSE
inmemory_xmem_size TRUE FALSE
job_queue_processes TRUE FALSE
ldap_directory_access TRUE FALSE
ldap_directory_sysauth TRUE FALSE
listener_networks TRUE FALSE
lob_signature_enable TRUE FALSE
local_listener TRUE FALSE
long_module_action TRUE FALSE
mandatory_user_profile TRUE FALSE
max_auth_servers TRUE FALSE
max_datapump_jobs_per_pdb TRUE FALSE
max_datapump_parallel_per_job TRUE FALSE
max_idle_blocker_time TRUE FALSE
max_idle_time TRUE FALSE
max_iops TRUE FALSE
max_mbps TRUE FALSE
max_pdbs TRUE FALSE
max_string_size TRUE FALSE
min_auth_servers TRUE FALSE
native_blockchain_features TRUE FALSE
open_cursors TRUE FALSE
open_links TRUE FALSE
optimizer_secure_view_merging TRUE FALSE
parallel_max_servers TRUE FALSE
parallel_servers_target TRUE FALSE
pdb_os_credential TRUE FALSE
pkcs11_library_location TRUE FALSE
private_temp_table_prefix TRUE FALSE
remote_listener TRUE FALSE
remote_recovery_file_dest TRUE FALSE
resource_limit TRUE FALSE
resource_manager_plan TRUE FALSE
result_cache_execution_threshold TRUE FALSE
result_cache_max_result TRUE FALSE
result_cache_max_size TRUE FALSE
result_cache_max_temp_result TRUE FALSE
result_cache_max_temp_size TRUE FALSE
rollback_segments TRUE FALSE
scheduler_follow_pdbtz TRUE FALSE
sessions TRUE FALSE
shadow_core_dump TRUE FALSE
shared_servers TRUE FALSE
sql92_security TRUE FALSE
tablespace_encryption_default_algorithm TRUE FALSE
tde_configuration TRUE FALSE
timezone_version_upgrade_online TRUE FALSE
undo_management TRUE FALSE
undo_retention TRUE FALSE
undo_tablespace TRUE FALSE
unified_audit_systemlog TRUE FALSE

ちなみにセッション単位で変更可能なパラメーターは以下の通りです。
こちらの場合であればワークアラウンドがあるかもしれません。

-- セッション単位でなら調整可能なパラメーター一覧
SELECT NAME, ISPDB_MODIFIABLE, ISSES_MODIFIABLE
  FROM V$PARAMETER 
 WHERE ISPDB_MODIFIABLE = 'TRUE'
   AND ISSES_MODIFIABLE = 'TRUE'
 ORDER BY NAME

Oracle 21cでの実行結果。

クリックすると展開
NAME ISPDB_MODIFIABLE ISSES_MODIFIABLE
allow_rowid_column_type TRUE TRUE
approx_for_aggregation TRUE TRUE
approx_for_count_distinct TRUE TRUE
approx_for_percentile TRUE TRUE
asm_diskstring TRUE TRUE
cell_offload_compaction TRUE TRUE
cell_offload_parameters TRUE TRUE
cell_offload_plan_display TRUE TRUE
cell_offload_processing TRUE TRUE
cell_offloadgroup_name TRUE TRUE
commit_logging TRUE TRUE
commit_wait TRUE TRUE
commit_write TRUE TRUE
container_data TRUE TRUE
containers_parallel_degree TRUE TRUE
create_stored_outlines TRUE TRUE
cursor_bind_capture_destination TRUE TRUE
cursor_invalidation TRUE TRUE
cursor_sharing TRUE TRUE
db_create_file_dest TRUE TRUE
db_create_online_log_dest_1 TRUE TRUE
db_create_online_log_dest_2 TRUE TRUE
db_create_online_log_dest_3 TRUE TRUE
db_create_online_log_dest_4 TRUE TRUE
db_create_online_log_dest_5 TRUE TRUE
db_file_multiblock_read_count TRUE TRUE
db_file_name_convert TRUE TRUE
db_index_compression_inheritance TRUE TRUE
db_securefile TRUE TRUE
db_unrecoverable_scn_tracking TRUE TRUE
ddl_lock_timeout TRUE TRUE
default_sharing TRUE TRUE
deferred_segment_creation TRUE TRUE
dst_upgrade_insert_conv TRUE TRUE
enable_ddl_logging TRUE TRUE
global_names TRUE TRUE
heat_map TRUE TRUE
hybrid_read_only TRUE TRUE
ignore_session_set_param_errors TRUE TRUE
inmemory_clause_default TRUE TRUE
inmemory_deep_vectorization TRUE TRUE
inmemory_query TRUE TRUE
java_jit_enabled TRUE TRUE
log_archive_min_succeed_dest TRUE TRUE
max_dump_file_size TRUE TRUE
multishard_query_data_consistency TRUE TRUE
multishard_query_partial_results TRUE TRUE
nls_calendar TRUE TRUE
nls_comp TRUE TRUE
nls_currency TRUE TRUE
nls_date_format TRUE TRUE
nls_date_language TRUE TRUE
nls_dual_currency TRUE TRUE
nls_iso_currency TRUE TRUE
nls_language TRUE TRUE
nls_length_semantics TRUE TRUE
nls_nchar_conv_excp TRUE TRUE
nls_numeric_characters TRUE TRUE
nls_sort TRUE TRUE
nls_territory TRUE TRUE
nls_time_format TRUE TRUE
nls_time_tz_format TRUE TRUE
nls_timestamp_format TRUE TRUE
nls_timestamp_tz_format TRUE TRUE
object_cache_max_size_percent TRUE TRUE
object_cache_optimal_size TRUE TRUE
olap_page_pool_size TRUE TRUE
optimizer_adaptive_plans TRUE TRUE
optimizer_adaptive_reporting_only TRUE TRUE
optimizer_adaptive_statistics TRUE TRUE
optimizer_capture_sql_plan_baselines TRUE TRUE
optimizer_capture_sql_quarantine TRUE TRUE
optimizer_cross_shard_resiliency TRUE TRUE
optimizer_dynamic_sampling TRUE TRUE
optimizer_features_enable TRUE TRUE
optimizer_ignore_hints TRUE TRUE
optimizer_ignore_parallel_hints TRUE TRUE
optimizer_index_caching TRUE TRUE
optimizer_index_cost_adj TRUE TRUE
optimizer_inmemory_aware TRUE TRUE
optimizer_mode TRUE TRUE
optimizer_real_time_statistics TRUE TRUE
optimizer_use_invisible_indexes TRUE TRUE
optimizer_use_pending_statistics TRUE TRUE
optimizer_use_sql_plan_baselines TRUE TRUE
optimizer_use_sql_quarantine TRUE TRUE
parallel_degree_limit TRUE TRUE
parallel_degree_policy TRUE TRUE
parallel_force_local TRUE TRUE
parallel_instance_group TRUE TRUE
parallel_min_degree TRUE TRUE
parallel_min_time_threshold TRUE TRUE
pdb_file_name_convert TRUE TRUE
pdb_lockdown TRUE TRUE
pdb_template TRUE TRUE
plscope_settings TRUE TRUE
plsql_ccflags TRUE TRUE
plsql_code_type TRUE TRUE
plsql_debug TRUE TRUE
plsql_optimize_level TRUE TRUE
plsql_v2_compatibility TRUE TRUE
plsql_warnings TRUE TRUE
query_rewrite_enabled TRUE TRUE
query_rewrite_integrity TRUE TRUE
recyclebin TRUE TRUE
remote_dependencies_mode TRUE TRUE
result_cache_mode TRUE TRUE
result_cache_remote_expiration TRUE TRUE
resumable_timeout TRUE TRUE
session_cached_cursors TRUE TRUE
shard_queries_restricted_by_key TRUE TRUE
shrd_dupl_table_refresh_rate TRUE TRUE
skip_unusable_indexes TRUE TRUE
smtp_out_server TRUE TRUE
sort_area_retained_size TRUE TRUE
sort_area_size TRUE TRUE
spatial_vector_acceleration TRUE TRUE
sql_trace TRUE TRUE
sqltune_category TRUE TRUE
star_transformation_enabled TRUE TRUE
statistics_level TRUE TRUE
tde_key_cache TRUE TRUE
temp_undo_enabled TRUE TRUE
timed_os_statistics TRUE TRUE
timed_statistics TRUE TRUE
workarea_size_policy TRUE TRUE
xml_db_events TRUE TRUE

制限5. その他テナントデータベースの制限

現状Oracle Multitenant機能のうち以下の機能が制限されています。

  • PDBの起動と停止は出来ません (インスタンス単位での起動と一時停止のみ可)
  • PDBのアンプラグは出来ません
  • Application PDBおよびProxy PDBは使えません
  • テナントデータベースの名前にCDB$ROOTPDB$SEEDは指定できません

また、マルチテナント構成の場合以下の機能が非サポートとなっています。

  • Oracle Data Guard
  • Database Activity Streams

なお、上記が全てではないので詳細は公式ドキュメントをご覧ください。

余談 : 物理ファイル構成

大した意味は無いのですが調査するだけしてみたのでその結果を残しておきます。
RDS for Oracleの物理ファイルは/rdsdbdata/db/配下に置かれますが、マルチテナント環境では

  • /rdsdbdata/db/cdb/ : インスタンス共有データ、CDBのデータ
  • /rdsdbdata/db/pdb/ : PDB毎のデータ

というディレクトリ構成になっている模様です。
各種ファイルを調査した結果は以下の通りでした。

# 制御ファイル
/rdsdbdata/db/cdb/RDSCDB_A/controlfile/control-01.ctl
# REDOログ
/rdsdbdata/db/cdb/RDSCDB_A/onlinelog/o1_mf_1_xxxxxxxx_.log
/rdsdbdata/db/cdb/RDSCDB_A/onlinelog/o1_mf_2_xxxxxxxx_.log
/rdsdbdata/db/cdb/RDSCDB_A/onlinelog/o1_mf_3_xxxxxxxx_.log
/rdsdbdata/db/cdb/RDSCDB_A/onlinelog/o1_mf_4_xxxxxxxx_.log
# DBF (PDB別)
/rdsdbdata/db/pdb/RDSCDB_A/PDBのGUID/datafile/o1_mf_system_xxxxxxxx_.dbf
/rdsdbdata/db/pdb/RDSCDB_A/PDBのGUID/datafile/o1_mf_sysaux_xxxxxxxx_.dbf
/rdsdbdata/db/pdb/RDSCDB_A/PDBのGUID/datafile/o1_mf_undo_t1_xxxxxxxx_.dbf
/rdsdbdata/db/pdb/RDSCDB_A/PDBのGUID/datafile/o1_mf_users_xxxxxxxx_.dbf
/rdsdbdata/db/pdb/RDSCDB_A/PDBのGUID/datafile/o1_mf_rdsadmin_xxxxxxxx_.dbf
# TEMP (PDB別)
/rdsdbdata/db/pdb/RDSCDB_A/PDBのGUID/datafile/o1_mf_temp_xxxxxxxx_.dbf

最後に

以上となります。

本日時点ではまだ制限が多く皆さんが期待する「マルチテナント」な利用は難しそうです。
いまのところは開発環境向けに手軽に分離された環境を作るのに向いてるかなと思いました。

将来的には制限も解除されていくと思うので期待して待つと良さそうです。