自動的なロードバランシングでは、ユーザーの特定パーティションに対する集約や分散の要件を満たせない場合、Transfer Partition操作を手動で実行できます。
使用上の制限と注意事項
Transfer Partition操作を実行するユーザーは
ALTER SYSTEM権限を持っている必要があります。権限の詳細については、ユーザーと権限の概要を参照してください。Transfer Partition操作はプライマリテナントでのみ実行でき、かつユーザーテナント内のパーティションへのみ転送できます。
テナントのTransfer機能を無効にした場合(テナントの構成パラメータ
enable_transferの値がfalseの場合)、そのテナントでTRANSFER PARTITIONステートメントを実行するとエラーが発生します。既に実行済みのTRANSFER PARTITIONステートメントに対応するTransfer Partitionタスクはキャンセルされる可能性があります。システムテーブルに対してTransfer Partition操作を実行することはサポートされていません。
システムテナント内のユーザーテーブルに対してTransfer Partition操作を実行することはサポートされていません。
通常のテーブルをブロードキャストログストリームに転送すること、またレプリケーションテーブルを通常のログストリームに転送することはサポートされていません。
非独立パーティションのTransferはサポートされていません。例えば、部分インデックステーブルのパーティションやLOBテーブルのパーティションはTransferできません。
同一のパーティションに対して、Transfer Partition操作が完了するまで、再度Transfer Partition操作を開始することはできません。
現在のクラスタでバランスジョブ(Balance Job)が処理中の場合、手動でトリガーされたTransfer Partitionタスクはすぐにスケジュールされません。Transfer Partitionタスクをできるだけ早くスケジュールしたい場合は、そのBalance Jobタスクをキャンセルすることができます。Balance Jobタスクのキャンセル操作の詳細については、Balance Jobのキャンセルを参照してください。
前提条件
Transfer Partitionを行う前に、Transfer機能を有効にする必要があります。Transfer機能はテナントレベルの構成パラメータ
enable_transferによって制御され、デフォルト値はtrueで、Transfer機能が有効であることを示します。構成パラメータenable_transferの詳細な説明と設定については、enable_transferを参照してください。Transfer Partition戦略と自動バランス戦略が競合する可能性があるため、パーティションの位置を固定するために、Transfer Partition操作を実行する前に自動バランス戦略を無効にすることを推奨します。つまり、対応するテナントの構成パラメータ
enable_rebalanceの値をfalseに設定します。構成パラメータenable_rebalanceの詳細な説明と設定については、enable_rebalanceを参照してください。Transfer Partition操作自体は構成パラメータ
enable_rebalanceの制御を受けませんが、enable_rebalanceとenable_transferの両方の値がtrueの場合、ユーザーが特定のパーティションを対応するログストリームに移行した後、システムの自動バランス戦略がそのパーティションを他のログストリームに再移行する可能性があります。
システムテナントによるパーティションの転送
rootユーザーでクラスタのsysテナントにログインします。接続例は以下のとおりですが、データベースへの接続時には実際の環境に合わせてください。
obclient -h10.xx.xx.xx -P2883 -uroot@sys#obdemo -p***** -Aビュー
DBA_OB_TENANTSを照会し、対象テナントのTENANT_IDを取得します。obclient(root@sys)[oceanbase]> SELECT TENANT_ID FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'oracle_tenant';クエリ結果は次のとおりです:
+-----------+ | TENANT_ID | +-----------+ | 1006 | +-----------+ 1 row in setパーティション情報を確認します。
ビュー
CDB_OB_TABLE_LOCATIONSを照会することで、テーブル内の指定されたパーティションに対応するTABLE_ID、OBJECT_ID、LS_IDを取得できます。非パーティションテーブルにおける指定パーティションの
TABLE_ID、OBJECT_ID、LS_IDの取得oracle_tenantテナントに非パーティションテーブルT1が存在する場合、クエリ例は以下のとおりです:obclient(root@sys)[oceanbase]> SELECT TABLE_ID AS TABLE_ID, OBJECT_ID, TABLET_ID, LS_ID FROM oceanbase.CDB_OB_TABLE_LOCATIONS WHERE TENANT_ID = 1006 AND DATABASE_NAME = 'SYS' AND TABLE_NAME= 'T1' LIMIT 1;クエリ結果は次のとおりです:
+----------+-----------+-----------+-------+ | TABLE_ID | OBJECT_ID | TABLET_ID | LS_ID | +----------+-----------+-----------+-------+ | 500002 | 500002 | 200001 | 1001 | +----------+-----------+-----------+-------+ 1 row in setパーティションテーブルにおける指定パーティションの
TABLE_ID、OBJECT_ID、LS_IDの取得パーティションテーブルの場合、クエリ時には具体的なパーティション名を指定するだけで済みます。
oracle_tenantテナントにパーティションテーブルTBL1_LOG_Rが存在する場合を想定します。obclient(SYS@oracle_tenant)[SYS]> CREATE TABLE tbl1_log_r(log_id INT,log_date DATE NOT NULL DEFAULT SYSDATE) PARTITION BY RANGE(log_date) (PARTITION M202001 VALUES LESS THAN(TO_DATE('2020/02/01','YYYY/MM/DD')) , PARTITION M202002 VALUES LESS THAN(TO_DATE('2020/03/01','YYYY/MM/DD')) , PARTITION M202003 VALUES LESS THAN(TO_DATE('2020/04/01','YYYY/MM/DD')) , PARTITION M202004 VALUES LESS THAN(TO_DATE('2020/05/01','YYYY/MM/DD')) , PARTITION M202005 VALUES LESS THAN(TO_DATE('2020/06/01','YYYY/MM/DD')) , PARTITION M202006 VALUES LESS THAN(TO_DATE('2020/07/01','YYYY/MM/DD')) , PARTITION M202007 VALUES LESS THAN(TO_DATE('2020/08/01','YYYY/MM/DD')) , PARTITION M202008 VALUES LESS THAN(TO_DATE('2020/09/01','YYYY/MM/DD')) , PARTITION M202009 VALUES LESS THAN(TO_DATE('2020/10/01','YYYY/MM/DD')) , PARTITION M202010 VALUES LESS THAN(TO_DATE('2020/11/01','YYYY/MM/DD')) , PARTITION M202011 VALUES LESS THAN(TO_DATE('2020/12/01','YYYY/MM/DD')) , PARTITION M202012 VALUES LESS THAN(TO_DATE('2021/01/01','YYYY/MM/DD')) , PARTITION MMAX VALUES LESS THAN (MAXVALUE) );このパーティションテーブルのパーティション
M202005に関する情報を照会する例は以下のとおりです:obclient(root@sys)[oceanbase]> SELECT TABLE_ID AS TABLE_ID, OBJECT_ID, TABLET_ID, LS_ID FROM oceanbase.CDB_OB_TABLE_LOCATIONS WHERE TENANT_ID = 1006 AND DATABASE_NAME = 'SYS' AND TABLE_NAME= 'TBL1_LOG_R' AND PARTITION_NAME = 'M202005' LIMIT 1;クエリ結果は次のとおりです:
+----------+-----------+-----------+-------+ | TABLE_ID | OBJECT_ID | TABLET_ID | LS_ID | +----------+-----------+-----------+-------+ | 500003 | 500009 | 200006 | 1002 | +----------+-----------+-----------+-------+ 1 row in setセカンダリパーティションテーブルにおけるセカンダリパーティションの
TABLE_ID、OBJECT_ID、LS_IDの取得セカンダリパーティションテーブルの場合、クエリ時にはパーティション名とセカンダリパーティション名の両方を指定する必要があります。
oracle_tenantテナントにセカンダリパーティションテーブルT2_F_RLが存在する場合を想定します。obclient(SYS@oracle_tenant)[SYS]> CREATE TABLE t2_f_rl(col1 INT,col2 VARCHAR2(50)) PARTITION BY RANGE(col1) SUBPARTITION BY LIST(col2) (PARTITION p0 VALUES LESS THAN(100) (SUBPARTITION sp0 VALUES('01'), SUBPARTITION sp1 VALUES('02') ), PARTITION p1 VALUES LESS THAN(200) (SUBPARTITION sp2 VALUES('01'), SUBPARTITION sp3 VALUES('02'), SUBPARTITION sp4 VALUES('03') ) );このセカンダリパーティションテーブルのセカンダリパーティション
SP2に関する情報を照会する例は以下のとおりです:obclient(root@sys)[oceanbase]> SELECT TABLE_ID AS TABLE_ID, OBJECT_ID, TABLET_ID, LS_ID FROM oceanbase.CDB_OB_TABLE_LOCATIONS WHERE TENANT_ID = 1006 AND DATABASE_NAME = 'SYS' AND TABLE_NAME= 'T2_F_RL' AND PARTITION_NAME = 'P1' AND SUBPARTITION_NAME = 'SP2' LIMIT 1;クエリ結果は次のとおりです:
+----------+-----------+-----------+-------+ | TABLE_ID | OBJECT_ID | TABLET_ID | LS_ID | +----------+-----------+-----------+-------+ | 500018 | 500023 | 200017 | 1003 | +----------+-----------+-----------+-------+ 1 row in set
転送先を選択します。
ビュー
CDB_OB_LSを照会し、テナントのログストリームの状態と情報を取得します。obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.CDB_OB_LS WHERE TENANT_ID = 1006;クエリ結果は次のとおりです:
+-----------+-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+-----------+ | TENANT_ID | LS_ID | STATUS | PRIMARY_ZONE | UNIT_GROUP_ID | LS_GROUP_ID | CREATE_SCN | DROP_SCN | SYNC_SCN | READABLE_SCN | FLAG | UNIT_LIST | +-----------+-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+-----------+ | 1006 | 1 | NORMAL | zone1 | 0 | 0 | NULL | NULL | 1701244663685197789 | 1701244663685197789 | | | | 1006 | 1001 | NORMAL | zone1 | 0 | 1001 | 1701239786827662637 | NULL | 1701244663685197789 | 1701244663685197789 | | 1001 | | 1006 | 1002 | NORMAL | zone1 | 0 | 1002 | 1701239786831568305 | NULL | 1701244664066906860 | 1701244664066906859 | | 1002 | | 1006 | 1003 | NORMAL | zone1 | 0 | 1003 | 1701239786834300282 | NULL | 1701244664175263949 | 1701244664175263948 | | 1003 | +-----------+-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+-----------+ 4 rows in setビュー
CDB_OB_TABLET_TO_LSを照会し、ログストリーム上のTabletの分布情報を取得します。obclient(root@sys)[oceanbase]> SELECT LS_ID, COUNT(*) AS C FROM oceanbase.CDB_OB_TABLET_TO_LS WHERE TENANT_ID = 1006 GROUP BY LS_ID;クエリ結果は次のとおりです:
+-------+------+ | LS_ID | C | +-------+------+ | 1 | 578 | | 1001 | 7 | | 1002 | 5 | | 1003 | 7 | +-------+------+ 4 rows in set上記の情報に基づき、適切なログストリームをTransferの転送先として選択します。
以下のコマンドを実行して、Transfer Partition操作を実行します。
ALTER SYSTEM TRANSFER PARTITION TABLE_ID [=] table_id, OBJECT_ID [=] object_id TO LS ls_id TENANT = 'tenant_name';ここで:
table_id:テーブルID。object_id:パーティションの一意の識別子。ls_id:Transfer転送先のログストリームID。tenant_name:転送対象のパーティションが属するテナント。
テナント
oracle_tenantを例に、そのSYSデータベース内のテーブルTBL1_LOG_RのM202005パーティションを現在の1002番ログストリームから1003番ログストリームに移行する例を以下に示します。obclient(root@sys)[oceanbase]> ALTER SYSTEM TRANSFER PARTITION TABLE_ID = 500003, OBJECT_ID = 500009 TO LS 1003 TENANT = 'oracle_tenant';Transfer Partitionコマンドの実行が成功した後、以下のビューでタスクの状態を確認できます。
ビュー
CDB_OB_TRANSFER_PARTITION_TASKSを照会し、タスクのTASK_ID、TRANSFER_TASK_ID、BALANCE_JOB_IDを取得します。ビュー
CDB_OB_TRANSFER_PARTITION_TASKSは、すべてのテナントで現在処理中のパーティションTransferタスクを表示します。クエリ例は以下のとおりです:obclient(root@sys)[oceanbase]> SELECT TASK_ID, BALANCE_JOB_ID, TRANSFER_TASK_ID, STATUS FROM oceanbase.CDB_OB_TRANSFER_PARTITION_TASKS WHERE TENANT_ID = 1006 AND TABLE_ID = 500003 AND OBJECT_ID = 500009;クエリ結果の例は次のとおりです:
+---------+----------------+------------------+--------+ | TASK_ID | BALANCE_JOB_ID | TRANSFER_TASK_ID | STATUS | +---------+----------------+------------------+--------+ | 1 | 17304 | 1 | DOING | +---------+----------------+------------------+--------+ 1 row in setクエリ結果の
STATUS列の値に基づいてタスクの状態を確認し、タスクの実行進捗をさらに確認できます:WAITING:タスクが待機中で、まだスケジューリングが開始されていないことを示します。INIT:タスクがBALANCE_JOBを構築したことを示します。BALANCE_JOB_IDに基づいて、関連するBALANCE_JOBの実行進捗を確認できます。DOING:タスクがTransferの実行を開始したことを示します。TRANSFER_TASK_IDに基づいて、関連するTransfer Partitionタスクを確認できます。TRANSFER_TASK_IDは何度も変化し、1つのTransfer Partitionタスクには複数回のTransferが含まれることがあります。
ビュー
CDB_OB_TRANSFER_PARTITION_TASKSのクエリ結果が空の場合、ビューCDB_OB_TRANSFER_PARTITION_TASK_HISTORYでタスク結果を確認できます。取得した
BALANCE_JOB_IDに基づいて、ビューCDB_OB_BALANCE_JOBSまたはCDB_OB_BALANCE_JOB_HISTORYを照会し、関連するBALANCE_JOBの実行状態を確認します。ビュー
CDB_OB_BALANCE_JOBSは、すべてのテナントで現在実行中のロードバランシング作業を表示します。各テナントでは同時に1つのロードバランシング作業(BALANCE_JOB)しか存在せず、各作業は複数のロードバランシングタスク(TRANSFER_TASK)を生成します。ビューCDB_OB_BALANCE_JOB_HISTORYは、すべてのテナントで実行されたロードバランシング作業の履歴を表示します。クエリ例は以下のとおりです:obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.CDB_OB_BALANCE_JOBS WHERE JOB_ID = 17304;obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.CDB_OB_BALANCE_JOB_HISTORY WHERE JOB_ID = 17304;ここで、
17304は前の手順で取得したBALANCE_JOB_IDに置き換える必要があります。クエリ結果の
STATUS列はBALANCE_JOBの実行状態を示しています:DOING:ロードバランシング作業が実行中であることを示します。COMPLETED:ロードバランシング作業が正常に実行されたことを示します。CANCELING:ロードバランシング作業がキャンセル中であることを示します。CANCELED:ロードバランシング作業がキャンセルされたことを示します。
取得した
TRANSFER_TASK_IDに基づいて、ビューCDB_OB_TRANSFER_TASKSまたはCDB_OB_TRANSFER_TASK_HISTORYを照会し、タスクに関連するTRANSFER_TASKの実行状態を確認します。ビュー
CDB_OB_TRANSFER_TASKSは、すべてのテナントで現在実行中のロードバランシングタスクを表示します。同時に複数のロードバランシングタスクが実行されている可能性があり、これらのタスク(TRANSFER_TASK)はすべて同一のロードバランシング作業(BALANCE_JOB)に属します。ビューCDB_OB_TRANSFER_TASK_HISTORYは、すべてのテナントで実行されたロードバランシングタスクの履歴を表示します。クエリ例は以下のとおりです:obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.CDB_OB_TRANSFER_TASKS WHERE TASK_ID = 1;obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.CDB_OB_TRANSFER_TASK_HISTORY WHERE TASK_ID = 1;ここで、
1は前の手順で取得したTRANSFER_TASK_IDに置き換える必要があります。クエリ結果の
STATUS列はTRANSFER_TASKの実行状態を示しています:INIT:タスクの作成中であることを示します。START:Transferの実行開始を示します。DOING:Transferの実行中であることを示します。ABORTED:Transferタスクの実行に失敗し、タスクが終了したことを示します。COMPLETED:Transferタスクの実行が成功したことを示します。FAILED:Transferタスクの実行に失敗したことを示します。CANCELED:Transferタスクがキャンセルされたことを示します。
取得した
TASK_IDに基づいて、ビューCDB_OB_TRANSFER_PARTITION_TASK_HISTORYを照会し、Transfer Partitionタスクの結果を確認します。ビュー
CDB_OB_TRANSFER_PARTITION_TASK_HISTORYは、すべてのテナントで実行されたTransfer Partitionタスクの履歴を表示します。obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.CDB_OB_TRANSFER_PARTITION_TASK_HISTORY WHERE TASK_ID = 1;ここで、
1は前の手順で取得したTASK_IDに置き換える必要があります。クエリ結果の
STATUS列はTransfer Partitionタスクの結果を示しています:COMPLETED:Transfer Partitionタスクの実行が成功したことを示します。FAILED:Transfer Partitionタスクの実行に失敗したことを示します。COMMENT列を確認することで、タスク失敗の原因をさらに特定できます。COMMENT列に一般的に表示される情報は以下のとおりです:LS not exist or may be in DROPPING/WAIT_OFFLINE status:Transfer転送先のログストリームが存在しないか、DROPPINGまたはWAITOFFLINE状態にある可能性があります。LS status is not NORMAL or is in BLOCK_TABLET_IN state:Transfer転送先のログストリームがNORMAL状態ではない可能性があります。例えば、CREATINGやCREATEDなどの状態にあるか、ログストリームがBLOCK_TABLET_IN状態になっており、移行できない可能性があります。Table has beed dropped:転送対象のパーティションが属するテーブルが削除されました。Partition has beed dropped:転送対象のパーティションが削除されました。Partition is already in dest LS:パーティションは既にTransfer転送先にあります。Need retry, partition may be dropped:Transferの実行時にパーティションが削除されたため、システムは次回ロードバランシングタスクを生成する際に、パーティションが存在するかどうか再度チェックします。Need retry, partition may be dropped or be transferre:Transferの実行時にパーティションが存在しなくなったため、パーティションが削除されたか、ソース側のログストリームにない可能性があります。システムは次回ロードバランシングタスクを生成する際に、パーティションの存在を確認するか、Transferタスクを再生成する必要があります。
Transfer Partitionタスクの実行が成功した後、対応するパーティション情報を再度確認します。
obclient(root@sys)[oceanbase]> SELECT TABLE_ID AS TABLE_ID, OBJECT_ID, TABLET_ID, LS_ID FROM oceanbase.CDB_OB_TABLE_LOCATIONS WHERE TENANT_ID = 1006 AND DATABASE_NAME = 'SYS' AND TABLE_NAME= 'TBL1_LOG_R' AND PARTITION_NAME = 'M202005' LIMIT 1;クエリ結果は次のとおりです:
+----------+-----------+-----------+-------+ | TABLE_ID | OBJECT_ID | TABLET_ID | LS_ID | +----------+-----------+-----------+-------+ | 500003 | 500009 | 200006 | 1003 | +----------+-----------+-----------+-------+ 1 row in set結果によると、
SYSデータベース内のテーブルTBL1_LOG_RのM202005パーティションが、以前の1002番ログストリームから1003番ログストリームに移行され、Transfer Partition操作が成功しました。
ユーザーテナントによるパーティションの転送
このドキュメントでは、テナント mysql_tenant を例に操作手順を説明します。
MySQLテナントのテナント管理者がデータベースに接続します。
接続例は以下のとおりです。データベースへの接続時は、実際の環境に合わせてください。
obclient -h10.xx.xx.xx -P2883 -uroot@mysql_tenant#obdemo -p***** -Aパーティション情報を確認します。
ビュー
DBA_OB_TABLE_LOCATIONSをクエリし、指定したパーティションのTABLE_ID、OBJECT_ID、LS_IDを取得します。非パーティションテーブルの
TABLE_ID、OBJECT_ID、LS_IDの取得mysql_tenantテナントに非パーティションテーブルt1が存在する場合、クエリ例は以下のとおりです:obclient(root@mysql_tenant)[test]> SELECT TABLE_ID AS TABLE_ID, OBJECT_ID, TABLET_ID, LS_ID FROM oceanbase.DBA_OB_TABLE_LOCATIONS WHERE DATABASE_NAME = 'test' AND TABLE_NAME= 't1' LIMIT 1;クエリ結果は以下のとおりです:
+----------+-----------+-----------+-------+ | TABLE_ID | OBJECT_ID | TABLET_ID | LS_ID | +----------+-----------+-----------+-------+ | 500002 | 500002 | 200001 | 1001 | +----------+-----------+-----------+-------+ 1 row in setパーティションテーブルの
TABLE_ID、OBJECT_ID、LS_IDの取得パーティションテーブルの場合、クエリ時には特定のパーティション名を指定するだけで済みます。例:
mysql_tenantテナントにパーティションテーブルtbl1_lが存在する場合を仮定します。obclient(root@mysql_tenant)[test]> CREATE TABLE tbl1_l (col1 BIGINT PRIMARY KEY,col2 VARCHAR(50)) PARTITION BY LIST(col1) (PARTITION p0 VALUES IN (1, 2, 3), PARTITION p1 VALUES IN (5, 6), PARTITION p2 VALUES IN (DEFAULT) );このパーティションテーブル内のパーティション
p1に関する情報をクエリする例は以下のとおりです:obclient(root@mysql_tenant)[oceanbase]> SELECT TABLE_ID AS TABLE_ID, OBJECT_ID, TABLET_ID, LS_ID FROM oceanbase.DBA_OB_TABLE_LOCATIONS WHERE DATABASE_NAME = 'test' AND TABLE_NAME= 'tbl1_l' AND PARTITION_NAME = 'p1' LIMIT 1;クエリ結果は以下のとおりです:
+----------+-----------+-----------+-------+ | TABLE_ID | OBJECT_ID | TABLET_ID | LS_ID | +----------+-----------+-----------+-------+ | 500012 | 500014 | 200009 | 1001 | +----------+-----------+-----------+-------+ 1 row in setサブパーティションテーブルの
TABLE_ID、OBJECT_ID、LS_IDの取得サブパーティションテーブルの場合、クエリ時にはパーティション名とサブパーティション名の両方を指定する必要があります。
mysql_tenantテナントにサブパーティションテーブルt2_f_rclcが存在する場合を仮定します。obclient(root@mysql_tenant)[test]> CREATE TABLE t2_f_rclc (col1 INT,col2 INT) PARTITION BY RANGE COLUMNS(col1) SUBPARTITION BY LIST COLUMNS(col2) (PARTITION p0 VALUES LESS THAN(100) (SUBPARTITION sp0 VALUES IN(1,3), SUBPARTITION sp1 VALUES IN(4,6), SUBPARTITION sp2 VALUES IN(7,9)), PARTITION p1 VALUES LESS THAN(200) (SUBPARTITION sp3 VALUES IN(1,3), SUBPARTITION sp4 VALUES IN(4,6), SUBPARTITION sp5 VALUES IN(7,9)) );このサブパーティションテーブル内のサブパーティション
sp3に関する情報をクエリする例は以下のとおりです:obclient(root@mysql_tenant)[oceanbase]> SELECT TABLE_ID AS TABLE_ID, OBJECT_ID, TABLET_ID, LS_ID FROM oceanbase.DBA_OB_TABLE_LOCATIONS WHERE DATABASE_NAME = 'test' AND TABLE_NAME= 't2_f_rclc' AND PARTITION_NAME = 'P1' AND SUBPARTITION_NAME = 'sp3' LIMIT 1;クエリ結果は以下のとおりです:
+----------+-----------+-----------+-------+ | TABLE_ID | OBJECT_ID | TABLET_ID | LS_ID | +----------+-----------+-----------+-------+ | 500003 | 500009 | 200005 | 1002 | +----------+-----------+-----------+-------+ 1 row in set
Transfer先を選択します。
ビュー
DBA_OB_LSをクエリし、テナントのログストリームの状態と情報を取得します。obclient(root@mysql_tenant)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_LS;クエリ結果は以下のとおりです:
+-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+-----------+ | LS_ID | STATUS | PRIMARY_ZONE | UNIT_GROUP_ID | LS_GROUP_ID | CREATE_SCN | DROP_SCN | SYNC_SCN | READABLE_SCN | FLAG | UNIT_LIST | +-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+-----------+ | 1 | NORMAL | zone1 | 0 | 0 | NULL | NULL | 1701247658419109377 | 1701247658419109377 | | | | 1001 | NORMAL | zone1 | 0 | 1001 | 1701239750437064613 | NULL | 1701247658419109376 | 1701247658419109376 | | 1001 | | 1002 | NORMAL | zone1 | 0 | 1002 | 1701239750441114919 | NULL | 1701247658223204599 | 1701247658223204599 | | 1002 | | 1003 | NORMAL | zone1 | 0 | 1003 | 1701239750443869478 | NULL | 1701247659122731843 | 1701247659030755559 | | 1003 | +-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+-----------+ 4 rows in setビュー
DBA_OB_TABLET_TO_LSをクエリし、ログストリーム上のTabletの分布情報を取得します。obclient(root@mysql_tenant)[oceanbase]> SELECT LS_ID, COUNT(*) AS C FROM oceanbase.DBA_OB_TABLET_TO_LS GROUP BY LS_ID;クエリ結果は以下のとおりです:
+-------+------+ | LS_ID | C | +-------+------+ | 1 | 590 | | 1001 | 4 | | 1002 | 3 | | 1003 | 3 | +-------+------+ 4 rows in set上記の情報に基づき、適切なログストリームをTransfer先として選択します。
以下のコマンドを実行して、Transfer Partition操作を実行します。
ALTER SYSTEM TRANSFER PARTITION TABLE_ID [=] table_id, OBJECT_ID [=] object_id TO LS ls_id;ここで:
table_id:テーブルID。object_id:パーティションの一意の識別子。ls_id:Transfer先のログストリームID。tenant_name:Transfer対象のパーティションが属するテナント。
テナント
mysql_tenant内のtestライブラリのテーブルtbl1_lのp1パーティションを、現在の1001番ログストリームから1003番ログストリームに移行する例を以下に示します。obclient(root@mysql_tenant)[oceanbase]> ALTER SYSTEM TRANSFER PARTITION TABLE_ID = 500012, OBJECT_ID = 500014 TO LS 1003;Transfer Partitionコマンドの実行が成功した後、以下のビューでタスクの状態を確認できます。
ビュー
DBA_OB_TRANSFER_PARTITION_TASKSをクエリし、タスクのTASK_ID、TRANSFER_TASK_ID、BALANCE_JOB_IDを取得します。ビュー
DBA_OB_TRANSFER_PARTITION_TASKSは、現在処理中のTransfer Partitionタスクを表示します。クエリ例は以下のとおりです:obclient(root@mysql_tenant)[oceanbase]> SELECT TASK_ID, BALANCE_JOB_ID, TRANSFER_TASK_ID, STATUS FROM oceanbase.DBA_OB_TRANSFER_PARTITION_TASKS WHERE TABLE_ID = 500012 AND OBJECT_ID = 500014;クエリ結果の例は以下のとおりです:
+---------+----------------+------------------+--------+ | TASK_ID | BALANCE_JOB_ID | TRANSFER_TASK_ID | STATUS | +---------+----------------+------------------+--------+ | 1 | 26506 | 1 | DOING | +---------+----------------+------------------+--------+ 1 row in setクエリ結果の
STATUS列の値に基づいてタスクの状態を確認し、タスクの実行進捗をさらに確認できます:WAITING: タスクが待機中で、まだスケジューリングが開始されていないことを示します。INIT: タスクがBALANCE_JOBを構築したことを示します。BALANCE_JOB_IDに基づいて、関連するBALANCE_JOBの実行進捗を確認できます。DOING: タスクがTransferの実行を開始したことを示します。TRANSFER_TASK_IDに基づいて、関連するTransfer Partitionタスクを確認できます。TRANSFER_TASK_IDは複数回変更されることがあり、1つのTransfer Partitionタスクには複数回のTransferが含まれることがあります。
ビュー
DBA_OB_TRANSFER_PARTITION_TASKSのクエリ結果が空の場合、ビューDBA_OB_TRANSFER_PARTITION_TASK_HISTORYを参照してタスク結果を確認できます。取得した
BALANCE_JOB_IDに基づいてビューDBA_OB_BALANCE_JOBSまたはDBA_OB_BALANCE_JOB_HISTORYをクエリし、関連するBALANCE_JOBの実行状態を確認します。ビュー
DBA_OB_BALANCE_JOBSは、現在処理中のロードバランシング作業を表示します。各テナントは同時に1つのロードバランシング作業(BALANCE_JOB)しか持てません。各作業は複数のロードバランシングタスク(TRANSFER_TASK)を生成します。ビューDBA_OB_BALANCE_JOB_HISTORYは、既に実行されたロードバランシング作業の履歴を表示します。クエリ例は以下のとおりです:obclient(root@mysql_tenant)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_BALANCE_JOBS WHERE JOB_ID = 26506;obclient(root@mysql_tenant)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_BALANCE_JOB_HISTORY WHERE JOB_ID = 26506;ここで、
26506は前のステップで取得したBALANCE_JOB_IDに置き換える必要があります。クエリ結果の
STATUS列はBALANCE_JOBの実行状態を示しています:DOING:ロードバランシング作業が実行中であることを示します。COMPLETED:ロードバランシング作業が正常に実行されたことを示します。CANCELING:ロードバランシング作業がキャンセル中であることを示します。CANCELED:ロードバランシング作業がキャンセルされたことを示します。
取得した
TRANSFER_TASK_IDに基づいてビューDBA_OB_TRANSFER_TASKSまたはDBA_OB_TRANSFER_TASK_HISTORYをクエリし、タスクに関連するTRANSFER_TASKの実行状態を確認します。ビュー
DBA_OB_TRANSFER_TASKSは、現在処理中のロードバランシングタスクを表示します。同時に複数のロードバランシングタスクが実行されている可能性がありますが、これらのタスク(TRANSFER_TASK)はすべて同一のロードバランシング作業(BALANCE_JOB)に属します。ビューDBA_OB_TRANSFER_TASK_HISTORYは、既に実行されたロードバランシングタスクの履歴を表示します。クエリ例は以下のとおりです:obclient(root@mysql_tenant)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_TRANSFER_TASKS WHERE TASK_ID = 1;obclient(root@mysql_tenant)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_TRANSFER_TASK_HISTORY WHERE TASK_ID = 1;ここで、
1は前の手順で取得したTRANSFER_TASK_IDに置き換える必要があります。クエリ結果の
STATUS列はTRANSFER_TASKの実行状態を示しています:INIT:タスクの作成中であることを示します。START:Transferの実行開始を示します。DOING:Transferの実行中であることを示します。ABORTED:Transferタスクの実行に失敗し、タスクが終了したことを示します。COMPLETED:Transferタスクが正常に実行されたことを示します。FAILED:Transferタスクの実行に失敗したことを示します。CANCELED:Transferタスクがキャンセルされたことを示します。
取得した
TASK_IDに基づいてビューDBA_OB_TRANSFER_PARTITION_TASK_HISTORYをクエリし、Transfer Partitionタスクの結果を確認します。ビュー
DBA_OB_TRANSFER_PARTITION_TASK_HISTORYは、既に実行されたTransfer Partitionタスクの履歴を表示します。クエリ例は以下のとおりです:obclient(root@mysql_tenant)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_TRANSFER_PARTITION_TASK_HISTORY WHERE TASK_ID = 1;ここで、
1は前の手順で取得したTASK_IDに置き換える必要があります。クエリ結果の
STATUS列は Transfer Partitionタスクの結果を示しています:COMPLETED:Transfer Partitionタスクが正常に実行されたことを示します。FAILED:Transfer Partitionタスクの実行に失敗したことを示します。COMMENT列を確認することで、タスク失敗の原因をさらに確認できます。COMMENT列によく見られる情報は以下のとおりです:LS not exist or may be in DROPPING/WAIT_OFFLINE status:Transfer先のログストリームが存在しないか、DROPPING、WAITOFFLINEの状態にある可能性があります。LS status is not NORMAL or is in BLOCK_TABLET_IN state:Transfer先のログストリームがNORMAL状態ではない可能性があります。例えば、CREATINGまたはCREATEDなどの状態にあるか、ログストリームがBLOCK_TABLET_INされており、移行できない可能性があります。Table has beed dropped:Transfer対象のパーティションが属するテーブルが削除されました。Partition has beed dropped:Transfer対象のパーティションが削除されました。Partition is already in dest LS:パーティションは既にTransfer先に存在します。Need retry, partition may be dropped:Transferの実行時にパーティションが削除されたため、システムは次回ロードバランシングタスクを生成する際に、パーティションが存在するかどうか再度チェックします。Need retry, partition may be dropped or be transferre:Transferの実行時にパーティションが存在しなくなったため、パーティションが削除されたか、ソース側のログストリームには存在しない可能性があります。システムは次回ロードバランシングタスクを生成する際に、パーティションの存在を確認するか、Transferタスクを再生成する必要があります。
Transfer Partitionタスクの実行が成功した後、対応するパーティション情報を再度確認します。
obclient(root@mysql_tenant)[oceanbase]> SELECT TABLE_ID AS TABLE_ID, OBJECT_ID, TABLET_ID, LS_ID FROM oceanbase.DBA_OB_TABLE_LOCATIONS WHERE DATABASE_NAME = 'test' AND TABLE_NAME= 'tbl1_l' AND PARTITION_NAME = 'p1' LIMIT 1;クエリ結果は以下のとおりです:
+----------+-----------+-----------+-------+ | TABLE_ID | OBJECT_ID | TABLET_ID | LS_ID | +----------+-----------+-----------+-------+ | 500012 | 500014 | 200009 | 1003 | +----------+-----------+-----------+-------+ 1 row in set結果によると、
testライブラリのテーブルtbl1_lのp1パーティションは、以前の1001番ログストリームから1003番ログストリームに移行され、Transfer Partition操作が成功しました。
このドキュメントでは、テナント oracle_tenant を例に操作手順を説明します。
Oracleテナントのテナント管理者がデータベースに接続します。
接続例は以下のとおりです。データベースへの接続時は、実際の環境に準じてください。
obclient -h10.xx.xx.xx -P2883 -usys@oracle_tenant#obdemo -p***** -Aパーティション情報を確認します。
ビュー
DBA_OB_TABLE_LOCATIONSをクエリし、指定したパーティションのTABLET_ID、OBJECT_ID、LS_IDを取得します。非パーティションテーブルの
TABLET_ID、OBJECT_ID、LS_IDの取得oracle_tenantテナントに非パーティションテーブルT1が存在する場合、クエリ例は以下のとおりです:obclient(sys@oracle_tenant)[SYS]> SELECT TABLE_ID AS TABLE_ID, OBJECT_ID, TABLET_ID, LS_ID FROM SYS.DBA_OB_TABLE_LOCATIONS WHERE DATABASE_NAME = 'SYS' AND TABLE_NAME= 'T1' AND ROWNUM = 1;クエリ結果は以下のとおりです:
+----------+-----------+-----------+-------+ | TABLE_ID | OBJECT_ID | TABLET_ID | LS_ID | +----------+-----------+-----------+-------+ | 500002 | 500002 | 200001 | 1001 | +----------+-----------+-----------+-------+ 1 row in setパーティションテーブルの
TABLET_ID、OBJECT_ID、LS_IDの取得パーティションテーブルの場合、クエリ時には具体的なパーティション名を指定するだけで済みます。例:
oracle_tenantテナントにパーティションテーブルTBL1_LOG_Rが存在する場合を仮定します。obclient(sys@oracle_tenant)[SYS]> CREATE TABLE tbl1_log_r(log_id INT,log_date DATE NOT NULL DEFAULT SYSDATE) PARTITION BY RANGE(log_date) (PARTITION M202001 VALUES LESS THAN(TO_DATE('2020/02/01','YYYY/MM/DD')) , PARTITION M202002 VALUES LESS THAN(TO_DATE('2020/03/01','YYYY/MM/DD')) , PARTITION M202003 VALUES LESS THAN(TO_DATE('2020/04/01','YYYY/MM/DD')) , PARTITION M202004 VALUES LESS THAN(TO_DATE('2020/05/01','YYYY/MM/DD')) , PARTITION M202005 VALUES LESS THAN(TO_DATE('2020/06/01','YYYY/MM/DD')) , PARTITION M202006 VALUES LESS THAN(TO_DATE('2020/07/01','YYYY/MM/DD')) , PARTITION M202007 VALUES LESS THAN(TO_DATE('2020/08/01','YYYY/MM/DD')) , PARTITION M202008 VALUES LESS THAN(TO_DATE('2020/09/01','YYYY/MM/DD')) , PARTITION M202009 VALUES LESS THAN(TO_DATE('2020/10/01','YYYY/MM/DD')) , PARTITION M202010 VALUES LESS THAN(TO_DATE('2020/11/01','YYYY/MM/DD')) , PARTITION M202011 VALUES LESS THAN(TO_DATE('2020/12/01','YYYY/MM/DD')) , PARTITION M202012 VALUES LESS THAN(TO_DATE('2021/01/01','YYYY/MM/DD')) , PARTITION MMAX VALUES LESS THAN (MAXVALUE) );このパーティションテーブル内のパーティション
M202005に関する情報をクエリする例は以下のとおりです:obclient(sys@oracle_tenant)[SYS]> SELECT TABLE_ID AS TABLE_ID, OBJECT_ID, TABLET_ID, LS_ID FROM SYS.DBA_OB_TABLE_LOCATIONS WHERE DATABASE_NAME = 'SYS' AND TABLE_NAME= 'TBL1_LOG_R' AND PARTITION_NAME = 'M202005' AND ROWNUM = 1;クエリ結果は以下のとおりです:
+----------+-----------+-----------+-------+ | TABLE_ID | OBJECT_ID | TABLET_ID | LS_ID | +----------+-----------+-----------+-------+ | 500003 | 500009 | 200006 | 1002 | +----------+-----------+-----------+-------+ 1 row in setサブパーティションテーブルの
TABLET_ID、OBJECT_ID、LS_IDの取得サブパーティションテーブルの場合、クエリ時にはパーティション名とサブパーティション名の両方を指定する必要があります。
oracle_tenantテナントにサブパーティションテーブルT2_F_RLが存在する場合を仮定します。obclient(sys@oracle_tenant)[SYS]> CREATE TABLE t2_f_rl(col1 INT,col2 VARCHAR2(50)) PARTITION BY RANGE(col1) SUBPARTITION BY LIST(col2) (PARTITION p0 VALUES LESS THAN(100) (SUBPARTITION sp0 VALUES('01'), SUBPARTITION sp1 VALUES('02') ), PARTITION p1 VALUES LESS THAN(200) (SUBPARTITION sp2 VALUES('01'), SUBPARTITION sp3 VALUES('02'), SUBPARTITION sp4 VALUES('03') ) );このサブパーティションテーブル内のサブパーティション
SP2に関する情報をクエリする例は以下のとおりです:obclient(sys@oracle_tenant)[SYS]> SELECT TABLE_ID AS TABLE_ID, OBJECT_ID, TABLET_ID, LS_ID FROM SYS.DBA_OB_TABLE_LOCATIONS WHERE DATABASE_NAME = 'SYS' AND TABLE_NAME= 'T2_F_RL' AND PARTITION_NAME = 'P1' AND SUBPARTITION_NAME = 'SP2' AND ROWNUM = 1;クエリ結果は以下のとおりです:
+----------+-----------+-----------+-------+ | TABLE_ID | OBJECT_ID | TABLET_ID | LS_ID | +----------+-----------+-----------+-------+ | 500018 | 500023 | 200017 | 1003 | +----------+-----------+-----------+-------+ 1 row in set
Transfer先を選択します。
ビュー
DBA_OB_LSをクエリし、テナントのログストリームの状態と情報を取得します。obclient(sys@oracle_tenant)[SYS]> SELECT * FROM SYS.DBA_OB_LS;クエリ結果は以下のとおりです:
+-----------+-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+-----------+ | TENANT_ID | LS_ID | STATUS | PRIMARY_ZONE | UNIT_GROUP_ID | LS_GROUP_ID | CREATE_SCN | DROP_SCN | SYNC_SCN | READABLE_SCN | FLAG | UNIT_LIST | +-----------+-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+-----------+ | 1006 | 1 | NORMAL | zone1 | 0 | 0 | NULL | NULL | 1701244663685197789 | 1701244663685197789 | | | | 1006 | 1001 | NORMAL | zone1 | 0 | 1001 | 1701239786827662637 | NULL | 1701244663685197789 | 1701244663685197789 | | 1001 | | 1006 | 1002 | NORMAL | zone1 | 0 | 1002 | 1701239786831568305 | NULL | 1701244664066906860 | 1701244664066906859 | | 1002 | | 1006 | 1003 | NORMAL | zone1 | 0 | 1003 | 1701239786834300282 | NULL | 1701244664175263949 | 1701244664175263948 | | 1003 | +-----------+-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+-----------+ 4 rows in setビュー
DBA_OB_TABLET_TO_LSをクエリし、ログストリーム上のTabletの分布情報を取得します。obclient(sys@oracle_tenant)[SYS]> SELECT LS_ID, COUNT(*) AS C FROM SYS.DBA_OB_TABLET_TO_LS GROUP BY LS_ID;クエリ結果は以下のとおりです:
+-------+------+ | LS_ID | C | +-------+------+ | 1 | 578 | | 1001 | 7 | | 1002 | 5 | | 1003 | 7 | +-------+------+ 4 rows in set上記の情報に基づき、適切なログストリームをTransfer先として選択します。
以下のコマンドを実行して、Transfer Partition操作を実行します。
ALTER SYSTEM TRANSFER PARTITION TABLE_ID [=] table_id, OBJECT_ID [=] object_id TO LS ls_id;ここで:
table_id:テーブルID。object_id:パーティションの一意の識別子。ls_id:Transfer先のログストリームID。tenant_name:Transfer対象のパーティションが属するテナント。
テナント
oracle_tenant内のSYSライブラリのテーブルTBL1_LOG_RのM202005パーティションを、現在の1002番ログストリームから1003番ログストリームに移行する例を以下に示します。obclient(sys@oracle_tenant)[SYS]> ALTER SYSTEM TRANSFER PARTITION TABLE_ID = 500003, OBJECT_ID = 500009 TO LS 1003;Transfer Partitionコマンドの実行が成功した後、以下のビューでタスクの状態を確認できます。
ビュー
DBA_OB_TRANSFER_PARTITION_TASKSをクエリし、タスクのTASK_ID、TRANSFER_TASK_ID、BALANCE_JOB_IDを取得します。ビュー
DBA_OB_TRANSFER_PARTITION_TASKSは、現在処理中のTransfer Partitionタスクを表示します。クエリ例は以下のとおりです:obclient(sys@oracle_tenant)[SYS]> SELECT TASK_ID, BALANCE_JOB_ID, TRANSFER_TASK_ID, STATUS FROM SYS.DBA_OB_TRANSFER_PARTITION_TASKS WHERE TABLE_ID = 500003 AND OBJECT_ID = 500009;クエリ結果の例は以下のとおりです:
+---------+----------------+------------------+--------+ | TASK_ID | BALANCE_JOB_ID | TRANSFER_TASK_ID | STATUS | +---------+----------------+------------------+--------+ | 1 | 17304 | 1 | DOING | +---------+----------------+------------------+--------+ 1 row in setクエリ結果の
STATUS列の値に基づいてタスクの状態を確認し、タスクの実行進捗をさらに確認できます:WAITING: タスクが待機中で、まだスケジューリングが開始されていないことを示します。INIT: タスクがBALANCE_JOBを構築したことを示します。BALANCE_JOB_IDに基づいて、関連するBALANCE_JOBの実行進捗を確認できます。DOING: タスクがTransferの実行を開始したことを示します。TRANSFER_TASK_IDに基づいて、関連するTransfer Partitionタスクを確認できます。TRANSFER_TASK_IDは何度も変化し、1つのTransfer Partitionタスクには複数回のTransferが含まれることがあります。
ビュー
DBA_OB_TRANSFER_PARTITION_TASKSのクエリ結果が空の場合、ビューDBA_OB_TRANSFER_PARTITION_TASK_HISTORYを参照してタスク結果を確認できます。取得した
BALANCE_JOB_IDに基づいてビューDBA_OB_BALANCE_JOBSまたはDBA_OB_BALANCE_JOB_HISTORYをクエリし、関連するBALANCE_JOBの実行状態を確認します。ビュー
DBA_OB_BALANCE_JOBSは、現在このテナントで実行中のロードバランシング作業を表示します。各テナントは同時に1つのロードバランシング作業(BALANCE_JOB)しか持てません。各作業は複数のロードバランシングタスク(TRANSFER_TASK)を生成します。ビューDBA_OB_BALANCE_JOB_HISTORYは、このテナントで実行されたロードバランシング作業の履歴を表示します。クエリ例は以下のとおりです:obclient(sys@oracle_tenant)[SYS]> SELECT * FROM SYS.DBA_OB_BALANCE_JOBS WHERE JOB_ID = 17304;obclient(sys@oracle_tenant)[SYS]> SELECT * FROM SYS.DBA_OB_BALANCE_JOB_HISTORY WHERE JOB_ID = 17304;ここで、
17304は前のステップで取得したBALANCE_JOB_IDに置き換える必要があります。クエリ結果の
STATUS列はBALANCE_JOBの実行状態を示しています:DOING:ロードバランシング作業が実行中であることを示します。COMPLETED:ロードバランシング作業が正常に完了したことを示します。CANCELING:ロードバランシング作業がキャンセル中であることを示します。CANCELED:ロードバランシング作業がキャンセルされたことを示します。
取得した
TRANSFER_TASK_IDに基づいてビューDBA_OB_TRANSFER_TASKSまたはDBA_OB_TRANSFER_TASK_HISTORYをクエリし、タスクに関連するTRANSFER_TASKの実行状態を確認します。ビュー
DBA_OB_TRANSFER_TASKSは、現在このテナントで実行中のロードバランシングタスクを表示します。同時に複数のロードバランシングタスクが実行されている可能性がありますが、これらのタスク(TRANSFER_TASK)はすべて同一のロードバランシング作業(BALANCE_JOB)に属します。ビューDBA_OB_TRANSFER_TASK_HISTORYは、このテナントで実行されたロードバランシングタスクの履歴を表示します。クエリ例は以下のとおりです:obclient [SYS]> SELECT * FROM SYS.DBA_OB_TRANSFER_TASKS WHERE TASK_ID = 1;obclient [SYS]> SELECT * FROM SYS.DBA_OB_TRANSFER_TASK_HISTORY WHERE TASK_ID = 1;ここで、
1は前の手順で取得したTRANSFER_TASK_IDに置き換える必要があります。クエリ結果の
STATUS列はTRANSFER_TASKの実行状態を示しています:INIT:タスクの作成中であることを示します。START:Transferの実行開始を示します。DOING:Transferの実行中であることを示します。ABORTED:Transferタスクの実行に失敗し、タスクが終了したことを示します。COMPLETED:Transferタスクの実行が成功したことを示します。FAILED:Transferタスクの実行に失敗したことを示します。CANCELED:Transferタスクがキャンセルされたことを示します。
取得した
TASK_IDに基づいてビューDBA_OB_TRANSFER_PARTITION_TASK_HISTORYをクエリし、Transfer Partitionタスクの結果を確認します。ビュー
DBA_OB_TRANSFER_PARTITION_TASK_HISTORYは、このテナントで実行されたTransfer Partitionタスクの履歴を表示します。クエリ例は以下のとおりです:obclient(sys@oracle_tenant)[SYS]> SELECT * FROM SYS.DBA_OB_TRANSFER_PARTITION_TASK_HISTORY WHERE TASK_ID = 1;ここで、
1は前の手順で取得したTASK_IDに置き換える必要があります。クエリ結果の
STATUS列は Transfer Partitionタスクの結果を示しています:COMPLETED:Transfer Partitionタスクの実行が成功したことを示します。FAILED:Transfer Partitionタスクの実行に失敗したことを示します。COMMENT列を確認することで、タスク失敗の原因をさらに特定できます。COMMENT列によく見られる情報は以下のとおりです:LS not exist or may be in DROPPING/WAIT_OFFLINE status:Transfer先のログストリームが存在しないか、DROPPING、WAITOFFLINEの状態にある可能性があります。LS status is not NORMAL or is in BLOCK_TABLET_IN state:Transfer先のログストリームがNORMAL状態ではない可能性があります。例えば、CREATINGまたはCREATEDなどの状態にあるか、ログストリームがBLOCK_TABLET_INされており、移行できない可能性があります。Table has beed dropped:Transfer対象のパーティションが属するテーブルが削除されました。Partition has beed dropped:Transfer対象のパーティションが削除されました。Partition is already in dest LS:パーティションは既にTransfer先に存在します。Need retry, partition may be dropped:Transfer実行時にパーティションが削除された場合、システムは次回ロードバランシングタスクを生成する際に、パーティションが存在するかどうか再確認します。Need retry, partition may be dropped or be transferre:Transfer実行時にパーティションが存在しない場合、パーティションが削除されたか、ソース側のログストリームにない可能性があります。システムは次回ロードバランシングタスクを生成する際に、パーティションの存在を確認するか、Transferタスクを再生成する必要があります。
Transfer Partitionタスクの実行が成功した後、対応するパーティション情報を再度確認します。
obclient(sys@oracle_tenant)[SYS]> SELECT TABLE_ID AS TABLE_ID, OBJECT_ID, TABLET_ID, LS_ID FROM SYS.DBA_OB_TABLE_LOCATIONS WHERE DATABASE_NAME = 'SYS' AND TABLE_NAME= 'T2_F_RL' AND PARTITION_NAME = 'P1' AND SUBPARTITION_NAME = 'SP2' AND ROWNUM = 1;クエリ結果は以下のとおりです:
+----------+-----------+-----------+-------+ | TABLE_ID | OBJECT_ID | TABLET_ID | LS_ID | +----------+-----------+-----------+-------+ | 500003 | 500009 | 200006 | 1003 | +----------+-----------+-----------+-------+ 1 row in set結果によると、
SYSライブラリのテーブルTBL1_LOG_RのM202005パーティションは、以前の1002番ログストリームから1003番ログストリームに移行され、Transfer Partition操作が成功しました。