OceanBaseデータベースはネイティブ分散型データベースであり、同一のデータベース内で複数のデータベースインスタンスを同時に実行できます。最初のステップとして、通常はテナント(データベースインスタンス)を作成し、従来の単一マシンデータベースのようにそのインスタンスを使用します。本記事では、テナントの作成方法について説明します。
テナント作成のプロセス
OceanBaseデータベースはユーザーテナントの作成のみをサポートしており、システムテナントはクラスタ作成時に自動的に作成されます。ユーザーテナントの作成は一連の操作の組み合わせであり、まずリソース仕様を作成し、そのリソース仕様に基づいてリソースプールを作成し、最後にテナントを作成してそのリソースプールを指定します。したがって、テナント作成の順序は次のとおりです:リソース仕様 -> リソースプール -> テナント。
リソース仕様の作成:リソース仕様の作成は仕様の定義に過ぎず、実際にはリソースを割り当てません。
DBA_OB_UNIT_CONFIGSビューですべてのリソース仕様を確認できます。リソース仕様は再利用可能であり、ビジネスシナリオに応じて小規模、中規模、大規模など、いくつかの異なる仕様を抽象化することを推奨します。これにより、運用保守の複雑さを低減できます。ただし、複数のテナントが同じリソース仕様を共有している場合に、特定のテナントのリソースが不足して緊急拡張が必要な場合、元の仕様を直接調整することはできません。独立した新しいリソース仕様を作成して切り替えるか、より大きなレベルのリソース仕様に直接切り替える必要があります。リソースプールの作成:リソースプールを作成すると、Unitが実際に作成され、仕様に従ってリソースが割り当てられます。対応するノードの予約リソースが不足している場合は作成に失敗します。
GV$OB_SERVERSビューですべてのノードのリソース割り当て情報を確認できます。作成に成功した場合は、DBA_OB_RESOURCE_POOLSビューとDBA_OB_UNITSビューでリソースプール及び対応するUnitを確認できます。リソースプールは再利用できません。テナント作成後に指定されたリソースプールは、そのテナントに割り当てられます。テナントの作成:テナントを作成する際には、
RESOURCE_POOL_LISTを指定してリソースプールをテナントに割り当てます。DBA_OB_TENANTSビューですべてのテナントを確認できます。各Zoneに1つのリソースプールを設定し、独立したリソース仕様を使用することもできます。または、すべてのZoneが同じリソースプールを使用することで、すべてのZoneが同じリソース仕様を使用することもできます。リソースプールリスト以外にも、互換モード、プライマリZone、ローカリティ、接続ホワイトリストなど、他の重要な属性やシステム変数があります。その中で、リソースプールリストはテナント作成時の必須項目です。新規テナントのRootユーザーパスワードは空です。使用する前にパスワードを設定してください。
リソース計画
テナントを作成する前に、リソース計画をしっかり立てておく必要があります。テナント作成後に調整を加えると、非常に面倒になる可能性があります。適切なリソース計画を立てるための前提条件は、ビジネスシナリオを深く理解し、ビジネスデータベースアーキテクチャ設計により積極的に関わることです。
リソース計画に際しては、以下の点に注意してください:
各ノードには一定のリソースを予約しておく必要があります。これは、テナントの容量が不足し緊急拡張が必要な場合に備えるためです。
大量書き込みを伴う業務では、メモリとログディスクの仕様を大きく設定する必要があります。CPUリソースを大量に消費する業務では、ノード間で分散配置することで、ノードの負荷不均衡やホットスポットの発生を防ぎ、業務への影響を抑える必要があります。
クラスタ構成パラメータ
resource_hard_limitはCPUリソースのオーバーコミット率を定義しており、「オーバーコミットパラメータ」とも呼ばれます。OceanBaseデータベースはCPUのオーバーコミットのみをサポートしており、他のリソースのオーバーコミットはサポートしていません。CPUのオーバーコミットは、同一クラスタ内の異なるテナント間でピークがずれるシナリオに適しており、全体のリソース利用率を向上させます。テナント間でピークが同時に発生する場合、CPUのオーバーコミットを有効にすると、テナント間でCPUリソースを奪い合い、相互に影響を及ぼす可能性があります。Unitのリソース仕様は、単一ノードで割り当て可能な総リソースを超えてはなりません。単一Unitテナント(リソースプールの
UNIT_NUM=1)で容量ボトルネックが発生した場合、より大きな仕様のサーバーに交換するほかに、テナントを水平方向に複数Unitに拡張し、複数ノードのリソースを活用することもできます。複数Unitテナントでは、Unit間での業務データの分散配置を慎重に設計する必要があります。これにより、分散トランザクションによるパフォーマンスの低下を防ぐことができます。業務量が単一マシンの容量上限を超えると予測される場合は、事前にデータシャーディングの設計を行う必要があります。データシャーディングでは、分散トランザクションをできるだけ回避する必要があります。従来のデータベースからOceanBaseデータベースへ移行する業務では、移行の円滑さのため、対等アーキテクチャを採用することが一般的です。これは、単一Unitテナントの設計案を採用し、業務がデータベースにアクセスする際に依然として単一ノードのみにアクセスすることを保証するものです。業務量の増加に伴い単一マシンの容量上限に達した後は、複数Unitテナントに拡張し、業務シナリオに応じて業務データを複数のグループに分割することができます。各業務データグループを1つのUnitに配置することで、各業務のデータベースアクセスがマシンを跨がないようにし、パフォーマンス損失なしで水平方向に拡張することが実現できます。これは、OceanBaseデータベースが従来のデータベースに比べる優れたアーキテクチャ上の利点の一つであり、使いやすい水平方向の拡張性により、容易に単一マシンの容量上限を突破できる点です。
注意事項
OceanBaseデータベースは、MySQL互換モードとOracle互換モードの2種類のテナントをサポートしています。テナントを作成する際には、テナントのタイプを指定する必要があります。テナント作成後は、テナントタイプを変更することはできません。そのため、テナントを作成する前に、テナントタイプをしっかり計画してください。
ステップ1:リソース仕様の作成
リソース仕様とは、CPU、メモリ、ディスク容量、IOPSなどのリソース項目を定義するものです。
説明
OceanBaseデータベース3.x系での豊富な実践経験に基づき、OceanBaseデータベースV4.0ではリソース管理機能が大幅に改善されています:
- UnitレベルでCPU、メモリ、ログディスク容量、IOPSなどのリソース項目を管理できますが、Unitレベルでのデータディスク容量やセッション数などのリソース項目の管理はサポートされません。3.x系の運用ツールやテストケースとの互換性のため、
CREATE RESOURCE UNITステートメントでMAX_DISK_SIZEとMAX_SESSION_NUMを指定することは可能ですが、無効であり、エラーも報告されません。 - CPUオーバーコミットをサポートしており、オーバーコミットパラメータ
resource_hard_limitで制御します。GV$OB_SERVERSビューのCPU_CAPACITYフィールドとCPU_CAPACITY_MAXフィールドは、それぞれノードのCPU総容量とノードのCPU総容量のオーバーコミット値を表し、CPU_CAPACITY_MAX = CPU_CAPACITY * resource_hard_limitとなります。 - メモリオーバーコミットはサポートされなくなりました。メモリオーバーコミットの導入は、テナントの動作不安定を引き起こす可能性があるためです。
- テナント間のログディスク容量の分離をサポートしています。システムは各テナントのためにログディスク容量を予約し、V3.x系であるテナントからの大量書き込みによりログディスクの書き込みがパンクし、他のテナントに影響を与える問題を回避します。
- テナント間のIOPS分離をサポートしています。3つのIOPS仕様パラメータ
MIN_IOPS、MAX_IOPS、IOPS_WEIGHTを導入しています。IOPS仕様パラメータはデフォルトで指定する必要はなく、システムがCPU仕様に基づいて自動的に計算します。あるノード上のすべてのUnitのMIN_IOPSの合計がディスクIOPSの上限を超えた場合、IOPS_WEIGHTの重みに従ってIOPSリソースが割り当てられます。 - Metaテナントには独立したUnitがなく、システムがテナントを作成する際にデフォルトでMetaテナント用のリソースを予約し、各種リソースはユーザーテナントのリソースから差し引かれます。Metaの各種リソースはデフォルト設定を採用しており、ユーザー指定はサポートされません。
- リソース仕様を作成する際、CPU仕様とメモリ仕様は必須項目であり、その他のパラメータは自動的に計算されます。ログディスク容量はメモリ仕様に基づいて自動的に計算され、IOPS仕様はCPU仕様に基づいて自動的に計算されます。
操作手順
rootユーザーでクラスタのsysテナントにログインします。obclient -h172.30.xx.xx -P2883 -uroot@sys#cluster -p**** -Aoceanbaseデータベースに入ります。obclient(root@sys)[(none)]> USE oceanbase;DBA_OB_UNIT_CONFIGSビューを参照して、既存のリソース仕様情報を取得します。obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_UNIT_CONFIGS;実行結果は次のとおりです:
+----------------+-----------------+----------------------------+----------------------------+---------+---------+-------------+---------------+----------------+---------------------+---------------------+-------------+---------------------+----------------------+ | UNIT_CONFIG_ID | NAME | CREATE_TIME | MODIFY_TIME | MAX_CPU | MIN_CPU | MEMORY_SIZE | LOG_DISK_SIZE | DATA_DISK_SIZE | MAX_IOPS | MIN_IOPS | IOPS_WEIGHT | MAX_NET_BANDWIDTH | NET_BANDWIDTH_WEIGHT | +----------------+-----------------+----------------------------+----------------------------+---------+---------+-------------+---------------+----------------+---------------------+---------------------+-------------+---------------------+----------------------+ | 1 | sys_unit_config | 2025-05-16 11:30:47.000298 | 2025-05-16 11:30:47.000298 | 4 | 4 | 5368709120 | 17448304640 | NULL | 9223372036854775807 | 9223372036854775807 | 4 | 9223372036854775807 | 4 | | 1001 | unit001 | 2025-05-16 11:31:08.531754 | 2025-05-16 11:31:08.531754 | 2 | 2 | 6442450944 | 19327352832 | NULL | 9223372036854775807 | 9223372036854775807 | 2 | 9223372036854775807 | 2 | +----------------+-----------------+----------------------------+----------------------------+---------+---------+-------------+---------------+----------------+---------------------+---------------------+-------------+---------------------+----------------------+ 2 rows in setDBA_OB_UNIT_CONFIGSビューの詳細については、DBA_OB_UNIT_CONFIGSを参照してください。CREATE RESOURCE UNITステートメントを使用して、リソース仕様を作成します。構文は以下のとおりです:
CREATE RESOURCE UNIT unit_name MEMORY_SIZE [=] 'size_value', MAX_CPU [=] cpu_num, [MAX_IOPS [=] iops_num,] [MIN_CPU [=] cpu_num,] [MIN_IOPS [=] iops_num,] [IOPS_WEIGHT [=]iopsweight,] [MAX_NET_BANDWIDTH [=] bandwidth_num,] [NET_BANDWIDTH_WEIGHT [=] bandwidth_weight_num,] [LOG_DISK_SIZE [=] 'size_value'];パラメータの説明:
リソース仕様を作成する際、MAX_CPUとMEMORY_SIZEは必須です。
unit_name:リソース仕様名。MEMORY_SIZE:メモリ仕様で、その最小値は隠れた構成パラメータ__min_full_resource_pool_memoryによって制御され、デフォルトは5GBですが、サポートされる最小値は4GBに調整可能です。OceanBaseデータベースV4.0以降、メモリオーバーコミットはサポートされません。MAX_CPU:CPU仕様の上限で、MIN_CPUはCPU仕様の下限です。単位はコア数です。ユーザーがMIN_CPUを指定しない場合、デフォルトでMAX_CPUの値と等しくなります。MIN_CPU:最小のCPU仕様で、すべてのテナントのMIN_CPUの合計は、そのノードのCPU総容量CPU_CAPACITYを超えてはなりません。MAX_IOPSとMIN_IOPS:現在のUnitが使用できるIOPSリソースの上限と下限を指定します。最小値はどちらも1024であり、MAX_IOPS >= MIN_IOPSが必要です。MAX_IOPSとMIN_IOPSを設定すると、OceanBaseデータベース内部では一律に16KB読み取りのIOPS値を有効値として処理します。そのため、MAX_IOPSとMIN_IOPSの値を、後のテナント内のリソース分離を考慮して、現在のディスクから計算された16KB読み取りに対応するIOPS値に設定することを推奨します。IOPSベンチマーク値の計算方法については、ディスク性能キャリブレーションを参照してください。テナント内のリソース分離の詳細と操作については、リソース分離の概要を参照してください。IOPS関連パラメータが指定されていない場合、内部での値の取り扱い規則は以下のとおりです:
MIN_IOPSとMAX_IOPSがどちらも指定されていない場合、システムはIOPS_WEIGHTに基づいて自動的にIOPSリソースを割り当てます。この場合:MIN_IOPSとMAX_IOPSの値はどちらもINT64_MAXとなります。IOPS_WEIGHTの値が指定されていない場合、IOPS_WEIGHT = MIN_CPUとなります。IOPS_WEIGHTの値が指定されている場合、指定された値が優先されます。
MAX_IOPSの値のみが指定されている場合、MIN_IOPSの値はMAX_IOPSの値を取ります。同様に、MIN_IOPSの値のみが指定されている場合、MAX_IOPSの値はMIN_IOPSの値を取ります。この場合:IOPS_WEIGHTの値が指定されていない場合、デフォルトで0となります。
MAX_NET_BANDWIDTH:テナントの各Unitが使用できるネットワーク帯域幅の上限を指定します。最小値は1MBです。指定しない場合、デフォルト値はINT64_MAXとなります。NET_BANDWIDTH_WEIGHT:テナントUnitのネットワーク帯域幅の重みを指定します。これは、各OBServerの帯域幅を各テナントに割り当てる比率を計算するために使用されます。最小値は0です。指定しない場合、システムは以下のルールに従ってNET_bandWIDTH_WEIGHTの値を自動的に計算します:MAX_NET_BANDWIDTHが指定されている場合、NET_BANDWIDTH_WEIGHTの値は0となります。MAX_NET_BANDWIDTHが指定されていない場合、NET_BANDWIDTH_WEIGHT = MIN_CPUとなります。
LOG_DISK_SIZE:ログディスク容量です。OceanBaseデータベースV4.0では、ログディスク容量をテナントごとに管理します。システムは各テナントのためにログディスク容量を予約し、テナントごとの分離を実現します。ユーザーが指定しない場合、LOG_DISK_SIZEのデフォルト値はメモリ仕様の3倍で、最小は2GBです。OceanBaseデータベースV4.0は、テナント間のIOPS分離をサポートしており、
MAX_IOPS、MIN_IOPS、IOPS_WEIGHTの3つのパラメータで決定されます。IOPS仕様パラメータはデフォルトで指定する必要はなく、システムがCPU仕様に基づいて自動的に計算します。パラメータに値を指定する際、引用符なしの純粋な数字のみを使用することも、単位を含む引用符付きの文字列、または単位を含む引用符なしの文字列を使用することもできます(例:
'1T'、'1G'、'1M'、'1K')。その中で:
MAX_CPU、MIN_CPU、MAX_IOPS、MIN_IOPS、IOPS_WEIGHT、NET_BANDWIDTH_WEIGHTといった整数型パラメータについて、パラメータ値に単位を含む引用符付きの文字列を使用する場合、その単位は個を意味します。つまり、'1K' = 1000、'1M' = 1000000です。例:MAX_IOPS='2K'はMAX_IOPS=2000と等価です。単位を含む引用符なしの文字列を使用する場合、その意味は引用符なしの場合と同じで、'100' = 100、'1000' = 1000となります。
MEMORY_SIZE、MAX_NET_BANDWIDTH、LOG_DISK_SIZEといった容量型パラメータについて、単位を含む引用符付きの文字列を使用する場合、引用符なしの純粋な数字と同様に、その単位はバイトを意味します。つまり、'1K' = 1024、'1M' = 1024 * 1024です。単位を含む引用符なしの文字列を使用する場合、引用符内の数値のデフォルト単位はMBです。つまり、'100' = '100M' = 100 * 1024 * 1024となります。
CREATE RESOURCE UNITステートメントの詳細については、CREATE RESOURCE UNITを参照してください。例:
名前が
S1_unit_configのリソース仕様を作成します。そのリソース構成は、CPUが1コア、メモリが5GB、ログディスク容量が6GBです。obclient(root@sys)[oceanbase]> CREATE RESOURCE UNIT S1_unit_config MEMORY_SIZE = '5G', MAX_CPU = 1, MIN_CPU = 1, LOG_DISK_SIZE = '6G', MAX_IOPS = 10000, MIN_IOPS = 10000, IOPS_WEIGHT=1;DBA_OB_UNIT_CONFIGSビューをクエリして、リソース仕様の作成が成功したことを確認します。obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_UNIT_CONFIGS WHERE NAME = 'S1_unit_config';実行結果は次のとおりです:
+----------------+----------------+----------------------------+----------------------------+---------+---------+-------------+---------------+----------------+----------+----------+-------------+---------------------+----------------------+ | UNIT_CONFIG_ID | NAME | CREATE_TIME | MODIFY_TIME | MAX_CPU | MIN_CPU | MEMORY_SIZE | LOG_DISK_SIZE | DATA_DISK_SIZE | MAX_IOPS | MIN_IOPS | IOPS_WEIGHT | MAX_NET_BANDWIDTH | NET_BANDWIDTH_WEIGHT | +----------------+----------------+----------------------------+----------------------------+---------+---------+-------------+---------------+----------------+----------+----------+-------------+---------------------+----------------------+ | 1002 | S1_unit_config | 2025-05-28 10:20:38.299456 | 2025-05-28 10:20:38.299456 | 1 | 1 | 5368709120 | 6442450944 | NULL | 10000 | 10000 | 1 | 9223372036854775807 | 1 | +----------------+----------------+----------------------------+----------------------------+---------+---------+-------------+---------------+----------------+----------+----------+-------------+---------------------+----------------------+ 1 row in set
ステップ2:リソースプールの作成
リソース仕様を作成した後、リソースプール作成時にその仕様を指定することで、対応するサイズのリソースユニットを使用し、最終的に該当するテナントに割り当てることができます。
前提条件
- クラスタにリソースプールを作成するための十分な利用可能リソースがあるか確認してください。詳細な操作については、テナントとリソース情報の確認を参照してください。
- リソースプール作成時には、そのリソース仕様を指定する必要があります。リソースプール作成操作を実行する前に、利用可能なリソース仕様があるか確認してください。リソース仕様の作成手順の詳細については、リソース仕様の作成を参照してください。
操作手順
rootユーザーでクラスタのsysテナントにログインします。
obclient -h172.30.xx.xx -P2883 -uroot@sys#cluster -p**** -Aoceanbaseデータベースに入ります。obclient(root@sys)[(none)]> USE oceanbase;DBA_OB_RESOURCE_POOLSビューから、リソースプールの設定情報を取得します。obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_RESOURCE_POOLS;実行結果は次のとおりです:
+------------------+----------+-----------+----------------------------+----------------------------+------------+----------------+-----------+--------------+ | RESOURCE_POOL_ID | NAME | TENANT_ID | CREATE_TIME | MODIFY_TIME | UNIT_COUNT | UNIT_CONFIG_ID | ZONE_LIST | REPLICA_TYPE | +------------------+----------+-----------+----------------------------+----------------------------+------------+----------------+-----------+--------------+ | 1 | sys_pool | 1 | 2025-05-16 11:30:47.004523 | 2025-05-16 11:30:47.011196 | 1 | 1 | zone1 | FULL | | 1001 | pool001 | 1002 | 2025-05-16 11:31:11.735042 | 2025-05-16 11:31:19.924596 | 1 | 1001 | zone1 | FULL | | 1002 | pool002 | 1004 | 2025-05-16 11:31:15.142237 | 2025-05-16 11:32:01.555002 | 1 | 1001 | zone1 | FULL | +------------------+----------+-----------+----------------------------+----------------------------+------------+----------------+-----------+--------------+ 3 rows in setDBA_OB_RESOURCE_POOLSビューの詳細説明については、DBA_OB_RESOURCE_POOLSを参照してください。CREATE RESOURCE POOLステートメントを使用して、リソースプールを作成します。構文は以下のとおりです:
CREATE RESOURCE POOL poolname UNIT [=] unitname, UNIT_NUM [=] unitnum, ZONE_LIST [=] ('zone' [, 'zone' ...]);パラメータの説明:
UNIT:このリソースプールのリソース仕様です。UNIT_NUM:このリソースプールがターゲットゾーンにおけるユニット数です。その値はターゲットゾーンのノード数より小さくする必要があり、各ノード上には同一テナントの最大1つのユニットしか配置できません。ZONE_LIST:リソースプールのゾーン配置です。OceanBaseデータベースはZONE_LISTで記述された各ゾーンにUNIT_NUM個のユニットを作成し、各ユニットのリソース仕様はUNITパラメータで設定された値となります。
CREATE RESOURCE POOLステートメントの詳細説明については、CREATE RESOURCE POOLを参照してください。例:
mq_pool_01という名前のリソースプールを作成し、zone1とzone2にそれぞれ1つのユニットを作成します。各ユニットのリソース仕様はS1_unit_configです。obclient(root@sys)[oceanbase]> CREATE RESOURCE POOL mq_pool_01 UNIT='S1_unit_config', UNIT_NUM=1, ZONE_LIST=('zone1','zone2');mq_pool_02という名前のリソースプールを作成し、zone3に2つのユニットを作成します。各ユニットのリソース仕様はS1_unit_configです。obclient [oceanbase]> CREATE RESOURCE POOL mq_pool_02 UNIT='S1_unit_config', UNIT_NUM=2, ZONE_LIST=('zone3');
DBA_OB_RESOURCE_POOLSビューをクエリし、リソースプールの作成が成功したことを確認します。リソースプール
mq_pool_01が正常に作成されたか確認します:obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_RESOURCE_POOLS WHERE NAME = 'mq_pool_01';実行結果は次のとおりです:
+------------------+------------+-----------+----------------------------+----------------------------+------------+----------------+-------------+--------------+ | RESOURCE_POOL_ID | NAME | TENANT_ID | CREATE_TIME | MODIFY_TIME | UNIT_COUNT | UNIT_CONFIG_ID | ZONE_LIST | REPLICA_TYPE | +------------------+------------+-----------+----------------------------+----------------------------+------------+----------------+-------------+--------------+ | 1003 | mq_pool_01 | NULL | 2026-01-10 22:37:08.212366 | 2026-01-10 22:37:08.212366 | 1 | 1002 | zone1;zone2 | FULL | +------------------+------------+-----------+----------------------------+----------------------------+------------+----------------+-------------+--------------+ 1 row in setリソースプール
mq_pool_02が正常に作成されたか確認します:obclient(root@sys)[oceanbase]> SELECT * FROM DBA_OB_RESOURCE_POOLS WHERE NAME = 'mq_pool_02';実行結果は次のとおりです:
+------------------+------------+-----------+----------------------------+----------------------------+------------+----------------+-----------+--------------+ | RESOURCE_POOL_ID | NAME | TENANT_ID | CREATE_TIME | MODIFY_TIME | UNIT_COUNT | UNIT_CONFIG_ID | ZONE_LIST | REPLICA_TYPE | +------------------+------------+-----------+----------------------------+----------------------------+------------+----------------+-----------+--------------+ | 1004 | mq_pool_02 | NULL | 2026-01-10 21:53:58.258888 | 2026-01-10 22:10:36.404338 | 2 | 1002 | zone3 | FULL | +------------------+------------+-----------+----------------------------+----------------------------+------------+----------------+-----------+--------------+ 1 row in set
ステップ3:テナントを作成する
リソースプールを作成した後、ビジネスニーズに応じてテナントに割り当てることができます。
前提条件
利用可能なリソースプールが存在することを確認してください。リソースプールおよびリソースユニットの作成手順の詳細については、リソースプールの作成を参照してください。
注意事項
OceanBaseデータベースは、MySQL互換モードとOracle互換モードの2種類のテナントをサポートしています。テナント作成時に、テナントのタイプを指定する必要があります。テナント作成後はテナントタイプを変更できないため、作成前にテナントタイプを慎重に計画してください。
操作手順
rootユーザーでクラスタのsysテナントにログインします。
obclient -h172.30.xx.xx -P2883 -uroot@sys#cluster -p**** -Aoceanbaseデータベースに接続します。obclient(root@sys)[(none)]> USE oceanbase;DBA_OB_TENANTSビューを使用して、すべてのテナント情報を確認します。obclient(root@sys)[oceanbase]> SELECT TENANT_ID, TENANT_NAME, TENANT_TYPE, CREATE_TIME, MODIFY_TIME, PRIMARY_ZONE, LOCALITY, COMPATIBILITY_MODE, STATUS, TENANT_ROLE FROM oceanbase.DBA_OB_TENANTS;実行結果は次のとおりです:
+-----------+-------------+-------------+----------------------------+----------------------------+--------------+---------------+--------------------+--------+-------------+ | TENANT_ID | TENANT_NAME | TENANT_TYPE | CREATE_TIME | MODIFY_TIME | PRIMARY_ZONE | LOCALITY | COMPATIBILITY_MODE | STATUS | TENANT_ROLE | +-----------+-------------+-------------+----------------------------+----------------------------+--------------+---------------+--------------------+--------+-------------+ | 1 | sys | SYS | 2026-01-07 15:06:23.115389 | 2026-01-07 15:06:23.115389 | RANDOM | FULL{1}@zone1 | MYSQL | NORMAL | PRIMARY | | 1001 | META$1002 | META | 2026-01-07 15:07:29.169646 | 2026-01-07 15:07:35.175576 | zone1 | FULL{1}@zone1 | MYSQL | NORMAL | PRIMARY | | 1002 | mysql001 | USER | 2026-01-07 15:07:29.173619 | 2026-01-07 15:07:35.213500 | zone1 | FULL{1}@zone1 | MYSQL | NORMAL | PRIMARY | | 1003 | META$1004 | META | 2026-01-07 15:07:39.123961 | 2026-01-07 15:07:45.464339 | zone1 | FULL{1}@zone1 | MYSQL | NORMAL | PRIMARY | | 1004 | oracle001 | USER | 2026-01-07 15:07:39.123961 | 2026-01-07 15:07:45.487566 | zone1 | FULL{1}@zone1 | ORACLE | NORMAL | PRIMARY | +-----------+-------------+-------------+----------------------------+----------------------------+--------------+---------------+--------------------+--------+-------------+ 5 rows in setDBA_OB_TENANTSビューの詳細については、DBA_OB_TENANTSを参照してください。(オプション)現在のバージョンでは、異種ゾーンデプロイメントをサポートするテナントが可能ですが、テナント作成ステートメントでは構成パラメータ
zone_deploy_modeを使用して異種ゾーンモード(hetero)を指定することはできません。ユーザーが直接異種デプロイメント(異種ゾーンモード)のテナントを作成したい場合は、以下の方法で構成パラメータテンプレートを変更できます。obclient(root@sys)[oceanbase]> ALTER SYSTEM SET zone_deploy_mode = 'hetero' tenant = 'seed';説明
構成パラメータのテンプレートを変更する以外に、まず同種ゾーンデプロイメントのテナントを作成し、その後テナントレベルの構成パラメータ
zone_deploy_modeの値をhetero(異種ゾーンモード)に変更する方法もあります。コマンドが正常に実行されると、その後新規作成されるすべてのテナントで異種デプロイが許可されます。
CREATE TENANTステートメントを使用して、テナントを作成します。構文は以下のとおりです:
CREATE TENANT [IF NOT EXISTS] tenant_name PRIMARY_ZONE [=] zone, RESOURCE_POOL_LIST [=](poolname [, poolname...]) [ENABLE_ARBITRATION_SERVICE = {true | false}] {SET | SET VARIABLES | VARIABLES} system_var_name = expr [,system_var_name = expr] ...パラメータ説明:
IF NOT EXISTS:オプションパラメータです。作成しようとするテナント名が既に存在し、IF NOT EXISTSが指定されていない場合、エラーが発生します。tenant_name:テナント名を指定します。テナント名はOceanBaseデータベースのキーワードであってはなりません。PRIMARY_ZONE:テナントのプライマリゾーンを指定します。PRIMARY_ZONEは、テナントが読み書きサービスを提供するゾーンの優先順位を指定します。実際には、複数のゾーンを含むゾーンのリストです。リストに複数のゾーンが含まれる場合、セミコロン(;)で区切られたゾーンは高い優先順位を持ち、カンマ(,)で区切られたゾーンは同じ優先順位を持ちます。これは、トラフィックを複数のゾーンに分散し、これらのゾーンが同時にサービスを提供することを意味します。例えば、
primary_zone ='zone1;zone2,zone3'は、当該テナントの読み書きサービスを優先的に zone1 が提供し、zone1 の優先順位は zone2 や zone3 よりも高く、zone2 と zone3 は同じ優先順位であることを意味します。注意
PRIMARY_ZONEを指定する場合、その値を RANDOM(必ず大文字)に設定できます。これは、指定されたテナントが存在するすべてのゾーンをPRIMARY_ZONEの第一優先順位として扱うことを意味します。RESOURCE_POOL_LIST:テナントに割り当てるリソースプールのリストを指定します。必須です。複数のリソースプールがある場合:- ホモジーンゾーンモードでは、複数のリソースプールの
UNIT_NUMの値が一致している必要があります。 - ヒブリッドゾーンモードでは、テナントの複数のリソースプールにおける
UNIT_NUMの数は同じでも異なっても構いませんが、同一テナント内で使用できるUNIT_NUMの種類は最大2種類までです。例えば、あるテナントが3つのリソースプールpool1、pool2、pool3を持ち、それぞれのunit_numが2、4、4である場合、pool3のunit_numを1に変更すると、システムはMore than two distinct unit_num in a single tenant not allowedエラーを返します。
テナントのレプリカが配置されるゾーンのリストは
RESOURCE_POOL_LISTのZONE_LISTプロパティから継承され、テナントのレプリカ数はRESOURCE_POOL_LISTのZONE_LISTプロパティの数値から継承されます。また、各ゾーンにおけるテナントのユニット数はRESOURCE_POOL_LISTのUNIT_NUM属性やテナントのユニットのリソース仕様は、RESOURCE_POOL_LISTのユニット属性を継承します。注意
同一テナントに属する複数のリソースプールに対応する
ZONE_LISTは、互いに重なり合わせることはできません。- ホモジーンゾーンモードでは、複数のリソースプールの
ENABLE_ARBITRATION_SERVICE:テナントでのアービトレーションサービスの有効化を指定します。明示的に指定しない場合、デフォルトで作成されるテナントのアービトレーションサービスは無効状態になります。テナント作成時にアービトレーションサービスを有効にしていない場合でも、テナント作成後に有効にすることが可能です。詳細な操作については、テナントでのアービトレーションサービスの有効化を参照してください。機能の適用範囲
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity Editionは、現在アービトレーションサービス機能をサポートしていません。
system_var_name:システム変数またはパラメータを指定します。ob_tcp_invited_nodes:テナント接続のホワイトリストを指定するために使用されます。これは、どのクライアントIPアドレスがそのテナントに接続できるかを許可するかを定義します。例では、%はすべてのクライアントがログインできることを意味します。ob_tcp_invited_nodesの値を明示的に指定しない場合、デフォルトではテナントへの接続はローカルIPアドレスからのみ許可されます。ホワイトリスト設定の詳細については、ホワイトリストの確認と設定を参照してください。ob_compatibility_mode:テナントの互換モードを指定するために使用されます。MySQL互換モードまたはOracle互換モードを選択でき、作成時にのみ指定可能です。ob_compatibility_modeを明示的に指定しない場合、デフォルトの互換モードはMySQLモードになります。ob_compatibility_control:MySQL互換動作の競合が発生した場合に、どのような動作を示すかを制御します。MySQL5.7の動作と一致させるか、MySQL8.0の動作と一致させるかを設定します。MySQLモードのテナントを作成する際にこの変数を指定する必要があり、作成時にのみ指定可能です。テナント作成後は変更できません。ob_compatibility_controlを明示的に指定しない場合、デフォルトではMySQL5.7との互換動作を維持します。
CREATE TENANTステートメントの詳細については、CREATE TENANTを参照してください。例:
mq_t1という名前のテナントを作成します(デフォルトはMySQLモードのテナント)。リソースプールはmq_pool_01、プライマリゾーンは zone1 を指定し、すべてのIPアドレスからのデータベースへの接続を許可します。テナントのレプリカが配置されるZoneのリストは
resource_pool_listのzone_list属性から継承され、テナントのレプリカ数はresource_pool_listのzone_list属性の数値から継承されます。また、テナントが各Zoneに配置するUnit数はresource_pool_listのunit_num属性から、テナントのUnitのリソース仕様はresource_pool_listのunit属性から継承されます。obclient(root@sys)[oceanbase]> CREATE TENANT IF NOT EXISTS mq_t1 PRIMARY_ZONE='zone1', RESOURCE_POOL_LIST=('mq_pool_01') set OB_TCP_INVITED_NODES='%';oracle_tenant1という名前のOracle互換モードのテナントを作成するには、ob_compatibility_mode='oracle'を明示的に指定する必要があります。obclient(root@sys)[oceanbase]> CREATE TENANT IF NOT EXISTS oracle_tenant1 PRIMARY_ZONE='zone1', RESOURCE_POOL_LIST=('mq_pool_01') SET OB_TCP_INVITED_NODES='%', ob_compatibility_mode='oracle';mq_t2という名前の異種デプロイメントのテナントを作成します(デフォルトはMySQLモードのテナント)。リソースプールはmq_pool_01とmq_pool_02を指定し、プライマリゾーンはzone1,zone2に設定します。すべてのIPアドレスからのデータベースへの接続を許可します。obclient(root@sys)[oceanbase]> CREATE TENANT IF NOT EXISTS mq_t2 PRIMARY_ZONE='zone1,zone2', RESOURCE_POOL_LIST=('mq_pool_01','mq_pool_02') set OB_TCP_INVITED_NODES='%';
DBA_OB_TENANTSビューをクエリし、テナントが正常に作成されたことを確認します。例えば、テナント
mq_t1が正常に作成されたかどうかを確認するには:obclient(root@sys)[oceanbase]> SELECT TENANT_ID, TENANT_NAME, TENANT_TYPE, CREATE_TIME, MODIFY_TIME, PRIMARY_ZONE, LOCALITY, COMPATIBILITY_MODE, STATUS, TENANT_ROLE FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'mq_t1';実行結果は次のとおりです:
+-----------+-------------+-------------+----------------------------+----------------------------+--------------+---------------+--------------------+--------+-------------+ | TENANT_ID | TENANT_NAME | TENANT_TYPE | CREATE_TIME | MODIFY_TIME | PRIMARY_ZONE | LOCALITY | COMPATIBILITY_MODE | STATUS | TENANT_ROLE | +-----------+-------------+-------------+----------------------------+----------------------------+--------------+---------------+--------------------+--------+-------------+ | 1006 | mq_t1 | USER | 2026-01-11 15:06:23.115389 | 2026-01-11 15:06:23.115389 | zone1 | FULL{1}@zone1 | MYSQL | NORMAL | PRIMARY | +-----------+-------------+-------------+----------------------------+----------------------------+--------------+---------------+--------------------+--------+-------------+ 1 row in setテナント
mq_t2が正常に作成されたか確認します:obclient(root@sys)[oceanbase]> SELECT TENANT_ID, TENANT_NAME, TENANT_TYPE, CREATE_TIME, MODIFY_TIME, PRIMARY_ZONE, LOCALITY, COMPATIBILITY_MODE, STATUS, TENANT_ROLE FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'mq_t2';実行結果は次のとおりです:
+-----------+-------------+-------------+----------------------------+----------------------------+-------------------+---------------------------------------------+--------------------+--------+-------------+ | TENANT_ID | TENANT_NAME | TENANT_TYPE | CREATE_TIME | MODIFY_TIME | PRIMARY_ZONE | LOCALITY | COMPATIBILITY_MODE | STATUS | TENANT_ROLE | +-----------+-------------+-------------+----------------------------+----------------------------+-------------------+---------------------------------------------+--------------------+--------+-------------+ | 1008 | mq_t2 | USER | 2026-01-11 21:55:14.624399 | 2026-01-11 13:50:39.955638 | zone1,zone2;zone3 | FULL{1}@zome1, FULL{1}@zone2, FULL{1}@zone3 | MYSQL | NORMAL | PRIMARY | +-----------+-------------+-------------+----------------------------+----------------------------+-------------------+---------------------------------------------+--------------------+--------+-------------+ 1 row in setテナントの作成が完了したら、テナントにログインして使用を開始できます。
デフォルトの管理者ユーザー(MySQLモードでは
root、Oracleモードではsys)のパスワードは空です。管理者ユーザーのパスワードを速やかに変更する必要があります。変更の例は以下のとおりです。MySQL互換モード
mq_t1テナントのrootユーザーにログインします。obclient -h172.30.xx.xx -P2883 -uroot@mq_t1#cluster -A以下のステートメントを実行して、rootユーザーのパスワードを変更します。
obclient(root@mq_t1)[(none)]> ALTER USER root IDENTIFIED BY '****'; Query OK, 0 rows affected
Oracle互換モード
oracle_tenant1テナントのSYSユーザーにログインします。obclient -h172.30.xx.xx -P2883 -usys@oracle_tenant1#cluster -A以下のステートメントを実行して、
SYSユーザーのパスワードを変更します。obclient(syst@oracle_tenant1)[SYS]> ALTER USER sys IDENTIFIED BY ****; Query OK, 0 rows affected
管理者ユーザーのパスワード変更が完了したら、テナントに再ログインします。
MySQL互換モード
obclient -h172.30.xx.xx -P2883 -uroot@mq_t1#cluster -p**** -AOracle互換モード
obclient -h172.30.xx.xx -P2883 -usys@oracle_tenant1#cluster -p**** -A
次のステップ
テナントの作成が完了したら、管理者ユーザーとしてログインし、データベースに接続できます。データベースへの接続方法と詳細な操作については、データベース接続の概要(MySQLモード)およびデータベース接続の概要(Oracleモード)を参照してください。一般ユーザーでログインする必要がある場合は、テナントに新しい一般ユーザーを作成して権限を付与する必要があります。ユーザーの作成と権限付与に関する操作については、ユーザーと権限を参照してください。
関連ドキュメント
テナント作成後、テナントの設定を確認および管理できます。詳細な操作については、以下を参照してください: