説明
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