OceanBase租户级物理恢复
- 数据库版本:V4.2.5
- 本文中的所有操作都需要在sys租户下进行。
资源池创建
进行租户级恢复前,需要创建资源单元和资源池。
创建待恢复的租户的资源池时,建议尽量与源租户保持同构,即建议待恢复的租户的资源池中unit_num的个数与源租户相同。
sql
--创建资源单元
CREATE RESOURCE UNIT box_16c96g MAX_CPU 16, MEMORY_SIZE = '5G', MAX_IOPS 10240, MIN_IOPS=10240;
--创建资源池
CREATE RESOURCE POOL restore_pool unit = 'box_16c96g', unit_num = 1, zone_list = ('z1','z2','z3');
租户级物理恢复
OceanBase数据库支持租户级别的基于时间点的全量恢复。
OceanBase数据库的恢复支持在同集群内恢复,也支持在不同的集群内恢复。
恢复租户时会从备份目的端将需要的宏块数据从对应的全量备份和增量备份中恢复到目标租户,并同步拉取和回放事务日志。
注:当前版本在数据备份的同时备份了租户级配置项,但备份的租户级配置项仅用于为用户提供配置参考,物理恢复时不会直接恢复到租户中。
如果在备份时设置了密码,那么在恢复前也需要设置恢复密码:
sql
SET DECRYPTION IDENTIFIED BY '******';
OceanBase支持以下三种恢复方式:
- 恢复到指定时间戳
sql
ALTER SYSTEM RESTORE dest_tenant_name FROM uri UNTIL TIME='timestamp'
WITH 'pool_list=pool_name[&locality=locality][&primary_zone=zone_name][&concurrency=int_num][&kms_encrypt={true | false}]'
[WITH KEY FROM 'backup_key_path' ENCRYPTED BY 'password'] [DESCRIPTION description];
- 恢复到指定SCN
sql
ALTER SYSTEM RESTORE dest_tenant_name FROM uri UNTIL SCN=scn
WITH 'pool_list=pool_name[&locality=locality][&primary_zone=zone_name][&concurrency=int_num][&kms_encrypt={true | false}]'
[WITH KEY FROM 'backup_key_path' ENCRYPTED BY 'password'] [DESCRIPTION description];
- 恢复到最新位点
sql
ALTER SYSTEM RESTORE dest_tenant_name FROM uri
WITH 'pool_list=pool_name[&locality=locality][&primary_zone=zone_name][&concurrency=int_num][&kms_encrypt={true | false}]'
[WITH KEY FROM 'backup_key_path' ENCRYPTED BY 'password'] [DESCRIPTION description];
📖 重要参数说明:
dest_tenant_name:待恢复的新租户的名称。FROM uri:需要分别指定数据备份路径和日志归档路径。示例:
sql
FROM 'file:///data/nfs/backup/data,file:///data/nfs/backup/archive'
UNTIL TIME|SCN:指定恢复终点,恢复到该位点为止,且包括该位点。当指定恢复到TIME或SCN时, 必须以=来连接指定的值。示例:
sql
UNTIL TIME='2020-06-01 00:00:00'
UNTIL SCN=1658285759724047000
pool_list:(必选)待恢复的新租户创建的资源池。多个资源池之间用英文逗号,分隔。locality:(可选)指定新租户副本分布的Locality信息,需要与新租户所在集群的pool_list的Zone信息相匹配。与源租户保持同构时,建议新租户与源租户的F副本个数相同。不显式指定时,默认按照resource_pool的zone_list为每个Zone设一个F副本。示例:
sql
locality='F@z1,F@z2,F@z3'
primary_zone:(可选)指定新租户的Leader副本的偏好位置,需要与pool_list及locality相匹配,即需要满足Zone信息匹配以及primary_region内至少有两个Paxos成员等限制。与源租户保持同构时,建议新租户与源租户的第一优先级的Primary Zone个数相同。不显式指定时,系统按照locality的zone_list将Leader随机分布在这些Zone中。示例:
sql
primary_zone='z1'
-
concurrency:(可选)指定数据恢复的并发度。如果不显式指定,则默认等于该租户被分配的MAX_CPU数。 -
kms_encrypt:(可选)为true时表示在恢复时需要使用在恢复前指定的kms_encrypt_info。 -
WITH KEY FROM 'backup_key_path' ENCRYPTED BY 'password':指定加密租户的秘钥备份信息。仅当源租户配置了透明加密,才需要在恢复时指定秘钥备份相关的信息。
示例:
sql
ALTER SYSTEM RESTORE mysql_tenant FROM 'file:///data/nfs/backup/data,file:///data/nfs/backup/archive'
UNTIL TIME='2020-06-01 00:00:00'
WITH 'pool_list=restore_pool&concurrency=50';
⭐️ 在待恢复租户对应的Meta租户创建成功后,如果需要加速恢复,可以通过配置项ha_high_thread_score配置恢复任务的并发线程数。
sql
--检查Meta租户是否创建成功(status=NORMAL)
SELECT tenant_id,tenant_name,tenant_type,status FROM oceanbase.DBA_OB_TENANTS;
--修改租户恢复的并发线程数
ALTER SYSTEM SET ha_high_thread_score =10 TENANT = mysql_tenant;
📖在恢复租户数据的过程中,可以执行以下命令来停止恢复,并删除待恢复的目标租户。
sql
ALTER SYSTEM CANCEL RESTORE tenant_name;
开始恢复任务后,可以通过相关视图查看恢复的进度和结果。
⚠️ 租户恢复完成后的事项:
- 物理恢复后的租户为备租户 ,后续该租户可作为备租户提供相关服务(恢复为备租户 ),也可转为主租户提供服务(恢复为主租户)。
- 如果是从低版本的备份数据恢复到高版本集群中,还需要对恢复出来的租户进行升级。
检查恢复状态
查看恢复进度:
sql
SELECT * FROM oceanbase.CDB_OB_RESTORE_PROGRESS\G
一次租户恢复对应两条任务记录:sys租户的任务记录和被恢复租户的任务记录。sys租户的任务记录主要记录被恢复租户的恢复相关信息,不会记录恢复进度信息,被恢复租户的任务记录主要记录其自身的恢复进度信息。
在恢复期间,主要关注恢复进度视图中的status字段:
- 系统租户 :
CREATE_TENANT:创建租户,此阶段系统租户创建被恢复租户WAIT_TENANT_RESTORE_FINISH:等待被恢复租户恢复结束RESTORE_SUCCESS:恢复租户成功RESTORE_FAIL:恢复租户失败
- 被恢复租户 :
RESTORING:租户数据恢复中RESTORE_SUCCESS:恢复成功RESTORE_FAIL:恢复失败
查看历史恢复结果:
sql
SELECT * FROM oceanbase.CDB_OB_RESTORE_HISTORY\G
物理恢复执行成功后,恢复后的租户均为备租户。既可以作为备租户继续从源租户回放日志,也可以将备租户转换为主租户。
恢复为备租户
恢复成功后,恢复后的租户均为备租户,可以执行RECOVER命令继续从租户恢复时指定的日志归档源端回放日志。
为备租户开启日志持续同步:
sql
ALTER SYSTEM RECOVER STANDBY TENANT tenant_name UNTIL UNLIMITED;
查看备租户的日志回放进度:
sql
SELECT TENANT_ID, LS_ID, STATUS, READABLE_SCN FROM oceanbase.CDB_OB_LS WHERE TENANT_ID=xxx;
SELECT TENANT_ID, LS_ID, STATUS, SCN_TO_TIMESTAMP(READABLE_SCN) FROM oceanbase.CDB_OB_LS WHERE TENANT_ID=xxx;
如果希望取消备租户的日志回放:
sql
ALTER SYSTEM RECOVER STANDBY TENANT tenant_name CANCEL;
恢复为主租户
恢复成功后, 恢复后的租户均为备租户,可以通过ACTIVATE STANDBY命令将备租户转换为主租户。
进行备租户切主:
sql
ALTER SYSTEM ACTIVATE STANDBY TENANT tenant_name;
恢复后升级
如果是将低版本的备份数据恢复到高版本的集群中,则还需要对恢复出来的租户进行升级。
执行升级命令,升级租户:
sql
ALTER SYSTEM RUN UPGRADE JOB "UPGRADE_ALL" TENANT = tenant_name;
支持同时升级多个恢复租户,多个租户名之间使用英文逗号,分隔。
升级后,根据当前集群的版本号,执行以下语句,确认租户是否升级成功。
- 如果当前集群为
V4.2.1.1以下版本:
sql
SELECT distinct(value) FROM oceanbase.GV$OB_PARAMETERS WHERE tenant_id = xxxx;
执行成功后,如果查询结果为一行,且value显示为当前集群的四位版本号(例如4.2.1.0),则表示租户升级成功。
- 如果当前集群为
V4.2.1.1及以上版本:
sql
SELECT count(*) FROM oceanbase.DBA_OB_CLUSTER_EVENT_HISTORY WHERE event = 'UPGRADE_ALL' AND value3 ='4.2.1.1' AND value5 = '1004';
其中,4.2.1.1表示当前集群的四位版本号,1004为待确认的租户ID。
如果查询结果不为0,则表示租户升级成功。
References
【1】https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001499870
【2】https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001503172