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 | UNIT_LIST | +-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+-----------+-----------+ | 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が無効になっていないか確認してください。