ユーザーテーブルの集約とは、同一テナント内の指定されたユーザーテーブルを単一のログストリームにバインドすることを指します。OceanBaseデータベースでは、データベースをSharding = 'NONE'のテーブルグループにバインドすることで、そのデータベース内のすべてのユーザーテーブルの集約を実現します。また、複数のデータベースを同一のテーブルグループにバインドすることで、複数のデータベースにまたがるユーザーテーブルの集約も可能です。
使用上の制限
現在、データベース内のユーザーテーブルに対する集計機能はMySQLモードでのみサポートされており、Oracleモードでは対応していません。
新規データベース作成時のユーザーテーブルの自動集約を有効にする
データベース内ユーザーテーブルの自動集約スイッチは、テナントレベル構成パラメータ enable_database_sharding_none によって制御されます。デフォルトは False であり、データベース内ユーザーテーブルの自動集約は無効な状態です。
ビジネスニーズに応じて、データベース内ユーザーテーブルの自動集約を有効にすることができます。新規データベース作成時のユーザーテーブルの自動集約を有効にする方法は以下のとおりです:
MySQLモードのテナント管理者がデータベースに接続します。
接続例は以下のとおりです。データベースへの接続時は、実際の環境に準じてください。
obclient -h10.xx.xx.xx -P2883 -uroot@mysql_tenant#obdemo -p***** -Aテナント構成パラメータ
enable_database_sharding_noneの値を確認します。obclient(root@mysql001)[(none)]> SHOW PARAMETERS LIKE '%enable_database_sharding_none%';クエリ結果は次のとおりです:
+-------+----------+----------------+----------+-------------------------------+-----------+-------+----------------------------------------------------------------------------------------+--------------+--------+---------+-------------------+---------------+-----------+ | zone | svr_type | svr_ip | svr_port | name | data_type | value | info | section | scope | source | edit_level | default_value | isdefault | +-------+----------+----------------+----------+-------------------------------+-----------+-------+----------------------------------------------------------------------------------------+--------------+--------+---------+-------------------+---------------+-----------+ | zone1 | observer | 172.xx.xxx.xxx | 2882 | enable_database_sharding_none | BOOL | False | Enable automatic creation of sharding none tablegroup for new databases in MySQL mode. | LOAD_BALANCE | TENANT | DEFAULT | DYNAMIC_EFFECTIVE | False | 1 | +-------+----------+----------------+----------+-------------------------------+-----------+-------+----------------------------------------------------------------------------------------+--------------+--------+---------+-------------------+---------------+-----------+ 1 row in set構成パラメータ
enable_database_sharding_noneの値をTrueに変更します。obclient(root@mysql001)[(none)]> ALTER SYSTEM SET enable_database_sharding_none = True;
データベース内ユーザーテーブルの自動集約を有効にした後(enable_database_sharding_none の値が True の場合)、その後同テナントで作成されるすべてのデータベースは、デフォルトでShardingプロパティが NONE のテーブルグループにバインドされ、テーブルグループ名の形式は TG_DB_{database_id} となります。
注意
データベース内ユーザーテーブルの自動集約を有効にした後:
- この設定は後から作成されるデータベースにのみ適用され、既存のデータベースには影響しません。
- データベース作成時に、デフォルトでバインドされるテーブルグループ名がユーザーが作成したテーブルグループ名と競合する場合、データベースは作成されますが、テーブルグループは自動的にバインドされません。ユーザーは
ALTER DATABASE TABLEGROUPステートメントを使用して、ShardingプロパティがNONEのテーブルグループを手動でバインドする必要があります。
例えば、データベース内ユーザーテーブルの自動集約を有効にした後、データベース infotest を作成したと仮定します。
obclient(root@mysql001)[(none)]> CREATE DATABASE infotest;
ビュー DBA_OB_DATABASES(sys テナントでビュー CDB_OB_DATABASES をクエリ)を参照することで、そのデータベースのデフォルトテーブルグループを確認できます。
obclient(root@mysql001)[(none)]> SELECT * FROM oceanbase.DBA_OB_DATABASES WHERE DATABASE_NAME = 'infotest';
+---------------+---------------+--------------------+-----------+---------+-----------------+
| DATABASE_NAME | IN_RECYCLEBIN | COLLATION | READ_ONLY | COMMENT | TABLEGROUP_NAME |
+---------------+---------------+--------------------+-----------+---------+-----------------+
| infotest | NO | utf8mb4_general_ci | NO | | TG_DB_500004 |
+---------------+---------------+--------------------+-----------+---------+-----------------+
1 row in set
クエリ結果によると、このデータベースのデフォルトテーブルグループは TG_DB_500004 です。ここで、500004 はデータベースのIDです。
複数のデータベースにまたがるユーザーテーブルの集約を設定する
ユーザーは、複数のデータベースの TABLEGROUP プロパティを変更し、すべてを Sharding = 'NONE' の同じテーブルグループにバインドすることで、複数のデータベースにまたがるユーザーテーブルの集約を実現できます。
操作手順は以下のとおりです:
MySQLテナントのテナント管理者がデータベースに接続します。
接続例は以下のとおりですが、データベースへの接続時には、実際の環境に従ってください。
obclient -h10.xx.xx.xx -P2883 -uroot@mysql_tenant#obdemo -p***** -A以下のコマンドを実行して、対象データベースの
TABLEGROUPプロパティを変更します。ステートメントは以下のとおりです:
ALTER DATABASE [database_name] TABLEGROUP [=] tablegroup_name;ここで:
database_name:対象データベースの名前。オプションです。明示的に指定しない場合、変更対象のデータベースは現在のデータベースを意味します。tablegroup_name:ShardingプロパティがNONEのテーブルグループ名。このステートメントは、対象データベース内のすべてのテーブルの
TABLEGROUPプロパティを変更します。対象データベース内に、テーブルグループのSharding要件を満たせない分布を持つテーブルが存在する場合、ステートメントの実行はエラーとなります。
例:
obclient(root@mysql001)[infotest]> ALTER DATABASE infotest TABLEGROUP =tg_test;ビュー
DBA_OB_DATABASES(sysテナントでビューCDB_OB_DATABASESをクエリ)を使用して、テーブルグループが正常に変更されたかどうかを確認します。obclient(root@mysql001)[(none)]> SELECT * FROM oceanbase.DBA_OB_DATABASES WHERE DATABASE_NAME = 'infotest';クエリ結果は次のとおりです:
+---------------+---------------+--------------------+-----------+---------+-----------------+ | DATABASE_NAME | IN_RECYCLEBIN | COLLATION | READ_ONLY | COMMENT | TABLEGROUP_NAME | +---------------+---------------+--------------------+-----------+---------+-----------------+ | infotest | NO | utf8mb4_general_ci | NO | | tg_test | +---------------+---------------+--------------------+-----------+---------+-----------------+ 1 row in set上記の操作を繰り返し、複数の対象データベースを同じテーブルグループにバインドします。
次のステップ
データベースの tablegroup プロパティを変更しても、システムはすぐにすべてのユーザーテーブルのパーティションを同一のログストリームに整列させるわけではありません。ユーザーテーブルの集約を早期に開始したい場合は、DBMS_BALANCE.TRIGGER_PARTITION_BALANCE サブプログラムを呼び出して、手動でパーティションの均衡をトリガーできます。手動でパーティションの均衡をトリガーする詳細な操作については、パーティションの均衡を手動でトリガーするを参照してください。
または、ユーザーは定期的なパーティション均衡タスクのトリガーを待つこともできます。定期的なパーティション均衡タスクの詳細については、定期的なパーティション均衡タスクの設定を参照してください。
関連ドキュメント
ユーザーテーブルの集約に関するアプリケーション事例については、テーブルグループの重み均等化アプリケーション事例を参照してください。