OceanBaseデータベースでは、DUPLICATE_SCOPEパラメータを使用してレプリケーションテーブルのプロパティを指定します。テーブル作成後、DUPLICATE_SCOPEパラメータの値を変更することで、レプリケーションテーブルと通常のテーブル間で相互に変換できます。
制限事項と注意点
レプリケーションテーブルの変換を行う際、現在のテナントでスケーリングアップ・ダウン、プライマリゾーンの変更、ローカリティの変更などの操作によりロードバランシングタスクがトリガーされた場合、レプリケーションテーブルのプロパティ変換タスクは、現在のバランシングタスクが完了するまで待機する必要があります。
注意
レプリケーションテーブルの変換プロセスは非同期です。
DUPLICATE_SCOPEを手動で変更した後、バックグラウンドのパーティションバランシングタスクが完了するまで、実際にはターゲットプロパティのテーブルとして使用できません。パーティションバランシングの詳細については、テナント内バランシングを参照してください。レプリケーションテーブルとテーブルグループは排他的な関係にあるため、通常のテーブルをレプリケーションテーブルに変換する際、変換対象の通常のテーブルが特定のテーブルグループに属している場合、その通常のテーブルをレプリケーションテーブルに変換することはできません。
レプリケーションテーブルの変換は、テナントのロードバランシングおよびTransfer機能に依存します。テナントレベルの構成パラメータ
enable_rebalance、enable_transfer、およびenable_rereplicationのいずれかの値がfalseである場合、レプリケーションテーブルの変換操作を行うことはできません。構成パラメータenable_rebalance、enable_transferの値をfalseに変更すると、実行中のレプリケーションテーブル変換タスクはキャンセルされます。
前提条件
レプリケーションテーブルの変換操作を行う前に、以下の構成パラメータの値が True に設定されていることを確認してください:
enable_rebalanceテナントレベルの構成パラメータ
enable_rebalanceは、システムテナントではテナント間のロードバランシングを行うかどうかを、ユーザーテナントではテナント内のバランシングを行うかどうかを制御します。デフォルト値はTrueです。構成パラメータenable_rebalanceの詳細と設定については、enable_rebalanceを参照してください。enable_transferテナントレベルの構成パラメータ
enable_transferは、テナント内でTransferを行うかどうかを制御します。デフォルト値はTrueです。構成パラメータenable_transferの詳細と設定については、enable_transferを参照してください。enable_rereplicationクラスタレベルの構成パラメータ
enable_rereplicationは、ログストリームレプリカの自動移行複製の総合スイッチです。デフォルト値はTrueです。構成パラメータenable_rereplicationの詳細と設定については、enable_rereplicationを参照してください。
レプリケーションテーブルプロパティの変更構文
レプリケーションテーブルプロパティを変更するSQLステートメントは次のとおりです:
ALTER TABLE table_name DUPLICATE_SCOPE= 'none | cluster';
ステートメント内で:
none:現在のテーブルを通常のテーブルに変換することを示します。cluster:現在のテーブルをレプリケーションテーブルに変換することを示します。
例
以下のコマンドは、レプリケーションテーブルを通常のテーブルに変換する方法を示しています。
レプリケーションテーブル
tbl1を作成します。obclient [test]> CREATE TABLE tbl1 (c1 int,c2 int) DUPLICATE_SCOPE= 'cluster';このレプリケーションテーブルを通常のテーブルに変換します。
ALTER TABLE tbl1 DUPLICATE_SCOPE= 'none';注意
上記のSQLステートメントは、テーブルのプロパティを変更した後すぐに成功を返しますが、実際のレプリケーションテーブルの変換アクションはバックグラウンドスレッドによって非同期で実行されます。
テーブルのレプリケーションテーブルプロパティを確認します。
ビュー
sys.DBA_OB_TABLE_LOCATIONSを使用して、テーブルの現在のレプリケーションテーブルプロパティと存在するログストリームIDを確認できます。ここで、DUPLICATE_SCOPE列がCLUSTERの場合はレプリケーションテーブルを表し、NONEの場合は通常のテーブルを表します。SELECT database_name, table_name, table_id, tablet_id, ls_id, role, duplicate_scope FROM sys.DBA_OB_TABLE_LOCATIONS WHERE table_name = 'TBL1';実行結果は次のとおりです:
+---------------+------------+----------+-----------+-------+--------+-----------------+ | DATABASE_NAME | TABLE_NAME | TABLE_ID | TABLET_ID | LS_ID | ROLE | DUPLICATE_SCOPE | +---------------+------------+----------+-----------+-------+--------+-----------------+ | SYS | TBL1 | 500011 | 200002 | 1002 | LEADER | NONE | +---------------+------------+----------+-----------+-------+--------+-----------------+ 1 row in set説明
以下の手順に従って、レプリケーションテーブル変換後のパーティションレプリカの分散が目標プロパティに適合するかどうかを確認できます。
レプリケーションテーブル変換の進捗状況を確認します。
ログストリームのプロパティを確認します。
テナント内のすべてのレプリケーションテーブルは、レプリケーションテーブル専用の特殊なログストリーム(ブロードキャストログストリーム)に配置されます。ビュー
sys.DBA_OB_LSを使用して、ログストリームのプロパティを確認できます。ここで、FLAG列にDUPLICATEが含まれている場合はブロードキャストログストリームを表します。FLAGが空またはDUPLICATEを含まない場合は、通常のログストリームを表します。SELECT * FROM sys.DBA_OB_LS WHERE LS_ID = 1002;実行結果は次のとおりです:
+-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+-----------+ | LS_ID | STATUS | PRIMARY_ZONE | UNIT_GROUP_ID | LS_GROUP_ID | CREATE_SCN | DROP_SCN | SYNC_SCN | READABLE_SCN | FLAG | +-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+-----------+ | 1002 | NORMAL | zone1 | 0 | 0 | 1713164474213079001 | NULL | 1713173927933707000 | 1713173927933707000 | DUPLICATE | +-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+-----------+ 1 row in setレプリケーションテーブル変換タスクを生成する必要があるかどうかを判断します。
レプリケーションテーブル変換タスクは、バックグラウンドのロードバランシングおよびTransferモジュールによって生成されます。以下のステートメントを使用して、レプリケーションテーブル変換タスクを生成する必要があるかどうかを迅速に判断できます。ここで、
DUPLICATE_SCOPEはテーブルのプロパティであり、FLAGは現在のテーブルのtabletが属するLSのプロパティです。FLAGにDUPLICATEが含まれている場合は、ブロードキャストログストリームを表します。SELECT A.duplicate_scope, B.flag FROM sys.DBA_OB_TABLE_LOCATIONS A, sys.DBA_OB_LS B WHERE A.ls_id = B.ls_id AND A.table_name = 'TBL1' AND A.role = 'LEADER';実行結果は次のとおりです:
+-----------------+-----------+ | DUPLICATE_SCOPE | FLAG | +-----------------+-----------+ | NONE | DUPLICATE | +-----------------+-----------+ 1 row in set実行情報の説明は次のとおりです:
DUPLICATE_SCOPEがNONEで、FLAGにDUPLICATEが含まれている場合:非レプリケーションテーブルがブロードキャストログストリーム上にあるため、レプリケーションテーブルを通常のテーブルに変換するタスクを生成し、非レプリケーションテーブルをブロードキャストログストリームから通常のログストリームにTransferする必要があります。DUPLICATE_SCOPEがNONEで、FLAGにDUPLICATEが含まれていない場合:レプリケーションテーブルが通常のログストリーム上にあるため、通常のテーブルをレプリケーションテーブルに変換するタスクを生成し、レプリケーションテーブルを通常のログストリームからブロードキャストログストリームにTransferする必要があります。
即時に変換タスクを生成します。
構成パラメータ
partition_balance_schedule_intervalを一時的に小さくすることで、即時に変換タスクを生成できます。ALTER SYSTEM SET partition_balance_schedule_interval = '30s';レプリケーションテーブル変換タスクを確認します。
レプリケーションテーブル変換によって生成されたタスクは、関連ビュー
DBA/CDB_OB_BALANCE_JOB_HISTORYおよびDBA/CDB_OB_BALANCE_JOBSを使用して確認できます。過去の変換タスクの実行状況を確認します。
過去の履歴がない場合、タスクが実行中またはまだ生成されていない可能性があります。
SELECT * FROM sys.DBA_OB_BALANCE_JOB_HISTORY;実行結果は次のとおりです:
+--------+------------------------------+------------------------------+-------------------+-------------------+-----------------+-------------------------+-----------+---------+ | JOB_ID | CREATE_TIME | FINISH_TIME | BALANCE_STRATEGY | JOB_TYPE | TARGET_UNIT_NUM | TARGET_PRIMARY_ZONE_NUM | STATUS | COMMENT | +--------+------------------------------+------------------------------+-------------------+-------------------+-----------------+-------------------------+-----------+---------+ | 787926 | 15-APR-24 05.41.42.226172 PM | 15-APR-24 05.41.52.235808 PM | partition balance | PARTITION_BALANCE | 1 | 1 | COMPLETED | NULL | +--------+------------------------------+------------------------------+-------------------+-------------------+-----------------+-------------------------+-----------+---------+ 1 row in set現在の均衡タスクの実行状況を確認します。
SELECT * FROM sys.DBA_OB_BALANCE_JOBS;変換タスクに対応するサブタスク(パーティションリストを含む)を確認します。
上記のタスクに対応する
job_idを以下のSQLステートメントに入力します:SELECT * FROM sys.DBA_OB_BALANCE_TASKS WHERE JOB_ID = xxxx;SELECT * FROM sys.DBA_OB_BALANCE_TASK_HISTORY WHERE JOB_ID = xxxx;
説明
DBA_OB_BALANCE_JOBSビューで他のBALANCE_JOBが実行されている場合、現在のタスクが完了するまで待機し、その後にパーティション均衡タスクがスケジュールされます。- 上記の
BALANCE関連ビューに対応するレプリケーションテーブル変換タスクがない場合、対応するBALANCE_JOBがまだ生成されていない可能性があります。待機するか、構成パラメータpartition_balance_schedule_intervalを一時的に小さくする必要があります。 - 長時間変換タスクが生成されない場合、
enable_rebalance、enable_transfer、balancer_idle_time、enable_rereplicationなどのロードバランシング関連構成パラメータを確認し、Transferが無効になっていないかどうかを確認する必要があります。