説明
ALTER SYSTEM TRANSFER PARTITION ステートメントは、指定されたパーティションを指定されたログストリームに移行するために使用されます。
権限要件
ALTER SYSTEM TRANSFER PARTITION ステートメントを実行するには、現在のユーザーが ALTER SYSTEM 権限を持っている必要があります。OceanBaseデータベースの権限の詳細については、MySQLモードの権限分類およびOracleモードの権限分類を参照してください。
構文
ALTER SYSTEM TRANSFER PARTITION TABLE_ID [=] $table_id, OBJECT_ID [=] $object_id TO LS $ls_id [tenant = '$tenant_name']
制限事項と注意点
パーティションの移行操作はプライマリテナントでのみ実行でき、かつユーザーテナント内のパーティションのみを移行できます。
テナントの移行機能を無効にした場合(つまり、テナントの構成パラメータ
enable_transferの値がfalseの場合)、そのテナントに対してTRANSFER PARTITIONステートメントを実行するとエラーが発生します。また、すでに正常に実行されたTRANSFER PARTITIONステートメントに対応するパーティション移行タスクはキャンセルされる可能性があります。システムテーブルに対するパーティション移行操作はサポートされていません。
システムテナント内のユーザーテーブルに対するパーティション移行操作はサポートされていません。
通常のテーブルをブロードキャストログストリームに移行することはできず、複製テーブルを通常のログストリームに移行することもできません。
独立したパーティション以外のパーティションの移行はサポートされていません。例えば、部分インデックステーブルのパーティションやLOBテーブルのパーティションは移行できません。
同一のパーティションに対して、パーティション移行操作が完了する前に再度パーティション移行操作を開始することは許可されていません。
現在のクラスタで既にバランスジョブ(BALANCE_JOB)が処理中の場合、手動でトリガーされたパーティション移行タスクは直ちにスケジューリングを開始しません。
パラメータの説明
| パラメータ | 説明 |
|---|---|
| $table_id | 移行対象のパーティションテーブルのテーブルID。 |
| $object_id | 移行対象のパーティションテーブルの一意識別子で、整数型をサポートします。 |
| $ls_id | Transfer Partitionの宛先側のログストリームID。 |
| $tenant_name | テナント名。システムテナントでこのSQL文を実行する場合は、テナント名を指定する必要があります。 |
例
rootユーザーでクラスタのsysテナントにログインします。接続例は以下のとおりですが、データベースへの接続時は実際の環境に基づいてください。
obclient -h10.xx.xx.xx -P2883 -uroot@sys#obdemo -p***** -Aビュー
DBA_OB_TENANTSを照会し、対象テナントのTENANT_IDを取得します。obclient [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を照会することで、指定されたパーティションのTABLET_ID、OBJECT_ID、およびLS_IDを取得できます。パーティション化されていないテーブルの
TABLET_ID、OBJECT_ID、およびLS_IDを取得するoracle_tenantテナントにパーティション化されていないテーブルT1が存在すると仮定した場合、クエリ例は次のとおりです:obclient [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パーティションテーブルの
TABLET_ID、OBJECT_ID、およびLS_IDを取得するパーティションテーブルの場合、クエリ時には具体的なパーティション名のみを指定する必要があります。
oracle_tenantテナントにパーティションテーブルTBL1_LOG_Rが存在すると仮定します。obclient [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 [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サブパーティションテーブルの
TABLET_ID、OBJECT_ID、およびLS_IDを取得するサブパーティションテーブルの場合、クエリ時にはパーティション名とサブパーティション名の両方を指定する必要があります。
oracle_tenantテナントにサブパーティションテーブルT2_F_RLが存在すると仮定します。obclient [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 [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
Transfer先を選択します。
ビュー
CDB_OB_LSを照会して、テナントのログストリームの状態と情報を取得します。obclient [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 | +-----------+-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+ | 1006 | 1 | NORMAL | zone1 | 0 | 0 | NULL | NULL | 1701244663685197789 | 1701244663685197789 | | | 1006 | 1001 | NORMAL | zone1 | 1006 | 1001 | 1701239786827662637 | NULL | 1701244663685197789 | 1701244663685197789 | | | 1006 | 1002 | NORMAL | zone1 | 1007 | 1002 | 1701239786831568305 | NULL | 1701244664066906860 | 1701244664066906859 | | | 1006 | 1003 | NORMAL | zone1 | 1008 | 1003 | 1701239786834300282 | NULL | 1701244664175263949 | 1701244664175263948 | | +-----------+-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+ 4 rows in setビュー
CDB_OB_TABLET_TO_LSを照会して、ログストリーム上のTabletの分布情報を取得します。obclient [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:Transfer対象のパーティションが属するテナント。
テナント
oracle_tenantを例にとると、そのSYSデータベース内のテーブルTBL1_LOG_RのM202005パーティションを、現在の1002番のログストリームから1003番のログストリームに移行する例は次のとおりです。obclient [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 [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_IDを構築したことを示します。BALANCE_JOB_IDに基づいて、関連するBALANCE_JOB_IDの実行進捗を確認できます。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 [oceanbase]> SELECT * FROM oceanbase.CDB_OB_BALANCE_JOBS WHERE JOB_ID = 17304;obclient [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 [oceanbase]> SELECT * FROM oceanbase.CDB_OB_TRANSFER_TASKS WHERE TASK_ID = 1;obclient [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 [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列を参照して、タスクの失敗原因をさらに確認できます。
Transfer Partitionタスクの実行が成功した後、対応するパーティション情報を再度確認します。
obclient [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操作は成功しました。