すべてのプロダクト
Search
ドキュメントセンター

PolarDB:マルチテナント管理

最終更新日:Jun 22, 2026

PolarDB for MySQL は、単一のクラスター内で複数のテナントがコンピューティングリソースとストレージリソースを共有できるマルチテナントモードを提供します。このモードは、テナント間のデータとリソースの分離を保証します。この分離は、リソースの競合を防ぎ、運用の安定性を確保します。

仕組み

image
説明

システムテナント、通常テナント A、通常テナント B にはそれぞれ DB_1 という名前のデータベースと user_1 という名前のユーザーが含まれていますが、これらは同じ名前を共有しているだけで、それぞれ異なるエンティティです。

主要な概念

テナント:テナントは、データベースクラスターレベルの下、データベースとユーザーレベルの上に位置します。 テナントは、システムテナントまたは通常テナントに分類されます。

  • システムテナント下位互換性のために、既存のユーザーとデータベースをサポートするように設計されています。 クラスター内の既存のデータベースとユーザーは、デフォルトでシステムテナントに属します。 システムテナントのユーザーは、必要な権限があれば、すべてのテナントのデータベースにアクセスできます。

  • 通常テナント:通常テナントは、システムテナントの下に作成する必要があります。 通常テナント間では、データベースとユーザーは完全に分離されます。 また、通常テナントは、システムテナントに属するデータベースにアクセスすることもできません。 CPU リソーススケジューリングでは、通常テナントは、min_cpu の値が 0 より大きいかどうかに基づいて、専用テナントまたは共有テナントに分類されます。

    • 専用テナントmin_cpu > 0。 システムは、このテナントの CPU リソースが、いかなる時点でも min_cpu の値を下回らないことを保証します。

    • 共有テナントmin_cpu <= 0。

    min_cpu パラメーターの値を調整することで、専用テナント共有テナントを相互に変換できます。

リソース構成:リソース構成は、テナントが使用できるリソースを定義し、テナント間のリソース分離とスケジューリングを実現します。 現在、分離とスケジューリングが可能なのは CPU リソースのみです。

前提条件

マルチテナントモードを有効にするには、クラスターが次の要件を満たしている必要があります。

データベースエンジンMySQL 8.0.2 以降、データベースエディションエンタープライズ版エディションクラスター版であり、すべてのクラスターノードの仕様が同一である必要があります

説明

マルチテナントモードは現在カナリアリリース中です。この機能を有効にするには、指定の DingTalk グループからテクニカルサポートにお問い合わせください。機能を有効にした後、変更を反映させるために、対象のクラスターを再起動する必要があります。

DingTalk グループ番号: 59535005981。

制限事項

  • テナントのバイナリログ同期はサポートされていません。

  • 部分的な権限の取り消しはサポートされていません。

クイックスタート

  1. スタンドアロンマルチテナントモードを有効にします。

    説明

    マルチテナントモードは現在カナリアリリース中です。この機能を有効にするには、指定の DingTalk グループからテクニカルサポートにお問い合わせください。機能を有効にした後、変更を反映させるために、対象のクラスターを再起動する必要があります。

    DingTalk グループ番号: 59535005981。

  2. 特権アカウントを使用してデータベースに接続します。

  3. リソース設定 r1r2 を作成します。

    CREATE resource_config r1 min_cpu 1 max_cpu 2;
    CREATE resource_config r2 min_cpu 1 max_cpu 4;
    説明
    • クラスターのノード仕様に基づいて、min_cpumax_cpu の値を設定してください。

    • いずれのテナントの min_cpu 値も、クラスターノードのコア数から 1 を引いた値 を超えることはできません。システムテナント用に少なくとも 1 つのコアを確保する必要があります。そうしないと、テナント作成時にテナントのリソース設定へのバインドが失敗します。

  4. テナント tn1tn2 を作成します。テナントを作成する際は、作成したリソース設定にバインドする必要があります。

    CREATE tenant tn1 resource_config r1;
    CREATE tenant tn2 resource_config r2;
    説明

    すべてのテナントのリソース設定における min_cpu 値の合計が、クラスターノードのコア数から 1 を引いた値 を超えないようにしてください。

  5. ユーザー u1u2、およびデータベース db1db2 を作成します。

    -- テナント tn1 にユーザー u1 を作成します。
    CREATE USER 'u1@tn1' IDENTIFIED BY 'password';
    -- テナント tn1 にデータベース db1 を作成します。
    CREATE DATABASE `db1@tn1`;
    -- テナント tn2 にユーザー u2 を作成します。
    CREATE USER 'u2@tn2' IDENTIFIED BY 'password';
    -- テナント tn2 にデータベース db2 を作成します。
    CREATE DATABASE `db2@tn2`;
    説明

    特権アカウントを使用してユーザーまたはデータベースを作成する場合は、ユーザー名またはデータベース名に @<tenant_name> サフィックスを付加する必要があります。

  6. ユーザー u1u2 に権限を付与します。

    -- テナント tn1 のユーザー u1 に権限を付与します。
    GRANT ALL PRIVILEGES ON `%@tn1`.* TO 'u1@tn1'@'%' WITH GRANT OPTION;
    -- テナント tn2 のユーザー u2 に権限を付与します。
    GRANT ALL PRIVILEGES ON `%@tn2`.* TO 'u2@tn2'@'%' WITH GRANT OPTION;
  7. ユーザー u1@tn1u2@tn2 を使用して、テナント間のデータとリソースの分離を検証できます。

  8. (オプション) 作成したテナント、ユーザー、データベースを表示します。

    • テナント:特権アカウントを使用してデータベースに接続し、SELECT ステートメントを実行してテナントを表示します。例:

      SELECT * FROM mysql.tenants;
    • ユーザー:PolarDB コンソールにアクセスし、設定と管理 > アカウント管理を開きます。

      • [ユーザー名] に @ サフィックスが含まれないユーザーは、システムテナントに属します。

      • [ユーザー名] に @ サフィックスが含まれるユーザーは、対応する通常テナントに属します。

    • データベース:PolarDB コンソールにアクセスし、設定と管理 > データベース管理を開きます。

      • [データベース名] に @ サフィックスが含まれないデータベースは、システムテナントに属します。

      • [データベース名] に @ サフィックスが含まれるデータベースは、対応する通常テナントに属します。

機能

スタンドアロンマルチテナントモード

説明

マルチテナントモードは現在カナリアリリース中です。この機能を有効にするには、指定の DingTalk グループからテクニカルサポートにお問い合わせください。機能を有効にした後、変更を反映させるために、対象のクラスターを再起動する必要があります。

DingTalk グループ番号: 59535005981。

データ分離の有効化

データ分離を有効にするには、enable_multi_tenant パラメーターを ON に設定し。

リソース分離の有効化

リソース分離を有効にするには、まずデータ分離を有効にする必要があります。 enable_multi_tenantthread_pool_multi_tenant_enabled、および thread_pool_enabled パラメーターを ON に設定します。 また、thread_pool_size パラメーターの値が対象クラスターのノードのコア数と一致していることを確認する必要もあります。

  • ノード仕様の表示

    クラスターの 基本情報 ページで、データベースノード セクションのクラスターのノード仕様を表示できます。

    プライマリノード読み取り専用ノードなどの各ノードのカードには、8 コア 32 GB などの現在の仕様が表示されます。

  • パラメーターの設定

    • enable_multi_tenant および thread_pool_multi_tenant_enabled パラメーターを有効にするには、テクニカルサポートにお問い合わせください。

    • thread_pool_enabled および thread_pool_size パラメーターを変更するには、PolarDB コンソール設定と管理 > パラメーター ページに移動します。 詳細については、「クラスターパラメーターとノードパラメーターの設定」をご参照ください。

リソース管理

PolarDB for MySQL のスタンドアロンマルチテナントモードは、CPU リソース分離のみをサポートします。 リソース構成を作成するときに、min_cpumax_cpu パラメーターを使用して CPU 制限を指定できます。 このリソース構成をテナントにバインドすると、そのテナントのユーザー接続で使用できる CPU リソースが制限されます。

リソース構成の作成

特権アカウントを使用してデータベースに接続し、CREATE ステートメントを実行してリソース構成を作成します。

構文

CREATE resource_config <resource_config_name> min_cpu <min_cpu> max_cpu <max_cpu>;

CREATE resource_config r1 min_cpu 0 max_cpu 1;
CREATE resource_config r2 min_cpu 1 max_cpu 4;
説明
  • クラスターのノード仕様に基づいて、min_cpumax_cpu の値を設定してください。

  • リソース構成を作成する際、システムは構成をクラスターノード仕様と照合しません。 このチェックは、テナントがリソース構成にバインドされている場合にのみ行われます。

  • いずれのテナントの min_cpu 値も、クラスターノードのコア数から 1 を引いた値 を超えることはできません。システムテナント用に少なくとも 1 つのコアを確保する必要があります。そうしないと、テナント作成時にテナントのリソース設定へのバインドが失敗します。

  • システムテナントのユーザーが利用できるリソースは、総 CPU リソースからすべての専用テナントに予約されている CPU リソースを引いたものです。

リソース構成の表示

特権アカウントを使用してデータベースに接続し、SELECT ステートメントを実行してリソース構成を表示します。

SELECT * FROM mysql.tenant_resource_config;
+----------------------+-------------------------+-------------------------+
| resource_config_name | resource_config_min_cpu | resource_config_max_cpu |
+----------------------+-------------------------+-------------------------+
| r1                   |                       0 |                       1 |
| r2                   |                       1 |                       4 |
+----------------------+-------------------------+-------------------------+

リソース構成の変更

特権アカウントを使用してデータベースに接続し、ALTER ステートメントを実行してリソース構成を変更します。

構文

ALTER resource_config <resource_config_name> min_cpu <min_cpu> max_cpu <max_cpu>;

ALTER resource_config r2 min_cpu 1 max_cpu 2;
説明
  • テナントで現在使用中のリソース構成は更新できません。

  • クラスターのノード仕様に基づいて、min_cpumax_cpu の値を設定してください。

  • リソース構成を作成する際、システムは構成をクラスターノード仕様と照合しません。 このチェックは、テナントがリソース構成にバインドされている場合にのみ行われます。

  • いずれのテナントの min_cpu 値も、クラスターノードのコア数から 1 を引いた値 を超えることはできません。システムテナント用に少なくとも 1 つのコアを確保する必要があります。そうしないと、テナント作成時にテナントのリソース設定へのバインドが失敗します。

  • システムテナントのユーザーが利用できるリソースは、総 CPU リソースからすべての専用テナントに予約されている CPU リソースを引いたものです。

リソース構成の削除

特権アカウントを使用してデータベースに接続し、DROP ステートメントを実行してリソース構成を削除します。

構文

DROP resource_config <resource_config_name>;

DROP resource_config r1;
説明

テナントで現在使用中のリソース構成は削除できません。

テナント管理

テナントは、システムテナントと通常テナントに分類されます。 システムテナントは、既存のユーザーとの下位互換性のために設計されており、管理操作は必要ありません。 このセクションでは、通常テナントの管理方法について説明します。

テナントの作成

特権アカウントを使用してデータベースに接続し、CREATE ステートメントを実行して新しいテナントを作成します。

構文

CREATE tenant <tenant_name> resource_config <resource_config_name>;

CREATE tenant tn1 resource_config r1;
説明
  • テナント名は最大 10 文字で、英大文字、英小文字、数字、アンダースコア (_) を使用できます。

  • すべてのテナントのリソース設定における min_cpu 値の合計が、クラスターノードのコア数から 1 を引いた値 を超えないようにしてください。

テナントの表示

特権アカウントを使用してデータベースに接続し、SELECT ステートメントを実行してテナントを表示します。

SELECT * FROM mysql.tenants;
+-------------+----------------------+
| tenant_name | resource_config_name |
+-------------+----------------------+
| tn1         | r1                   |
+-------------+----------------------+

テナントの変更

特権アカウントを使用してデータベースに接続し、ALTER ステートメントを実行してテナントを変更します。

構文

ALTER tenant <tenant_name> resource_config <resource_config_name>;

ALTER tenant tn1 resource_config r2;
説明
  • テナント名は最大 10 文字で、英大文字、英小文字、数字、アンダースコア (_) を使用できます。

  • すべてのテナントのリソース設定における min_cpu 値の合計が、クラスターノードのコア数から 1 を引いた値 を超えないようにしてください。

テナントの削除

特権アカウントを使用してデータベースに接続し、DROP ステートメントを実行してテナントを削除します。

構文

DROP tenant <tenant_name>;

DROP tenant tn1;
説明
  • テナントを削除する前に、テナント内のすべてのデータベースが削除されていることを確認してください。 そうしないと、操作は失敗します。

  • テナントを削除すると、そのテナントに関連付けられているすべてのユーザーが自動的に削除されます。 操作は慎重に行ってください。

ユーザー管理

ユーザーは、システムテナントのユーザーと通常テナントのユーザーに分類されます。 システムテナントのユーザーは、マルチテナント以外の環境と同じ方法で管理されます。 詳細については、「アカウント管理」をご参照ください。 このセクションでは、通常テナントのユーザーの管理方法について説明します。

管理操作は、システムテナントまたは通常テナントのいずれかから実行できます。

説明
  • システムテナント内からユーザーを作成または削除する場合、ユーザー名を '<user_name>@<tenant_name>' の形式で指定する必要があります。

  • スタンドアロンマルチテナントモードでは、ユーザー名は最大 20 文字で、英大文字、英小文字、数字、アンダースコア (_) のみ使用できます。

  • 次のユーザーはテナント内に作成できません:

    • replicator

    • root

    • mysql.infoschema

    • mysql.session

    • mysql.sys

    • aurora

    • aliyun_root

  • テナントのユーザーには、__recycle_bin__mysqlperformance_schema、または sys データベースに対する権限を付与することはできません。

システムテナントから

システムテナント内から、特権アカウントを使用して通常テナント内のユーザーを作成および削除できます。

ユーザーの作成

特権アカウントを使用してデータベースに接続し、CREATE ステートメントを実行して通常テナントにユーザーを作成します。

構文

CREATE USER '@' [IDENTIFIED BY ''];

-- パスワードなし
CREATE USER 'u1@tn1';
-- パスワードあり
CREATE USER 'u1@tn1' IDENTIFIED BY 'password';

ユーザーの削除

特権アカウントを使用してデータベースに接続し、DROP ステートメントを実行して通常テナントからユーザーを削除します。

構文

DROP USER '@';

DROP USER 'u1@tn1';

権限の付与

特権アカウントを使用してデータベースに接続し、通常テナントのユーザーに権限を付与します。

  • テナントレベルの権限を付与します。 これらの権限が付与されると、ユーザーはそのテナント内のすべてのデータベースにアクセスできます。

    例:テナント tn1 の権限をユーザー u1 に付与します。

    GRANT ALL PRIVILEGES ON `%@tn1`.* to 'u1@tn1'@'%' WITH GRANT OPTION;
  • CREATE USER 権限を付与します。 この権限が付与されると、ユーザーは現在のテナント内に他のユーザーを作成できます。

    例:CREATE USER 権限をユーザー u1 に付与します。

    GRANT CREATE USER ON *.* TO 'u1@tn1'@'%';
  • ユーザーに付与された権限を表示します。

    例:ユーザー u1 の権限を表示します。

    SHOW GRANTS FOR 'u1@tn1';
    +---------------------------------------------------------------------+
    | Grants for u1@tn1@%                                                 |
    +---------------------------------------------------------------------+
    | GRANT CREATE USER ON *.* TO `u1@tn1`@`%`                            |
    | GRANT ALL PRIVILEGES ON `%@tn1`.* TO `u1@tn1`@`%` WITH GRANT OPTION |
    +---------------------------------------------------------------------+

通常テナントから

通常テナント内のユーザーは、CREATE USER 権限を持っていれば、同じテナント内に他のユーザーを作成および削除できます。 この権限を付与する方法については、「ユーザー管理」をご参照ください。

ユーザーの作成

テナントのユーザーとしてデータベースに接続し、CREATE ステートメントを実行して現在のテナントに新しいユーザーを作成します。 テナントのユーザーを作成する方法については、「ユーザー管理」をご参照ください。

構文

CREATE USER '' [IDENTIFIED BY ''];

-- パスワードなし
CREATE USER 'u2';
-- パスワードあり
CREATE USER 'u2' IDENTIFIED BY 'password';

ユーザーの削除

テナントのユーザーとしてデータベースに接続し、DROP ステートメントを実行して現在のテナントからユーザーを削除します。

構文

DROP USER '';

DROP USER 'u2';

権限の付与

テナントのユーザーを使用してデータベースに接続し、同じテナント内の別のユーザーに権限を付与します。

  • 現在のテナントのユーザーにグローバル権限を付与します。

    構文

    GRANT SELECT ON *.* TO ''

    GRANT SELECT ON *.* TO 'u2';
  • 現在のテナントのユーザーにデータベースレベルの権限を付与します。

    構文

    GRANT SELECT ON .* TO ''

    GRANT SELECT ON db.* TO 'u2';
説明
  • マルチテナントモードでは、グローバル権限とデータベースレベル権限の混在はサポートされておらず、権限チェックが失敗する可能性があります。 グローバル権限またはデータベースレベル権限のいずれかを排他的に使用することを推奨します。

  • ユーザーに付与された権限を表示するには、「」をご参照ください。

データベースへの接続

クライアントでデータベースに接続する際、ユーザー名を <user_name>@<tenant_name> の形式で指定します。 接続後、ユーザーはテナントのリソース制限の対象となります。

構文

mysql -h  -P  -u @ -p

mysql -h pc... -P 3306 -u u1@tn1 -p
Enter password: 

データベース管理

データベースは、システムテナントのデータベースと通常テナントのデータベースに分類されます。 システムテナントのデータベースは、マルチテナント以外の環境と同じ方法で管理されます。 詳細については、「データベース管理」をご参照ください。 このセクションでは、通常テナントのデータベースの管理方法について説明します。

管理操作は、システムテナントまたは通常テナントのいずれかから実行できます。

説明
  • システムテナント内からデータベースを作成または削除する場合、データベース名を '<database_name>@<tenant_name>' の形式で指定する必要があります。

  • スタンドアロンマルチテナントモードでは、データベース名は最大 50 文字で、英大文字、英小文字、数字、アンダースコア (_) のみ使用できます。

  • 次のデータベースはテナント内に作成できません:

    • information_schema

    • performance_schema

    • mysql

    • sys

    • __recycle_bin__

    • query_rewrite

  • テナントに dbms_ccldbms_outlndbms_consensus などの名前でデータベースを作成した場合、そのテナントのユーザーは組み込みのストアドプロシージャを呼び出すことはできません。 この場合、CALL dbms_admin.show_native_procedure(); を実行して、データベース内のすべての組み込みストアドプロシージャを表示できます。

  • テナント内に作成されたデータベースの名前が、組み込みのストアドプロシージャで使用されている schema_name と同じである場合、そのデータベースで組み込みのストアドプロシージャを呼び出すことはできません。

システムテナントから

システムテナント内から、特権アカウントを使用して通常テナントにデータベースを作成および削除できます。

データベースの作成

特権アカウントを使用してデータベースに接続し、CREATE ステートメントを実行して通常テナントにデータベースを作成します。

構文

CREATE DATABASE `@`;

CREATE DATABASE `db1@tn1`;

データベースの削除

特権アカウントを使用してデータベースに接続し、DROP ステートメントを実行して通常テナントからデータベースを削除します。

構文

DROP DATABASE `@`;

DROP DATABASE `db1@tn1`;

通常テナントから

通常テナント内から、グローバル権限を持つユーザーを使用して、同じテナント内にデータベースを作成および削除できます。 権限を付与する方法については、「ユーザー管理」をご参照ください。

データベースの作成

テナントのユーザーとしてデータベースに接続し、CREATE ステートメントを実行して現在のテナントのデータベースを作成します。 テナントのユーザーを作成する方法については、「ユーザー管理」をご参照ください。

構文

CREATE DATABASE ``;

CREATE DATABASE `db2`;

データベースの削除

テナントのユーザーとしてデータベースに接続し、DROP ステートメントを実行して現在のテナントからデータベースを削除します。

構文

DROP DATABASE ``;

DROP DATABASE `db2`;

テナントとスレッドのバインド

  1. 特権アカウントを使用してデータベースに接続し、次の SQL ステートメントを実行してスレッドグループとテナントのバインドを表示します:

    SELECT * FROM information_schema.thread_pool_status;
  2. 出力例:

    マルチテナントのリソース分離が有効な場合、クエリ結果にはスレッドグループにバインドされている専用テナントが表示されます。 スレッドグループのテナント情報が空の場合、そのスレッドグループは複数のテナントで共有されます。

    TENANT_NAME:スレッドプール内の現在のスレッドグループにバインドされている専用テナントの名前。

    +----+--------------+---------------------+----------------------+-------------------+----------------+-------------+
    | ID | THREAD_COUNT | ACTIVE_THREAD_COUNT | WAITING_THREAD_COUNT | DUMP_THREAD_COUNT |      ...       | TENANT_NAME |
    +----+--------------+---------------------+----------------------+-------------------+----------------+-------------+
    |  0 |            2 |                   0 |                    0 |                 0 |      ...       |             |
    |  1 |            2 |                   1 |                    0 |                 0 |      ...       | tn1         |
    |  2 |            4 |                   0 |                    0 |                 1 |      ...       |             |
    |  3 |            2 |                   0 |                    0 |                 0 |      ...       |             |
    |  4 |            3 |                   0 |                    0 |                 1 |      ...       |             |
    +----+--------------+---------------------+----------------------+-------------------+----------------+-------------+

監査ログの表示

マルチテナントモードで実行された操作の場合、監査ログには物理データベースと物理ユーザーに関する情報が表示されます。

たとえば、テナント t2 のユーザー u1db3 データベースで SQL ステートメントを実行した場合、監査ログの データベース 列には db3@t2 が表示され、Users 列には u1@t2 が表示されます。