首批通过分布式安全可靠测评,为关键业务系统打造
执行表级恢复
更新时间:2026-04-07 20:57:20
本节主要介绍如何进行表级恢复。
表级恢复方式
表级恢复物理恢复辅助租户阶段有两种方式:全量恢复和快速恢复。
表级恢复流程 有三个阶段:物理恢复辅助租户、跨租户导表和清理辅助租户。在之前的版本中,物理恢复辅助租户阶段采用的是全量恢复方式,该方式要求源租户下的所有数据都要从备份介质恢复到辅助租户,这种恢复方式会带来以下两个问题:
- 用户必须要在集群上预留充足的 CPU、内存和磁盘资源,以便支持临时的辅助租户的恢复。
- 将所有的数据从备份介质恢复到辅助租户的过程,需要消耗大量的时间和网络带宽。
为了解决上述问题,OceanBase 数据库从 V4.3.5 BP1 版本开始,支持通过快速恢复方式来恢复辅助租户。通过该方式恢复辅助租户时,仅需要恢复一个只读的辅助租户,租户内用户数据不需要从备份介质中恢复出来,只需要在跨租户导表阶段直接从备份介质中读取待恢复表的备份宏块数据即可,这种方式能够减少表级恢复的恢复临时辅助租户资源使用,且缩短了恢复任务的时间开销。
注意
在 OceanBase 数据库 V4.3.5 版本中:
- 对于 V4.3.5 BP1 之前的版本,表级恢复中辅助租户的恢复阶段仍然使用的是全量恢复方式。
- 对于 V4.3.5 BP1 及之后版本,不同的集群部署模式所使用的恢复方式不同:
- 如果集群使用的无共享(Shared-Nothing,SN)模式,且恢复使用的备份集的数据版本号为 V4.3.5.0 及以上版本,则系统会自动使用快速恢复方式来执行表级恢复过程中辅助租户的恢复。但是,如果集群使用的 SN 模式,而恢复使用的备份集的数据版本号为 V4.3.5.0(不含)以下版本,则仍然使用全量恢复方式来执行辅助租户的恢复。
恢复所使用的备份集的数据版本号可以通过查询视图
CDB_OB_BACKUP_SET_FILES(sys 租户)或DBA_OB_BACKUP_SET_FILES(用户租户)中的TENANT_COMPATIBLE列来确认。 - 如果集群使用的是共享存储(Shared-Storage,SS)模式,则系统依然使用全量恢复的方式来执行表级恢复过程中辅助租户的恢复。
- 如果集群使用的无共享(Shared-Nothing,SN)模式,且恢复使用的备份集的数据版本号为 V4.3.5.0 及以上版本,则系统会自动使用快速恢复方式来执行表级恢复过程中辅助租户的恢复。但是,如果集群使用的 SN 模式,而恢复使用的备份集的数据版本号为 V4.3.5.0(不含)以下版本,则仍然使用全量恢复方式来执行辅助租户的恢复。
执行表级恢复后,可以通过 sys 租户查询视图 CDB_OB_RESTORE_HISTORY 中的 RESTORE_TYPE 列来确认辅助租户的恢复方式。
使用限制及注意事项
仅支持恢复用户表,不支持单独恢复临时表、视图、物化视图、物化视图日志、索引等。
对于 V4.3.5 版本,从 V4.3.5 BP2 版本开始支持恢复列存和行列混存格式的表。
在 V4.3.5 版本中:
- 对于 V4.3.5 BP3 及之前版本,不支持恢复带有全文索引、JSON 多值索引或向量索引的表。
- 对于 V4.3.5 BP4 版本及之后版本,支持恢复带有全文索引、JSON 多值索引或向量索引的表。
表恢复的源租户与目标租户的兼容性必须一致,例如,均为 Oracle 兼容性租户,或者均为 MySQL 兼容性租户。
恢复表时,指定的表名需要与系统实际存储的表名一致。例如,Oracle 模式租户下创建表
test,而系统内部实际存储的表名为TEST,故在恢复表时需要指定表名为TEST,否则系统会报错,提示表不存在。与租户级恢复支持的备份数据版本一样,表级恢复当前也是仅支持将低版本的备份数据中的表恢复到同版本或高版本中,同版本下的小版本之间也不支持逆向恢复。有关租户级恢复支持的备份数据版本的详细说明,参见 恢复前准备。
表级恢复除了恢复表,与该表相关联的很多信息也会被恢复,但仍有部分信息不恢复,具体可恢复的信息参见 表级恢复的 Schema 恢复说明。
前提条件
由于指定表的恢复过程中需要使用辅助租户,因此,在进行表恢复前,您需要在目标租户所在的集群内为辅助租户创建所需的资源池。为辅助租户创建所需资源池的详细操作,请参见 表级恢复前准备。
操作步骤
使用
root用户登录目标租户所在集群的sys租户。(可选)如果恢复指定的表时所使用的备份数据配置了加密功能,则需要配置备份集的加密信息。
仅在数据备份时添加了密码的场景下才需要设置备份的恢复密码。
SET DECRYPTION IDENTIFIED BY 'password';其中,
password需要替换为备份时添加的密码。如果全量备份和增量备份设置的密码不一样,则需要输入多个密码,密码之间使用英文逗号分隔(全量备份密码放在前面,增量备份密码放在后面)。全量备份和增量备份设置的密码相同时的示例如下:
SET DECRYPTION IDENTIFIED BY '******';全量备份和增量备份设置的密码不一样时的示例如下:
SET DECRYPTION IDENTIFIED BY '******','******';(可选)设置表级恢复并行度。
单表并行恢复
在执行表级恢复之前,可通过配置项 recover_table_dop 设置并发度。设置后,系统会在以下两个阶段使用该并行度:
- 主表数据恢复阶段:系统会将主表的每个分区拆分成多个子任务并行执行。
- 索引恢复阶段:系统会基于恢复的主表数据,借助并行执行(Parallel Execution, PX)重建表的索引。
语法如下:
-- tenant_name 为目标租户 ALTER SYSTEM SET recover_table_dop=INT_VALUE tenant=tenant_name;多表并行恢复(可选)
在执行多表表级恢复之前,可通过配置项 recover_table_concurrency 设置并发度。设置后多个表能够并行执行恢复任务,提升恢复性能。
语法如下:
-- tenant_name 为目标租户 ALTER SYSTEM SET recover_table_concurrency=INT_VALUE tenant=tenant_name;设置租户每个 observer 节点上的主表数据恢复工作线程数
在设置单表并行度
recover_table_dop和多表并行度recover_table_concurrency之后,也需要通过 ddl_thread_score 配置项设置租户每个 observer 节点补数据工作线程数。表级恢复的跨租户导表阶段,主表数据恢复依赖于目标租户上的特定的 DAG 线程。语法如下:
-- tenant_name 为目标租户 ALTER SYSTEM SET ddl_thread_score=INT_VALUE tenant=tenant_name;注意
- 物理恢复辅助租户执行阶段,可以通过调整 ha_high_thread_score 配置项来动态调整恢复的并行度,调整后立即生效。其中,辅助租户名可以通过表级恢复的任务进度表 CDB_OB_RECOVER_TABLE_JOBS 查看。具体调整请参见物理恢复
- 跨租户导表阶段,你可以通过调整目标租户的
recover_table_concurrency或recover_table_dop配置项来动态调整多表/单表恢复的并行度,调整后立即生效。
执行以下命令,恢复指定的表。
SQL 语句如下:
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_name1,database_name.table_name2,...,多个表之间使用英文逗号(,)分隔。指定
database_name和table_name时:table_name需要与系统实际存储的表名一致。例如,Oracle 模式租户下创建表test,而系统内部实际存储的表名为TEST,故在恢复表时需要指定表名为TEST,否则系统会报错,提示表不存在。对于
database_name或table_name中含有特殊字符的场景,含特殊字符的database_name或table_name需要放在反引号(``)内。如果需要恢复一个 Database 下的所有表,则可以表示为
database_name.*。如果需要恢复租户下的所有用户表,则可以表示为
*.*。
dest_tenant_name:表待恢复的目标租户名,仅支持将表恢复到用户租户中,不支持恢复到sys租户或 Meta 租户。uri:分别指定数据备份和日志归档的路径,与租户级物理恢复命令的参数一样。若数据备份是通过 PLUS ARCHIVELOG 方式发起的,只需要填一个路径即可,否则需要分别输入数据备份和日志归档至少 2 个路径,例如:'file:///backup/archive, file:///backup/data'。{TIME='timestamp'} \| {SCN=scn}:指定的恢复终点,恢复到该位点位置,且包含该位点。当指定恢复到TIME或SCN时, 必须以=来连接指定的值。如果不指定UNTIL子句,则默认恢复到最新的位点。restore_option:指定辅助租户的pool_list、locality、primary_zone及concurrency,不同参数之间通过&分隔。在指定locality和primary_zone时,建议尽量与源租户保持同构。对于
concurrency,如果不指定,则默认等于该辅助租户被分配的 MAX_CPU 数。例如,本文档中,系统租户为辅助租户分配的 MAX_CPU 为 16。有关各参数的详细说明请参见 表级恢复相关参数介绍。
WITH KEY FROM 'backup_key_path' ENCRYPTED BY 'password':指定加密租户的秘钥备份信息。仅当源租户配置了透明加密,才需要在恢复时指定秘钥备份相关的信息。backup_key_path:秘钥的备份路径。password:备份秘钥时设置的加密密码。
有关秘钥备份的相关操作,请参见 备份前准备 中的 备份秘钥。
remap_table_name_list:重命名恢复后的表名。支持仅重命名表名,表所属的 Database 不变;也支持表名不变,仅重命名到其他 Database;还支持重命名表名,同时所属的 Database 重命名为其他 Database。源对象与重命名对象之间使用英文冒号(:)连接,具体格式的示例如下:表名从
student重命名为student2,表所属的 Database 不变:REMAP TABLE school.student:student2。当所属的 Database 不变时,在恢复到目标租户创建表时,系统默认会将表恢复到目标租户同名的 Database 中,如果同名的 Database 不存在,则表恢复就会失败。
表名不变,表所属的 Database 从
school改为college:REMAP TABLE school.student:college.student。表名从
student重命名为student2,表所属的 Database 从school改为college:REMAP TABLE school.student:college.student2。将
school下的所有表恢复到college中:REMAP TABLE school.*:college.*
说明
如果重命名的
database_name或table_name中含有特殊字符,则含特殊字符的database_name或table_name需要放在反引号(``)内。remap_tablegroup_list:重命名表所属的表组。如果源表绑定了表组,则在恢复到目标租户创建表时,系统默认会将表恢复到目标租户中同名的表组,如果同名的表组不存在,表恢复就会失败。如果目标租户中有其他表组,可以将表通过该语句恢复到其他表组中,源对象与重命名对象之间使用英文冒号(:)连接。例如,将源表组
tg1中的表全部恢复到目标租户的表组newtg1中:REMAP TABLEGROUP tg1:newtg1。remap_tablespace_list:重命名表所属的表空间。表空间在 OceanBase 数据库中是一个逻辑单元,当前主要用于数据加密。如果源表绑定了表空间,则在恢复到目标租户创建表时,系统默认会将表恢复到目标租户中同名的表空间,如果同名的表空间不存在,表恢复就会失败。如果目标租户中有其他表空间,也可以将表通过该语句恢复到其他表空间中,源对象与重命名对象之间使用英文冒号(:)连接。例如,将源表空间
ts1中的表全部恢复到目标租户的表空间newts1中:REMAP TABLESPACE ts1:newts1。
有关表恢复相关参数的更多详细说明,请参见 表级恢复相关参数介绍。
将
infodb库中的表tbl1、tbl2恢复到目标租户的infodb库中,并且将表tbl1重命名为newtbl,同时将表所属的表组重定向为newtg1,表所属的表空间重定向为newts1。示例如下:ALTER SYSTEM RECOVER TABLE infodb.tbl1,infodb.tbl2 TO TENANT oracle001 FROM 'file:///data/nfs/backup/data,file:///data/nfs/backup/archive' UNTIL TIME='2023-09-30 00:00:00' WITH 'pool_list=restore_pool' REMAP TABLE infodb.tbl1:newtbl REMAP TABLEGROUP tg1:newtg1 REMAP TABLESPACE ts1:newts1;
注意
- 表数据恢复成功即表示表恢复成功,允许索引、约束或其他关联的 Schema 恢复失败。
- 表级恢复结束后,建议还原
ddl_thread_score、recover_table_concurrency和recover_table_dop配置项设置。如果不恢复,则后续的表级恢复都会按照设置的并行参数执行。 - 表级恢复中表关联触发器的恢复,将按照以下模式进行:
- 如果表级恢复发起命令中未对恢复的表名进行了重命名(REMAP TABLE 映射),即表按原始表名进行恢复,则需要恢复表关联的触发器;
- 如果表级恢复发起命令中对恢复的表名进行了重命名(REMAP TABLE 映射),即表按新的表名进行恢复,则不再恢复表关联的触发器。
后续操作
指定表的恢复结束后,您还需要在辅助租户所在的集群中执行以下命令,手动释放为辅助租户创建的资源池。
DROP RESOURCE POOL restore_pool;其中,
restore_pool表示在恢复前准备时为辅助租户创建的资源池名。有关删除资源池的详细操作及介绍,请参见 删除资源池。
相关文档
有关表级恢复中各 Schema 信息的恢复情况,参见 表级恢复的 Schema 恢复说明。