ユーザーテーブルの集約とは、同一テナント内の指定されたユーザーテーブルを単一のログストリームにバインドすることを指します。OceanBaseデータベースは、DatabaseをSharding = 'NONE'のテーブルグループにバインドすることで、そのDatabase内のすべてのユーザーテーブルの集約を実現します。同様に、複数のDatabaseを同一のテーブルグループにバインドすることで、複数のDatabaseにまたがるユーザーテーブルの集約も実現できます。
使用制限
現在、データベース内のユーザーテーブルの集約機能は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 サブプログラムを呼び出して、手動で一度パーティションの均衡をトリガーできます。手動でパーティションの均衡をトリガーする詳細な操作については、パーティションの均衡を手動でトリガーするを参照してください。
または、ユーザーは定期的なパーティション均衡タスクのトリガーを待つこともできます。定期的なパーティション均衡タスクの詳細については、定期的なパーティション均衡タスクの設定を参照してください。
関連ドキュメント
ユーザーテーブルの集約に関するアプリケーション事例については、テーブルグループの重み均衡アプリケーション事例を参照してください。