説明
ALTER SYSTEM RECOVER TABLE ステートメントは、テーブルデータの復旧に使用されます。これは、バックアップデータからユーザーが指定したテーブルを既存のテナントに復元することです。この既存のテナントは、元のテーブルが属していたテナントと同一であってもよく、または異なるテナント、さらには異なるクラスタであっても構いません。
制限事項と注意点
テーブルの復旧時には、ユーザーテーブルのみを復旧でき、一時テーブル、ビュー、インデックスなどの個別復旧はサポートされていません。
テーブルの復旧時には、テーブル上の外部キー、トリガー、統計情報などの復旧はサポートされていません。
テーブルの復旧時には、復旧対象のテーブルのソーステナントとターゲットテナントの互換性が一致している必要があります。例えば、どちらもOracle互換テナント、またはどちらもMySQL互換テナントである必要があります。
テナントの復旧と同様に、現在のところテーブルの復旧も、低バージョンのバックアップデータから同一バージョンまたはそれ以上のバージョンへの復旧のみをサポートしており、同一バージョン内のマイナーバージョン間での逆方向復旧はサポートされていません。
テーブルの復旧時には、指定されたテーブル名がシステムに実際に保存されているテーブル名と一致している必要があります。例えば、Oracleモードのテナントでtestという名前のテーブルを作成した場合、システム内部で実際に保存されているテーブル名はTESTとなります。そのため、テーブルを復旧する際にはテーブル名としてTESTを指定する必要があります。そうしないと、システムはエラーを報告し、テーブルが存在しないことを示します。
ALTER SYSTEM RECOVER TABLEステートメントを使用してテーブルを復旧する際には、補助テナントを使用する必要があります。そのため、ステートメントを実行する前に、ターゲットテナントが属するクラスタ内で補助テナント用の必要なリソースプールが作成されていることを確認してください。補助テナント用の必要なリソースプールを作成する詳細な手順については、テーブルレベルの復旧前の準備を参照してください。
権限要件
sys テナントの root ユーザー (root@sys) のみが ALTER SYSTEM RECOVER TABLE ステートメントを実行できます。
構文
ALTER SYSTEM
RECOVER TABLE table_name_list
TO [TENANT [=]] dest_tenant_name
FROM uri [ UNTIL {TIME ='timestamp'}| {SCN = scn} ]
WITH 'restore_option' [WITH KEY FROM 'backup_key_path' ENCRYPTED BY 'password']
[REMAP TABLE remap_table_name_list]
[REMAP TABLEGROUP remap_tablegroup_list]
[REMAP TABLESPACE remap_tablespace_list]
[DESCRIPTION [=] description];
table_name_list:
database_name.table_name [, database_name.table_name ...]
remap_table_name_list:
/* データベース名は変更せず、テーブル名のみを変更 */
database_name.old_table_name:new_table_name
/* テーブル名は変更せず、データベース名のみを変更 */
|old_database_name.table_name:new_database_name.table_name
/* データベース名とテーブル名を同時に変更 */
| old_database_name.old_table_name:new_database_name.new_table_name
/* ソースデータベースのすべてのテーブルを新しいデータベースに復旧 */
| old_database_name.`*`:new_database_name.`*`
remap_tablegroup_list:
old_tablegroup_name:new_tablegroup_name
remap_tablespace_list:
old_tablespace_name:new_tablespace_name
パラメータの説明
| パラメータ | 説明 |
|---|---|
| table_name_list | 復元するテーブルを指定します。書式は database_name.table_name1,database_name.table_name2,... のようになります。複数のテーブル間は、英字のカンマ(,)で区切ります。
|
| dest_tenant_name | テーブルレベルの復元先のテナントを指定します。現在のバージョンでは、ユーザーテナントのみを指定できます。 |
| uri | データバックアップおよびログアーカイブを転送するパスを指定します。データバックアップが PLUS ARCHIVELOG 方式で開始された場合は、パスを1つだけ入力する必要があります。それ以外の場合は、データバックアップとログアーカイブのパスをそれぞれ入力する必要があります(少なくとも2つ)。例えば、'file:///backup/archive, file:///backup/data' となります。データバックアップ方式の詳細については、データバックアップコマンド BACKUPを参照してください。 |
| UNTIL | 復元の終了ポイントを指定します。このポイントまで復元し、そのポイントも含みます。TIMEまたはSCNに復元する場合は、指定値を = で結合する必要があります。UNTIL 句を指定しない場合、デフォルトでは最新のポイントまで復元されます。
|
| restore_option | ヘルパーテナントの pool_list、locality、primary_zone、concurrency を指定します。異なるパラメータ間は & で区切ります:
|
| WITH KEY FROM 'backup_key_path' ENCRYPTED BY 'password' | 暗号化テナントの秘密鍵バックアップ情報を指定します。オプションです。ソーステナントに透過的暗号化が設定されている場合にのみ、復元時に秘密鍵バックアップ関連情報を指定する必要があります。その中で:
|
| REMAP | マッピング関係を指定します。REMAP を指定しない場合、ターゲットテーブルを元のテーブルと同じTableSpace->Table Group->DataBaseに配置しようとします。 |
| remap_table_name_list | 復元後のテーブル名をリネームします。テーブル名のみをリネームし、テーブルが属するデータベースは変更しないことも可能です。また、テーブル名を変更せずに他のデータベースにのみリネームすることも可能です。さらに、テーブル名をリネームすると同時に、所属するデータベースも別のデータベースにリネームすることも可能です。ソースオブジェクトとリネーム対象オブジェクトの間は、英字のコロン(:)で結びます。 |
| remap_tablegroup_list | テーブルが属するテーブルグループをリネームします。ソーステーブルがテーブルグループにバインドされている場合、ターゲットテナントに復元してテーブルを作成する際、システムはデフォルトでテーブルをターゲットテナント内の同名のテーブルグループに復元します。同名のテーブルグループが存在しない場合、テーブルの復元は失敗します。ターゲットテナント内に他のテーブルグループがある場合、このステートメントを使用してテーブルを他のテーブルグループに復元することも可能です。ソースオブジェクトとリネーム対象オブジェクトの間は、英字のコロン(:)で結びます。 |
| remap_tablespace_list | テーブルが属するテーブルスペースをリネームします。テーブルスペースはOceanBaseデータベースにおける論理的な単位であり、現在は主にデータ暗号化に使用されています。ソーステーブルがテーブルスペースにバインドされている場合、ターゲットテナントに復元してテーブルを作成する際、システムはデフォルトでテーブルをターゲットテナント内の同名のテーブルスペースに復元します。同名のテーブルスペースが存在しない場合、テーブルの復元は失敗します。ターゲットテナント内に他のテーブルスペースがある場合、このステートメントを使用してテーブルを他のテーブルスペースに復元することも可能です。ソースオブジェクトとリネーム対象オブジェクトの間は、英字のコロン(:)で結びます。 |
| description | この操作の説明情報を指定します。オプションです。 |
例
MySQLモードのテナントobtのデータベースtestに設定されているデータバックアップパスは'file:///data/backup/data'、ログアーカイブのパスは'file:///data/backup/archive'であり、ログアーカイブ機能は有効になっており、フルデータバックアップも完了しています。作業中に誤ってstudentテーブルを削除した場合、以下の例ではテーブルレベルの復旧機能を使用して、特定のテナントのtest.studentテーブルを時点'2023-08-21 19:47:20'に復旧し、student_recoverという名前に変更します。
sysテナントで、テーブルレベルの復旧処理に必要なリソースを作成します。この例では、4c4g仕様のリソースプールを作成します。リソースユニットを作成します。
obclient [oceanbase]> CREATE RESOURCE UNIT recover_4c5g MAX_CPU 4, MEMORY_SIZE = '5G', MAX_IOPS 1024, MIN_IOPS=1024;リソースプールを作成します。
obclient [oceanbase]> CREATE RESOURCE POOL recover_tmp_pool UNIT = 'recover_4c5g', UNIT_NUM = 1, ZONE_LIST = ('z1','z2','z3');
studentテーブルをターゲットテナントobtのtestデータベースに復旧し、student_recoverという名前に変更します。使用するデータバックアップパスはfile:///data/backup/data、アーカイブログパスはfile:///data/backup/archive、復旧時点は'2023-08-21 19:47:20'です。補助テナントが使用するResource Poolはrecover_tmp_pool、Primary Zoneはz1です。obclient [oceanbase]> ALTER SYSTEM RECOVER TABLE test.student TO TENANT obt FROM 'file:///data/backup/data,file:///data/backup/archive' UNTIL TIME='2023-08-21 19:47:20' WITH 'pool_list=recover_tmp_pool&primary_zone=z1' REMAP TABLE test.student:student_recover;テーブルレベルの復旧コマンドの実行が成功した後、
CDB_OB_RECOVER_TABLE_JOBSビューを使用して復旧進捗状況を確認できます。STATUS列は復旧段階を示し、RESTORE_AUX_TENANTは補助テナントの復旧中を意味します。obclient [oceanbase]> SELECT * FROM oceanbase.DBA_OB_RECOVER_TABLE_JOBS\Gクエリ結果は次のとおりです:
*************************** 1. row *************************** TENANT_ID: 1 JOB_ID: 2 INITIATOR_TENANT_ID: 1 INITIATOR_JOB_ID: 2 START_TIMESTAMP: 2023-08-21 19:54:25 END_TIMESTAMP: 1970-01-01 08:00:00 STATUS: RESTORE_AUX_TENANT AUX_TENANT_NAME: AUX_RECOVER$1692618864733548 TARGET_TENANT_NAME: OBT IMPORT_ALL: 0 DB_LIST: NULL TABLE_LIST: `TEST`.`STUDENT` RESTORE_SCN: 1692618440000000000 RESTORE_SCN_DISPLAY: 21-AUG-23 07.47.20.000000000 PM RESTORE_OPTION: pool_list=RECOVER_TMP_POOL&primary_zone=z1 BACKUP_DEST: file:///data/backup/data,file:///data/backup/archive BACKUP_SET_LIST: file:///data/backup/data/backup_set_1_full BACKUP_PIECE_LIST: file:///data/backup/archive/piece_d1002r1p1 BACKUP_PASSWD: NULL EXTERNAL_KMS_INFO: NULL REMAP_DB_LIST: NULL REMAP_TABLE_LIST: `TEST`.`STUDENT`:`TEST`.`STUDENT_RECOVER` REMAP_TABLEGROUP_LIST: NULL REMAP_TABLESPACE_LIST: NULL RESULT: SUCCEESS COMMENT: NULL DESCRIPTION: NULL