説明
ALTER SYSTEM TRANSFER PARTITION ステートメントは、指定されたパーティションを指定されたログストリームに移行するために使用します。
使用制限と注意事項
パーティションの移行操作はプライマリテナントでのみ実行でき、かつユーザーテナント内のパーティションに対してのみ可能です。
テナントの移行機能を無効にした場合(つまり、テナントの構成パラメータ
enable_transferの値がfalseの場合)、そのテナントでTRANSFER PARTITIONステートメントを実行するとエラーが発生します。既に実行済みのTRANSFER PARTITIONステートメントについては、対応するパーティション移行タスクがキャンセルされる可能性があります。システムテーブルに対してパーティション移行操作を実行することはできません。
システムテナント内のユーザーテーブルに対してパーティション移行操作を実行することはできません。
通常テーブルをブロードキャストログストリームに移行することはできず、レプリケーションテーブルを通常ログストリームに移行することもできません。
非独立パーティションの移行はサポートされていません。例えば、ローカルインデックステーブルのパーティションやLOBテーブルのパーティションは移行できません。
同一のパーティションに対して、パーティション移行操作が完了する前に再度パーティション移行操作を開始することはできません。
現在のクラスタで既にバランスタスク(BALANCE_JOB)が処理中の場合、手動でトリガーされたパーティション移行タスクはすぐにスケジューリングを開始しません。
権限要件
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']
パラメータ説明
パラメータ |
説明 |
|---|---|
| $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を照会することで、指定したパーティションのTABLE_ID、OBJECT_ID、LS_IDを取得できます。非パーティションテーブルの
TABLE_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パーティションテーブルの
TABLE_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セカンダリパーティションテーブルの
TABLE_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 | 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 [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の実行進捗を確認できます。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操作が成功しました。
関連ドキュメント
Transfer Partitionの詳細な操作と説明については、Transfer Partitionを参照してください。