このセクションでは、いくつかの典型的なシナリオを通じて、日常業務におけるテーブルグループ重み付けの活用方法を紹介します。
シナリオ1:同一データベース内で新規テーブルを作成する場合の自動集約
シナリオの概要
業務上、一括でユーザーテーブルを作成し、それらをデータベース単位で管理する必要があります。これにより、データベース内での分散読み書きを回避できます。
手順
まず、新規データベースで作成するユーザーテーブルの自動集約スイッチを有効にします(構成パラメータ enable_database_sharding_none の値を True に設定)。その後、データベースとテーブルを個別に作成します。具体的な操作は以下のとおりです:
MySQLテナントのテナント管理者がデータベースに接続します。
接続例は以下のとおりです。データベースへの接続時は、実際の環境に準じてください。
obclient -h10.xx.xx.xx -P2883 -uroot@mysql_tenant#obdemo -p***** -Aテナントレベルの構成パラメータ
enable_database_sharding_noneの値をTrueに設定します。obclient(root@mysql001)[(none)]> ALTER SYSTEM SET enable_database_sharding_none = True;必要に応じて、複数のデータベースを作成します。
各データベースの作成が成功すると、デフォルトで新しい
Sharding = 'NONE'のテーブルグループがバインドされます。データベースの作成手順の詳細については、データベースの作成を参照してください。
データベースごとにユーザーテーブルをバッチで新規作成します。同一データベース内のユーザーテーブルは、自動的に1つのログストリームにバインドされます。
シナリオ2:複数のデータベースにまたがる新規テーブルの集約
シナリオの概要
業務上、一連のユーザーテーブルを新規作成する必要があり、これらのテーブルは別のデータベースAのユーザーテーブルと密接に関連しています(仮にデータベースAは作成時にSharding = 'NONE'のテーブルグループにバインドされているとします)。現在、新規作成するテーブルをデータベースAのユーザーテーブルと集約し、複数のデータベース間での分散読み書きを回避する必要があります。
手順
データベースBを作成し、データベースAと同じSharding = 'NONE'のテーブルグループにバインドした後、新規テーブルを作成します。具体的な操作手順は以下のとおりです:
MySQLテナントのテナント管理者がデータベースに接続します。
接続例は以下のとおりです。データベースへの接続時は、実際の環境に準じてください。
obclient -h10.xx.xx.xx -P2883 -uroot@mysql_tenant#obdemo -p***** -AデータベースAがバインドされているテーブルグループ情報を取得します。
obclient(root@mysql001)[(none)]> SELECT * FROM oceanbase.DBA_OB_DATABASES WHERE DATABASE_NAME = 'databse_name';以下のステートメントを使用して新しいデータベースBを作成し、そのテーブルグループをデータベースAがバインドされているテーブルグループに指定します。
CREATE DATABASE databae_name DEFAULT tablegroup = tablegroup_name;CREATE DATABASEステートメントの詳細説明および例については、CREATE DATABASEを参照してください。新規作成したデータベースBでユーザーテーブルを作成すると、新規作成したユーザーテーブルは自動的にデータベースAのユーザーテーブルと同じログストリームにバインドされます。
シナリオ3:複数のデータベースの再集約
シナリオの概要
ユーザーテーブルの作成は完了していますが、関連する複数のデータベースにまたがるユーザーテーブルを再集約し、複数のデータベース間で発生する分散読み書きを回避する必要があります。
手順
MySQLテナントのテナント管理者がデータベースに接続します。
接続例は以下のとおりです。データベースへの接続時は、実際の環境に準じてください。
obclient -h10.xx.xx.xx -P2883 -uroot@mysql_tenant#obdemo -p***** -A以下のステートメントを使用して、
Sharding = 'NONE'のテーブルグループを作成します。CREATE TABLEGROUP tablegroup_name Sharding = 'NONE';以下のステートメントを使用して、複数のデータベースを新しく作成したテーブルグループにバインドします。
ALTER DATABASE database_name tablegroup [=] tablegroup_name;ALTER DATABASEステートメントの詳細な説明と例については、ALTER DATABASEを参照してください。パーティションの自動均衡を手動でトリガーします。
obclient(root@mysql001)[(none)]> CALL DBMS_BALANCE.TRIGGER_PARTITION_BALANCE();パーティションの自動均衡を手動でトリガーする詳細な操作については、パーティションの自動均衡を手動でトリガーするを参照してください。
パーティションの自動均衡タスクが完了するのを待つと、複数のデータベースにまたがるユーザーテーブルの集約が完了します。
パーティションの自動均衡処理中は、ビューを使用して均衡タスクの進捗状況を確認できます。ステートメントは以下のとおりです:
obclient(root@mysql001)[(none)]> SELECT * FROM oceanbase.DBA_OB_BALANCE_JOBS WHERE JOB_TYPE = 'PARTITION_BALANCE';パーティションの自動均衡タスクの進捗状況を確認する詳細な操作については、バックグラウンドのパーティションの自動均衡タスクを確認するを参照してください。
シナリオ4:ホットなテーブルグループの専有化
シナリオの概要
新規データベース作成時のユーザーテーブルの自動集約スイッチを有効にした場合(パラメータ enable_database_sharding_none の値が True の場合)、データベースを作成するたびに、デフォルトで Sharding = 'NONE' のテーブルグループが作成されます(この方法で作成されるテーブルグループの重みはデフォルトで 1 です)。現在、業務ニーズに基づき、ホットなテーブルグループがログストリームを専有することを希望します。
手順
現在のテナントには、9つの Sharding = 'NONE' テーブルグループ TG_DB_1 ~ TG_DB_9 があります。その中で、複数のデータベースのユーザーテーブルを集約している TG_DB_1 がホットなテーブルグループとなり、1つのログストリームを専有することを希望します。
現在、これらのテーブルグループの重みの分布は以下のとおりです。

大きな重み(100% × Sharding = 'NONE' のテーブルグループの総数)に設定することで、ホットなテーブルグループ TG_DB_1 の重みを設定し、専有化を実現できます。具体的な操作手順は以下のとおりです:
MySQLテナントのテナント管理者がデータベースに接続します。
接続例は以下のとおりです。データベースへの接続時は、実際の環境に準じてください。
obclient -h10.xx.xx.xx -P2883 -uroot@mysql_tenant#obdemo -p***** -Aテナント内の重み付け済み
Sharding = 'NONE'テーブルグループの総数を確認します。obclient(root@mysql001)[(none)]> SELECT * FROM oceanbase.DBA_OB_OBJECT_BALANCE_WEIGHT;ホットなテーブルグループの重みを設定します。
重み付け済み
Sharding = 'NONE'テーブルグループの総数が9と仮定すると、ホットなテーブルグループの重みを9に設定するステートメントは以下のとおりです:obclient(root@mysql001)[(none)]> CALL DBMS_BALANCE.SET_TABLEGROUP_BALANCE_WEIGHT(9,'TG_DB_1');パーティションの均等化を手動でトリガーします。
obclient(root@mysql001)[(none)]> CALL DBMS_BALANCE.TRIGGER_PARTITION_BALANCE();パーティションの均等化を手動でトリガーする詳細な操作については、パーティションの均等化を手動でトリガーするを参照してください。
パーティションの均等化タスクが完了するのを待つと、複数のデータベースにまたがるユーザーテーブルの集約が完了します。
パーティションの均等化プロセス中は、ビューを使用して均等化タスクの進捗状況を確認できます。ステートメントは以下のとおりです:
obclient(root@mysql001)[(none)]> SELECT * FROM oceanbase.DBA_OB_BALANCE_JOBS WHERE JOB_TYPE = 'PARTITION_BALANCE';パーティションの均等化タスクの進捗状況を確認する詳細な操作については、バックグラウンドのパーティションの均等化タスクを確認するを参照してください。
均等化が完了すると、これらのテーブルグループの重みの分布は以下のとおりです:

シナリオ5:テーブルグループの重みによる分散
シナリオの説明
新規に作成するデータベース内のユーザーテーブルの自動集約スイッチを有効にした場合(構成パラメータ enable_database_sharding_none の値が True の場合)、データベースを作成するたびに、デフォルトで Sharding = 'NONE' のテーブルグループが作成されます(この方法で作成されるテーブルグループの重みはデフォルトで 1 です)。現在、業務上のニーズに基づき、ユーザーテーブルが多数存在する、またはデータ量やアクセストラフィックが多いテーブルグループを分散させたいと考えています。
手順
現在のテナントには、9つのSharding = 'NONE' テーブルグループ TG_DB_1 ~ TG_DB_9 があると仮定します。そのうち、TG_DB_1、TG_DB_2、TG_DB_4 の各テーブルグループにはデータ量が多いテーブルが含まれていますが、それぞれが単独でログストリームを専有するほどではありません。
現在、これらのテーブルグループの重み分布は以下のとおりです。

これらのテーブルグループの重みを、全体の50%(Sharding = 'NONE' のテーブルグループの総数に対して)に設定できます。具体的な操作手順は以下のとおりです:
MySQLモードのテナント管理者がデータベースに接続します。
接続例は以下のとおりですが、実際の環境に合わせてください。
obclient -h10.xx.xx.xx -P2883 -uroot@mysql_tenant#obdemo -p***** -Aテナント内の重み付け済み
Sharding = 'NONE'テーブルグループの総数を確認します。obclient(root@mysql001)[(none)]> SELECT * FROM oceanbase.DBA_OB_OBJECT_BALANCE_WEIGHT;テーブルグループ
TG_DB_1、TG_DB_2、TG_DB_4に重みを設定します。クエリで得られた重み付け済み
Sharding = 'NONE'テーブルグループの総数が9である場合、各テーブルグループTG_DB_1、TG_DB_2、TG_DB_4に重み4(50% * 9の結果を切り捨てた値)を設定するステートメントは以下のとおりです:obclient(root@mysql001)[(none)]> CALL DBMS_BALANCE.SET_TABLEGROUP_BALANCE_WEIGHT(4,'TG_DB_1');obclient(root@mysql001)[(none)]> CALL DBMS_BALANCE.SET_TABLEGROUP_BALANCE_WEIGHT(4,'TG_DB_2');obclient(root@mysql001)[(none)]> CALL DBMS_BALANCE.SET_TABLEGROUP_BALANCE_WEIGHT(4,'TG_DB_4');手動でパーティションの均衡をトリガーします。
obclient(root@mysql001)[(none)]> CALL DBMS_BALANCE.TRIGGER_PARTITION_BALANCE();手動でパーティションの均衡をトリガーする詳細な操作については、手動でパーティションの均衡をトリガーするを参照してください。
パーティションの均衡タスクが完了するのを待つと、複数のデータベースにまたがるユーザーテーブルの集約が完了します。
パーティションの均衡処理中は、ビューを使用して均衡タスクの進捗状況を確認できます。ステートメントは以下のとおりです:
obclient(root@mysql001)[(none)]> SELECT * FROM oceanbase.DBA_OB_BALANCE_JOBS WHERE JOB_TYPE = 'PARTITION_BALANCE';パーティションの均衡タスクの進捗状況を確認する詳細な操作については、バックグラウンドのパーティション均衡タスクを確認するを参照してください。
均衡が完了すると、これらのテーブルグループの重み分布は以下のとおりになります:
