![[アップデート] RDS for OracleがOracle Multitenantのマルチテナント構成をサポートしました](https://devio2023-media.developers.io/wp-content/uploads/2023/08/amazon-rds.png)
[アップデート] RDS for OracleがOracle Multitenantのマルチテナント構成をサポートしました
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
しばたです。
先日より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$PARAMETERのISPDB_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$ROOTとPDB$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
最後に
以上となります。
本日時点ではまだ制限が多く皆さんが期待する「マルチテナント」な利用は難しそうです。
いまのところは開発環境向けに手軽に分離された環境を作るのに向いてるかなと思いました。
将来的には制限も解除されていくと思うので期待して待つと良さそうです。






