説明
ALTER SYSTEM RECOVER TABLE ステートメントは、テーブルデータの復元に使用されます。つまり、バックアップデータからユーザーが指定したテーブルを既存のテナントに復元します。この既存のテナントは、元のテーブルが存在するテナントと同じでも異なるテナントでも、さらには異なるクラスタでもかまいません。
使用上の制限と注意事項
テーブルの復元時には、ユーザーテーブルのみを復元でき、一時テーブル、ビュー、インデックスなどを個別に復元することはサポートされていません。
テーブルの復元時には、テーブル上の外部キー、トリガー、統計情報などは復元されません。
テーブルの復元時には、復元対象のテーブルのソーステナントとターゲットテナントの互換性が一致している必要があります。例えば、どちらもOracle互換テナント、またはどちらもMySQL互換テナントである必要があります。
テナントの復元と同様に、テーブルの復元も現在は、低バージョンのバックアップデータから同じバージョンまたは高いバージョンへのテーブル復元のみをサポートしており、同じバージョン内のマイナーバージョン間での逆方向復元もサポートされていません。
テーブルを復元する際、指定するテーブル名はシステムが実際に格納しているテーブル名と一致している必要があります。例えば、Oracleモードのテナントでtestというテーブルを作成した場合、システム内部で実際に格納されるテーブル名はTESTです。そのため、テーブルを復元する際にはテーブル名としてTESTを指定する必要があります。そうでない場合、システムはエラーを返し、テーブルが存在しないことを示します。
ALTER SYSTEM RECOVER TABLEステートメントを使用してテーブルを復元するプロセスでは、補助テナントを使用する必要があります。そのため、ステートメントを実行する前に、ターゲットテナントが存在するクラスタ内で補助テナント用の必要なリソースプールが作成されていることを確認してください。補助テナント用の必要なリソースプールを作成する詳細な操作については、テーブル復元前の準備を参照してください。
権限要件
ALTER SYSTEM RECOVER TABLE ステートメントを実行できるのは、sys テナントの root ユーザー(root@sys)のみです。
構文
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'です。補助テナントが使用するリソースプールはrecover_tmp_pool、プライマリゾーンは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