OceanBase表级物理恢复
OceanBase表级物理恢复
- 使用限制
- 创建资源池
- 表恢复
- 查看恢复进度
- 查看表级恢复进度
- 查看辅助租户恢复任务的进度
- 查看目标租户导入任务的进度
- 查看历史恢复结果
- 查看表级恢复任务的整体执行结果
- 查看跨租户导表任务的整体执行结果
- 查看每张表的执行结果
- 数据库版本:V4.2.5
- 本文中的所有操作都需要在sys租户下进行。
OceanBase数据库的表级恢复功能是通过从备份数据中将用户指定的表恢复到一个已存在的租户中来实现的,并且该已存在的租户与原表所在的租户可以是同一个租户,也可以是同一集群中的不同租户,还可以是不同集群中的租户。
表级恢复功能的整体流程如下:
物理恢复出辅助租户。通过备份和归档数据恢复出辅助租户到指定的时间位点。
跨租户导表。将指定表的结构和数据及其关联的索引等Schema从辅助租户导入到目标租户。
清理辅助租户,释放占用的计算与存储资源。辅助租户在表级恢复过程中扮演的角色类似于Oracle数据库所使用的Auxiliary Instance,是表恢复过程中需要消耗的额外的计算存储资源。
使用限制
仅支持恢复用户表,不支持单独恢复临时表、视图、索引等。
表恢复的源租户与目标租户的兼容性必须一致,例如,均为Oracle兼容性租户,或者均为MySQL兼容性租户。
恢复表时,指定的表名需要与系统实际存储的表名一致。例如,Oracle模式租户下创建表
test,而系统内部实际存储的表名为TEST,故在恢复表时需要指定表名为TEST,否则系统会报错,提示表不存在。与租户级恢复支持的备份数据版本一样,表级恢复当前也是仅支持将低版本的备份数据中的表恢复到同版本或高版本中,同版本下的小版本之间也不支持逆向恢复。
表级恢复除了恢复表,与该表相关联的很多信息也会被恢复,但仍有部分信息不恢复。
- Database:不可恢复。表恢复时需要目标Database已存在,或者通过
REMAP TABLE恢复到其他数据库。 - Tablespace:不可恢复。表恢复时需要目标Tablespace已存在,或者通过
REMAP TABLESPACE恢复到其他表空间。 - Tablegroup:不可恢复。表恢复时需要目标Tablegroup已存在,或者通过
REMAP TABLEGROUP恢复到其他表组。 - 同义词/视图/函数/存储过程:不可恢复。恢复表时,不会恢复该表相关联的同义词、视图、函数、存储过程。
- 表分区:可恢复。
- Tablet:可恢复。
- 表约束:仅支持恢复NOT NULL、UNIQUE KEY、PRIMARY KEY、CHECK约束。
- 外键:可恢复。恢复外键的过程中,系统会检查外键约束的完整性。如果检查到存在外键引用不存在的行,则该外键将会恢复失败。
- 全局/局部索引:可恢复。
- 统计信息:可恢复。
- 空间索引:可恢复。
- LOB大对象:可恢复。
- 触发器:可恢复。
- 如果表按原始表名进行恢复,则恢复时会恢复该表关联的触发器。
- 对于Oracle模式,如果触发器所在的用户不存在,则该触发器会恢复失败。
- 对于MySQL模式,如果触发器所在的Database不存在,则该触发器会恢复失败。
- 如果对表进行了重命名,即按新的表名进行恢复,则不恢复该表关联的触发器。
- 如果表按原始表名进行恢复,则恢复时会恢复该表关联的触发器。
创建资源池
在进行表恢复前,需要在目标租户所在的集群内为辅助租户创建所需的资源池。
建议辅助租户的规格与源租户保持一致。如果无法与源租户保持一致,则辅助租户的最小规格要求如下:
- CPU:2C或4C。
- 内存:与Tablet数量有关,最小规格需要至少满足1GB。
- 磁盘:最小规格推荐至少要设置为备份数据量与恢复日志量的和。
创建辅助租户的资源池:
CREATERESOURCE UNIT box_16c96g MAX_CPU16,MEMORY_SIZE='5G',MAX_IOPS10240,MIN_IOPS=10240;CREATERESOURCE POOL restore_pool unit='box_16c96g',unit_num=1,zone_list=('z1','z2','z3');为辅助租户创建资源池时,建议尽量与源租户保持同构,即建议辅助租户的资源池中unit_num的个数与源租户相同。
表恢复
- 如果在备份时设置了密码,那么在恢复前也需要设置恢复密码:
SETDECRYPTION IDENTIFIEDBY'******';- 可以在表恢复前设置并行度(可选)。
- 单表恢复时可以通过配置项
recover_table_dop设置并发度。默认值为0,表示默认并行度为1。
ALTERSYSTEMSETrecover_table_dop=INT_VALUE tenant=tenant_name;- 多表恢复时可以通过配置项
recover_table_concurrency设置并发度。默认值为0,表示默认允许1个表执行跨租户导表。
ALTERSYSTEMSETrecover_table_concurrency=INT_VALUE tenant=tenant_name;- 设置租户每个observer节点上的主表数据恢复工作线程数。
在设置单表并行度recover_table_dop和多表并行度recover_table_concurrency之后,也可以通过ddl_thread_score配置项设置租户每个observer节点补数据工作线程数。ddl_thread_score的默认值为0,表示默认线程数为2。
ALTERSYSTEMSETddl_thread_score=INT_VALUE tenant=tenant_name;⚠️ 表级恢复结束后,建议还原
ddl_thread_score、recover_table_concurrency和recover_table_dop配置项设置。
- 进行表级别物理恢复。
ALTERSYSTEM RECOVERTABLEtable_name_listTO[TENANT[=]]dest_tenant_nameFROMuri[UNTIL {TIME='timestamp'}|{SCN=scn}]WITH'restore_option'[WITHKEYFROM'backup_key_path'ENCRYPTEDBY'password'][REMAPTABLEremap_table_name_list][REMAP TABLEGROUP remap_tablegroup_list][REMAPTABLESPACEremap_tablespace_list][DESCRIPTION[=]description];📖重要参数说明:
table_name_list:需要恢复的表清单。例如dbname1.tablename1。多个表使用英文逗号分隔。dbname1.*表示恢复对应数据库下的所有表。如果含有特殊字符需要包含在反引号内。dest_tenant_name:要恢复表数据到的目标租户名。FROM uri:分别指定数据备份和日志归档的路径,与租户级物理恢复命令的参数一样。UNTIL TIME='timestamp'|SCN=scn:指定的恢复终点,恢复到该位点位置,且包含该位点。如果不指定UNTIL子句,则默认恢复到最新的位点。restore_option:pool_list:(必选)为辅助租户创建的资源池。多个资源池之间用英文逗号分隔。locality:(可选)指定辅助租户副本分布的Locality信息,需要与辅助租户所在集群的pool_list的Zone信息相匹配。primary_zone:(可选)指定辅助租户的Leader副本的偏好位置,需要与pool_list及locality相匹配,即需要满足Zone信息匹配以及primary_region内至少有两个Paxos成员等限制。concurrency:(可选)指定表级恢复物理恢复阶段的并发度。如果不显式指定,则默认等于该租户被分配的MAX_CPU数。
WITH KEY FROM 'backup_key_path' ENCRYPTED BY 'password':指定加密租户的秘钥备份信息。仅当源租户配置了透明加密,才需要在恢复时指定秘钥备份相关的信息。remap_table_name_list:重命名恢复后的表名。支持重命名Database和表名。
REMAPTABLEinfodb.tbl1:newtbl--重命名表名REMAPTABLEinfodb.tbl1:destdb.tbl--恢复到不同的DatabaseREMAPTABLEinfodb.tbl1:destdb.newtbl--重命名表,并恢复到不同的DatabaseREMAPTABLEinfodb.*:destdb.*--把infodb下的所有表都恢复到destdb下remap_tablegroup_list:重命名表所属的表组。如果源表绑定了表组,则在恢复到目标租户创建表时,系统默认会将表恢复到目标租户中同名的表组,如果同名的表组不存在,表恢复就会失败。如果目标租户中有其他表组,可以将表通过该语句恢复到其他表组中。
--将源表组tg1中的表全部恢复到目标租户的表组newtg1中REMAP TABLEGROUP tg1:newtg1remap_tablespace_list:重命名表所属的表空间。如果源表绑定了表空间,则在恢复到目标租户创建表时,系统默认会将表恢复到目标租户中同名的表空间,如果同名的表空间不存在,表恢复就会失败。如果目标租户中有其他表空间,也可以将表通过该语句恢复到其他表空间中。
--将源表空间ts1中的表全部恢复到目标租户的表空间newts1中REMAPTABLESPACEts1:newts1示例:
ALTERSYSTEM RECOVERTABLEinfodb.tbl1,infodb.tbl2TOTENANT oracle001FROM'file:///data/nfs/backup/data,file:///data/nfs/backup/archive'UNTILTIME='2023-09-30 00:00:00'WITH'pool_list=restore_pool'REMAPTABLEinfodb.tbl1:newtbl REMAP TABLEGROUP tg1:newtg1 REMAPTABLESPACEts1:newts1;表数据恢复成功即表示表恢复成功,允许索引、约束或其他关联的Schema恢复失败。
在恢复过程中,也可以取消对应租户下的所有表级恢复任务:
ALTERSYSTEM CANCEL RECOVERTABLEdest_tenant_name;- 表恢复结束后,需要手动释放为辅助租户创建的资源池。
DROPRESOURCE POOL restore_pool;查看恢复进度
查看表级恢复进度
SELECT*FROMoceanbase.CDB_OB_RECOVER_TABLE_JOBS\G表级恢复的整个过程包括辅助租户的恢复操作和跨租户的导入操作。视图CDB_OB_RECOVER_TABLE_JOBS中对应两条任务记录:一条sys租户的任务记录和一条目标用户租户自身的任务记录。其中:
- sys租户的任务记录主要记录目标用户租户的表级恢复的进度。当目标租户的整个表级恢复任务结束,则表示该任务结束。
- 目标用户租户自身的任务记录包括辅助租户的恢复进度和表导入任务的进度。当辅助租户的恢复任务和表的导入任务均结束,则表示该任务结束。
📖重要字段:
TENANT_ID:当前执行恢复任务的租户的ID。INITIATOR_TENANT_ID:用于标识源租户的租户ID。AUX_TENANT_NAME:辅助租户名。TARGET_TENANT_NAME:目标租户名。TABLE_LIST:需要恢复的表。RESULT:任务完成的结果。SUCCESS表示成功,FAIL表示失败。STATUS:恢复任务的状态。PREPARE:任务初始化阶段RECOVERING:等待目标租户完成恢复中,仅sys租户会显示该状态RESTORE_AUX_TENANT:恢复辅助租户PRECHECK_IMPORT:导入前检查GEN_IMPORT_JOB:导入任务初始化IMPORTING:表导入中CANCELING:任务取消中COMPLETED:任务完成FAILED:任务失败
⭐️ 表级恢复未完成前,可以根据表级恢复所处的阶段,查看辅助租户恢复任务的进度和目标租户导入任务的进度。
查看辅助租户恢复任务的进度
辅助租户的恢复与租户级的物理恢复过程一致。
SELECT*FROMoceanbase.CDB_OB_RESTORE_PROGRESS\G一次租户恢复对应两条任务记录: sys租户的任务记录和被恢复租户的任务记录。在恢复期间,主要关注恢复进度视图中的status字段:
系统租户:
CREATE_TENANT: 创建租户,此阶段系统租户创建被恢复租户。租户创建完成,状态变更为WAIT_TENANT_RESTORE_FINISH;创建失败,则变更为RESTORE_FAIL。WAIT_TENANT_RESTORE_FINISH: 等待被恢复租户的恢复结束。租户恢复完成,状态变更为RESTORE_SUCCESS;恢复失败,则变更为RESTORE_FAIL。RESTORE_SUCCESS: 恢复租户成功。RESTORE_FAIL: 恢复租户失败。
被恢复租户:
RESTORING: 租户数据恢复中。恢复完成,状态会变更为 RESTORE_SUCCESS;如果恢复失败,状态会变更为 RESTORE_FAIL。RESTORE_SUCCESS: 恢复成功。RESTORE_FAIL: 恢复失败。
查看目标租户导入任务的进度
查看跨租户导入表任务的Job子任务:
SELECT*FROMoceanbase.CDB_OB_IMPORT_TABLE_JOBS\G📖重要字段:
JOB_ID:当前任务的JOB_ID。TABLE_LIST:需要导入的表清单。REMAP_TABLE_LIST:待重命名的表清单。TOTAL_TABLE_COUNT:需要导入的表总数STATUS:任务的状态。INIT:任务初始化IMPORT_TABLE:导入表RECONSTRUCT_REF_CONSTRAINT:重建引用约束CANCELING:导入任务取消中IMPORT_FINISH:导入结束
查看单独每张表导入的Task子任务:
SELECT*FROMoceanbase.CDB_OB_IMPORT_TABLE_TASKS\G📖重要字段:
TASK_ID:当前任务的TASK_ID。JOB_ID:跨租户导入的JOB_ID。SRC_TABLE:源表名。TARGET_TABLE:重命名后的表名,如果未重命名,则显示为空。TABLE_COLUMN:表列的数量。STATUS:任务状态:INIT:表级导入任务初识化DOING:表级导入执行中FINISH:导入结束
查看历史恢复结果
查看表级恢复任务的整体执行结果
查看表级恢复整个任务的结果:
SELECT*FROMoceanbase.CDB_OB_RECOVER_TABLE_JOB_HISTORYWHERETENANT_ID=tenant_id\G查询结果示例:
--所有目标表全部恢复成功 STATUS: COMPLETED RESULT: SUCCESS COMMENT: import succeed table count: 3, failed table count: 0 --部分表恢复成功,部分表恢复失败 STATUS: COMPLETED RESULT: PARTIAL_SUCCESS COMMENT: import succeed table count: 2, failed table count: 1 --用户中途取消表级恢复任务,导致部分目标表恢复成功 STATUS: COMPLETED RESULT: PARTIAL_SUCCESS COMMENT: comment: OB_CANCEL(-4072), addr:11.xxx.xxx.xxx:18000, trace_id:Y4********-**********-0-0 --所有目标表全部恢复失败 STATUS: COMPLETED RESULT: FAILED COMMENT: import succeed table count: 0, failed table count: 3查看辅助租户恢复任务的结果:
SELECT*FROMoceanbase.CDB_OB_RESTORE_HISTORY\G查看跨租户导表任务的整体执行结果
查看目标租户跨租户导入任务的结果:
SELECT*FROMoceanbase.CDB_OB_IMPORT_TABLE_JOB_HISTORYWHERETENANT_ID=tenant_idANDINITIATOR_JOB_ID=recover_table_job_id\G其中,recover_table_job_id需要替换为上一步CDB_OB_RECOVER_TABLE_JOB_HISTORY中查询到的表级恢复任务的JOB_ID。
查询结果示例:
--所有目标表全部恢复成功 STATUS: IMPORT_FINISH RESULT: SUCCESS COMMENT: import succeed table count: 3, failed table count: 0 --部分表恢复成功,部分表恢复失败 STATUS: IMPORT_FINISH RESULT: PARTIAL_SUCCESS COMMENT: import succeed table count: 2, failed table count: 1 --用户中途取消表级恢复任务,导致部分目标表恢复成功 STATUS: IMPORT_FINISH RESULT: PARTIAL_SUCCESS COMMENT: comment: OB_CANCEL(-4072), addr:11.xxx.xxx.xxx:18000, trace_id:Y4********-**********-0-0 --所有目标表全部恢复失败 STATUS: IMPORT_FINISH RESULT: FAILED COMMENT: import succeed table count: 0, failed table count: 3查看每张表的执行结果
查看单独每张表导入的结果:
SELECT*FROMoceanbase.CDB_OB_IMPORT_TABLE_TASK_HISTORYWHERETENANT_ID=tenant_idANDJOB_ID=import_table_job_id\G其中,import_table_job_id需要替换为上一步CDB_OB_IMPORT_TABLE_JOB_HISTORY中查询到的表级恢复任务的JOB_ID。
查询结果示例:
--目标表恢复成功,且目标表关联的Schema全部恢复成功 STATUS: FINISH TOTAL_INDEX_COUNT: 2 IMPORTED_INDEX_COUNT: 2 FAILED_INDEX_COUNT: 0 TOTAL_CONSTRAINT_COUNT: 1 IMPORTED_CONSTRAINT_COUNT: 1 FAILED_CONSTRAINT_COUNT: 0 TOTAL_REF_CONSTRAINT_COUNT: 0 IMPORTED_REF_CONSTRAINT_COUNT: 0 FAILED_REF_CONSTRAINT_COUNT: 0 RESULT: SUCCEESS COMMENT: --目标表恢复成功,同时恢复过程中用户对恢复完成的目标表进行了删除 STATUS: FINISH TOTAL_INDEX_COUNT: 2 IMPORTED_INDEX_COUNT: 2 FAILED_INDEX_COUNT: 0 TOTAL_CONSTRAINT_COUNT: 1 IMPORTED_CONSTRAINT_COUNT: 1 FAILED_CONSTRAINT_COUNT: 0 TOTAL_REF_CONSTRAINT_COUNT: 0 IMPORTED_REF_CONSTRAINT_COUNT: 0 FAILED_REF_CONSTRAINT_COUNT: 0 RESULT: SUCCEESS COMMENT: table type_tbl has been deleted by user --目标表恢复成功,同时目标表关联的Schema部分恢复失败 STATUS: FINISH TOTAL_INDEX_COUNT: 2 IMPORTED_INDEX_COUNT: 1 FAILED_INDEX_COUNT: 1 --> 有一个索引恢复失败 TOTAL_CONSTRAINT_COUNT: 2 IMPORTED_CONSTRAINT_COUNT: 2 FAILED_CONSTRAINT_COUNT: 0 TOTAL_REF_CONSTRAINT_COUNT: 0 IMPORTED_REF_CONSTRAINT_COUNT: 0 FAILED_REF_CONSTRAINT_COUNT: 0 RESULT: SUCCEESS COMMENT: --主键约束恢复失败,导致主表的恢复任务失败 STATUS: FINISH TOTAL_INDEX_COUNT: 0 IMPORTED_INDEX_COUNT: 0 FAILED_INDEX_COUNT: 0 TOTAL_CONSTRAINT_COUNT: 2 IMPORTED_CONSTRAINT_COUNT: 0 FAILED_CONSTRAINT_COUNT: 2 TOTAL_REF_CONSTRAINT_COUNT: 0 IMPORTED_REF_CONSTRAINT_COUNT: 0 FAILED_REF_CONSTRAINT_COUNT: 0 RESULT: FAILED COMMENT: OBE-02264: name already used by an existing constraintReferences
【1】https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001499859
【2】https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001499861
