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が同一のリソース仕様を使用することもできます。リソースプールリスト以外にも、互換モード、プライマリゾーン、ローカリティ、接続ホワイトリストなど、他の重要な属性やシステム変数があります。その中で、リソースプールリストはテナント作成時の必須項目です。新規テナントの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データベース内部では、読み取りIOPS値が16KB単位で処理されるため、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:このリソースプールがターゲットZoneに配置するUnit数です。その値はターゲットZoneのノード数より小さく、かつ各ノード上には同一テナントのUnitを最大1つしか配置できません。ZONE_LIST:リソースプールのZone配置です。OceanBaseデータベースはZONE_LISTで記述された各ZoneにUNIT_NUM個のUnitを作成し、各Unitのリソース仕様はUNITパラメータで設定された値となります。
CREATE RESOURCE POOLステートメントの詳細については、CREATE RESOURCE POOLを参照してください。例:
mq_pool_01という名前のリソースプールを作成し、zone1とzone2にそれぞれ1つのUnitを作成します。Unitのリソース仕様は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つのUnitを作成します。各Unitのリソース仕様は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アドレスからのデータベースへの接続を許可します。テナントのレプリカが配置されるゾーンのリストは
resource_pool_listのzone_list属性から継承され、テナントのレプリカ数はresource_pool_listのzone_list属性の数値から継承されます。また、テナントが各ゾーンに配置するユニット数はresource_pool_listのunit_num属性から、テナントのユニットのリソース仕様は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モード)を参照してください。一般ユーザーでのログインが必要な場合は、テナントに新しい一般ユーザーを作成して権限を付与する必要があります。ユーザーの作成と権限付与に関する操作については、ユーザーと権限を参照してください。
関連ドキュメント
テナント作成後、テナントの設定を確認および管理できます。詳細な操作については以下を参照してください: