物理备库功能是 OceanBase 数据库高可用解决方案的重要组成部分,它可以为用户的关键应用提供高可用、数据保护、灾难恢复等重要特性。
物理备库简介
物理备库作为 OceanBase 生产数据库的准实时热备份,当主库出现计划内或计划外(多数派副本故障)的不可用情况时,备库可以接管服务,并且提供无损切换(RPO = 0)和有损切换(RPO > 0)两种容灾能力,最大限度降低服务停机时间,减少可能带来的数据损失。
OceanBase 数据库在 V4.1.0 版本之前,物理备库的产品形态为集群级主备。集群有两种角色:主集群和备集群,主集群下面所有用户租户都是主租户,备集群下面所有用户租户都是备租户,备集群会自动同步主集群的租户变更操作。
V4.1.0 版本开始,物理备库的产品形态变更为租户级主备,即主或备的角色信息属于租户,分为主租户和备租户,集群不再有主备角色的概念,而只是承载租户的容器。主租户是用户创建的业务租户,支持完整的数据库服务能力,包括:查询、DML、DDL 等;备租户则仅提供容灾和只读服务的能力。一个主租户和若干备租户共同组成了租户级的物理备库高可用解决方案。
说明
由于 OceanBase 数据库按照租户粒度提供物理备库能力,在 OceanBase 数据库当前版本的产品文档中,主库和主租户、备库和备租户均代表相同的含义。
物理备库主要通过日志传输服务和日志存储服务来完成日志的传输及存储,并通过日志回放服务来保证主备租户数据的一致,其中:
-
日志传输服务在主租户和备租户之间实时同步 Redo 日志。
当前,OceanBase 数据库物理备库仅提供异步同步模式。
-
日志存储服务为物理备库提供高可用、高可靠的日志存储和读写能力。
-
备租户写入日志存储服务的日志会通过日志回放服务实时或延后地应用到内存的 MemStore 之中,以保证主租户和备租户的数据完全一致。
物理备库可以与 OceanBase 数据库基于多副本的容灾方案、基于仲裁的容灾方案、物理备份恢复、CDC(Change Data Capture) 等功能组合使用,进而满足客户多样的数据保护和可用性需求。
物理备库的部署方案
在一组使用物理备库的方案中,可以包含一个主租户和一个或多个备租户。主租户为业务提供读写服务,备租户通过 Redo 日志实时同步业务在主租户上写入的数据。
一个主租户和对应的备租户可以部署在距离相近或相隔很远的多个不同的 OceanBase 集群中,也可以部署在同一个 OceanBase 集群中。相应的,同一个 OceanBase 集群中既可以包含主租户,也可以包含备租户,也可以同时包含主备租户。主租户和备租户的租户名称不要求相同,租户的资源规格、配置、Locality 等也不要求相同。
此外,主租户和备租户既可以是单副本的租户,也可以是多副本或具备仲裁高可用能力的租户,不同的部署方式为租户提供不同级别的副本级容灾能力。
租户级别的物理备库为用户的使用提供了极大的灵活性,下面介绍几种典型的部署使用场景。
集群中仅有主租户或备租户
在该部署方案中,用户有多个 OceanBase 集群,每个 OceanBase 集群包含的业务租户或者都是主租户,或者都是备租户。
该部署方案是一种最典型的部署模式,用户可以使用物理备库功能完成异地容灾等各种所需的需求。
部署架构图如下所示。
集群中既有主租户又有备租户
在该部署方案中,用户有多个 OceanBase 集群,每个集群中既有主租户又有备租户,同时也允许集群中的租户只有主租户没有备租户。
一个典型的使用场景如下:
业务在两个不同的地域均有读写和异地容灾需求,因此需要在两个地域既有主库又有备库。在使用其他数据库基于主备的方案中,用户需要在两个地域各部署两个(或多个)集群,地域之间的集群互为主备。
在 OceanBase 数据库的部署方案中,仅需要在两个地域各部署一个集群,通过租户级别的主备即可满足业务需求,大大简化数据库集群的管理复杂度。部署架构图如下所示。
主租户和备租户在同一个集群中
在该部署方案中,用户只有一个 OceanBase 集群,主租户和对应的一个或多个备租户均在同一个 OceanBase 集群中。
可能使用该种部署方案的场景如下:
假设某个业务租户需要在业务升级前保留一个数据库的快照。此时可以为该业务租户在同一个集群内创建一个实时同步的备租户,并在业务执行升级操作前将该备租户暂停同步。之后,业务可以在主租户上进行任意读写操作(例如,进行业务升级),并且这些操作均不会影响备租户。后续若业务升级失败,可以将当前主租户删除,并将备租户切换为新的主租户(通过将新租户名修改为原主租户名,可以保证 Proxy 的访问不变)。
部署架构图如下所示。
功能使用限制
更新时间:2025-04-09 23:00:01
编辑
分享
本节主要介绍物理备库功能的使用限制。
限制项 | 具体描述 |
---|---|
同一个主租户支持的最大备租户个数 | 无限制 |
主租户和备租户是否要求资源同构 | 不要求同构。建议主租户和备租户使用相同的资源规格。 |
配置项 | 主租户与备租户的配置项相互独立,不会物理同步。如果修改了主租户的配置项,需要评估是否需要修改备租户的相同配置项。 |
系统变量 | 主租户和备租户的系统变量物理同步,如果在主租户上修改了系统变量,系统会同步修改备租户的相同系统变量。 |
用户及用户密码 | 仅支持在主租户上创建用户和修改用户密码,更新后信息会同步给备租户。 |
读写操作 | 备租户支持读操作,不支持写操作。 |
转储与合并 | 主租户和备租户的转储相对独立。 备租户从主租户同步合并信息,不支持独立合并。 |
Switchover 限制 | 要求备租户日志流的所有副本在线 |
Failover 限制 | 要求备租户日志流的所有副本在线 |
创建租户前,需要选择备租户的源端,明确待创建的备租户个数,选择备租户的创建方式并进行备租户的资源准备。
选择备租户的源端
备租户既可以从主租户同步日志,也可以从另外一个备租户同步日志,从另一个备租户同步日志的部署架构,称为级联备库或级联备租户。
您可以根据业务实际情况来选择备租户的源端。
注意
- 选择好备租户的源端后,在创建备租户前,建议为该备租户对应的源端租户(主租户或另一个备租户)开启日志归档。这是因为,如果源端租户未开启日志归档,当备租户落后于源端租户而源端租户的日志又已经回收时,就会导致备租户的日志同步卡住。如果源端租户在创建备租户前已开启日志归档,则出现该情况时,备租户可以自动从源端租户的归档日志中补齐这部分数据。
- 为源端租户开启日志归档的详细操作,请参见 开启归档模式。
- 如果因未开启源端租户的日志归档,出现了备租户日志同步卡住的现象,请参考 物理备库同步过程中卡住 中的 问题三:备库日志同步状态异常 进行排查。
选择待创建的备租户个数
OceanBase 数据库当前版本对一个主租户(或备租户)可以同步的备租户的个数无限制。
对于基于日志归档的物理备库场景,由于日志的同步依赖存储介质,需要根据实际的业务需求情况,来确定创建多少个租户。
对于基于网络的物理备库场景,由于备租户在同步日志时,需要读取源端租户的日志,会消耗源端租户的 CPU、内存和 IO 资源,同时还会消耗备租户与源端租户之间的网络带宽资源。因此,在创建备租户时,需要结合源端租户的资源使用情况及实际的业务需求情况,来确定创建多少个备租户。
选择创建备租户的方式
OceanBase 数据库提供了三种方式创建备租户,您可以根据实际的业务场景,选择合适的方式创建备租户。
-
创建空备租户
若主租户为刚刚新创建的主租户,或者用户可以确认主租户所在集群或日志归档介质上保存有该主租户自创建后完整的日志,则其备租户在创建时不需要依赖除日志外的其他基线或转储数据。此时,可以通过
CREATE STANDBY TENANT
语句创建备租户。检查主租户是否拥有完整日志的方法如下:
-
管理员用户登录主租户或主租户所在集群的
sys
租户。 -
执行以下命令,查看主租户上的日志流对比信息。
-
主租户所在集群的
sys
租户查询主租户的日志流对比信息(SELECT LS_ID FROM oceanbase.CDB_OB_LS_HISTORY WHERE TENANT_ID = xxxx) EXCEPT (SELECT LS_ID FROM oceanbase.CDB_OB_LS WHERE TENANT_ID = xxxx);
或者
(SELECT LS_ID FROM oceanbase.CDB_OB_LS_HISTORY WHERE TENANT_ID = xxxx) MINUS (SELECT LS_ID FROM oceanbase.CDB_OB_LS WHERE TENANT_ID = xxxx);
其中,主租户的
TENANT_ID
可通过DBA_OB_TENANTS
视图获取。 -
主租户查询本租户
MySQL 模式
Oracle 模式
(SELECT LS_ID FROM oceanbase.DBA_OB_LS_HISTORY) EXCEPT (SELECT LS_ID FROM oceanbase.DBA_OB_LS);
或者
(SELECT LS_ID FROM oceanbase.DBA_OB_LS_HISTORY) MINUS (SELECT LS_ID FROM oceanbase.DBA_OB_LS);
其中,
DBA_OB_LS_HISTORY
或CDB_OB_LS_HISTORY
视图用于展示租户上曾经创建过的所有日志流;DBA_OB_LS
或CDB_OB_LS
视图用于展示租户上当前提供服务的日志流。两个SELECT
查询语句的差值用于表示主租户上曾经创建过,但后续由于负载均衡或扩缩容等原因被删掉的日志流。若上述语句的返回结果不为空,则表明主租户上曾经有日志流创建后被删除,此时主租户上的日志不完整,不能使用
CREATE STANDBY TENANT
语句创建备租户。若查询结果为空,则继续执行下一步的检查。 -
-
执行以下命令,查看主租户上的日志流信息。
-
主租户所在集群的
sys
租户查询主租户的日志流信息SELECT LS_ID, BEGIN_LSN FROM oceanbase.GV$OB_LOG_STAT WHERE TENANT_ID = xxxx AND ROLE = 'LEADER' ;
其中,主租户的
TENANT_ID
可通过DBA_OB_TENANTS
视图获取。 -
主租户查询本租户
MySQL 模式
Oracle 模式
SELECT LS_ID, BEGIN_LSN FROM oceanbase.GV$OB_LOG_STAT WHERE ROLE = 'LEADER' ;
查询结果的示例如下:
+-------+-----------+ | LS_ID | BEGIN_LSN | +-------+-----------+ | 1 | 0 | | 1001 | 0 | +-------+-----------+ 2 rows in set
其中,
BEGIN_LSN
表示当前日志流副本保存的最早的日志 LSN(Log Sequence Number),如果BEGIN_LSN
的值为0
,则表示当前日志流副本拥有自创建以来完整的日志。根据查询结果,日志流副本所对应的
BEGIN_LSN
的值为0
,表示当前日志流副本拥有自创建以来完整的日志;如果该租户的所有日志流副本对应的BEGIN_LSN
的值均为0
,则表示该租户的所有日志流均拥有完整日志,可以通过CREATE STANDBY TENANT
语句创建空备租户。 -
-
-
使用物理备份恢复(带日志)功能创建备租户
该方式为创建备租户的通用方式,任何场景下均适用。有关物理备份恢复的详细介绍及操作,请参见 物理备份恢复概述。
-
使用 BACKUP DATABASE PLUS ARCHIVELOG 功能创建备租户
由于使用常规的物理备份恢复(带日志)功能创建备租户时,要求使用共享存储(例如,OSS、NFS 等)来保存数据备份和日志归档,同时要求主租户和备租户所在的集群可以同时访问共享存储。这对于社区版用户或单机版用户很不友好,有较高的使用门槛。
基于上述原因,您可以使用 BACKUP DATABASE PLUS ARCHIVELOG 功能,将主租户的所有数据和归档日志在本机(对应主租户为单机的使用场景)或共享存储(对应社区版且主租户为集群的使用场景)上生成一份数据库的快照,该快照中包含了基线数据和数据库运行必需的归档日志,再将该快照上传到待创建的备租户所在集群可以访问的介质上,最后使用数据库快照恢复出一个备租户。
备租户的资源准备
创建备租户前,需要为备租户分配资源池,规划备租户所使用的 CPU、Memory、日志盘空间及 IOPS 等资源,并确定备租户的副本数、Primary Zone 以及 Locality 等信息。
备租户所使用的租户资源不要求和主租户完全一致。在使用上,建议结合业务的实际情况和主备租户所承载的业务压力,为备租户选择合适的资源规格。可以根据主租户以及待创建的备租户的 Unit 个数,通过以下命令,计算出备租户每个 Unit 所需的物理资源量。
假设主租户的 TENANT_ID
为 1002,备租户待创建的 Unit 个数为 2,使用主租户所在集群的 sys 租户登录集群后,计算备租户上每个 Unit 所需的物理资源量的语句如下:
obclient [oceanbase]> CALL DBMS_OB_LIMIT_CALCULATOR.CALCULATE_MIN_PHY_RES_NEEDED_BY_STANDBY_TENANT(PRIMARY_TENANT_ID => 1002, STANDBY_TENANT_UNIT_NUM => 2);
结果如下:
+------------------------+------------+
| PHYSICAL_RESOURCE_NAME | MIN_VALUE |
+------------------------+------------+
| memstore | 0 |
| memory | 4294967296 |
| data_disk | 0 |
| clog_disk | 2147483648 |
| cpu | 0 |
+------------------------+------------+
5 rows in set
创建空备租户适用于主租户为新创建,或您可以确认该主租户当前拥有租户自创建后的完整日志的场景。
步骤一:创建访问视图的专用用户
由于备租户在连接主租户时,需要访问主租户的部分系统视图,因此需要有一个访问视图专用用户具备这部分系统视图的查询权限。您可以提供一个主租户上已有相关权限的用户,也可以在主租户上为备租户专门创建一个新的具备相关权限的用户。
备租户需要访问的系统视图如下:
-
GV$OB_LOG_STAT
:用于获取主租户的机器列表、副本服务的日志流 LSN 范围、角色(是否是Leader)等信息。关于
GV$OB_LOG_STAT
视图的更多介绍,请参见 GV$OB_LOG_STAT。 -
GV$OB_UNITS
:查询主租户的所有 Unit 信息,获取副本状态、Zone 以及 Region 等信息,用于过滤、获取和维护租户机器连接等。关于
GV$OB_UNITS
视图的更多介绍,请参见 GV$OB_UNITS。 -
GV$OB_PARAMETERS
: 用于查询主租户的cluster_id
、tenant_id
等服务必须的元信息。关于
GV$OB_PARAMETERS
视图的更多介绍,请参见 GV$OB_PARAMETERS。 -
DBA_OB_ACCESS_POINT
: 用于获取访问入口信息。在主租户迁移复制、容灾等场景下,若访问入口发生变化,备租户可以自动感知,不需要用户手动修改。关于
DBA_OB_ACCESS_POINT
视图的更多介绍,请参见 DBA_OB_ACCESS_POINT。 -
DBA_OB_TENANTS
:获取主租户的兼容模式。关于
DBA_OB_TENANTS
视图的更多介绍,请参见 DBA_OB_TENANTS。 -
DBA_OB_LS
: 获取主租户的日志流列表以及日志流状态。关于
DBA_OB_LS
视图的更多介绍,请参见 DBA_OB_LS。
创建访问视图专用用户并授权的具体操作如下。
注意
OceanBase 数据库的用户名和权限信息是在主备租户之间进行同步,备租户自身不允许创建用户和授予权限。因此,如果当前备租户的源端是另外一个备租户,则需要在对应的主租户上创建访问视图专用用户并授予权限。
MySQL 模式
-
使用管理员用户登录到主租户。
-
执行以下命令,创建一个新用户。
obclient [oceanbase]> CREATE USER rep_user IDENTIFIED BY '******';
-
给用户授权。
以下示例是将
oceanbase
数据库下所有表的SELECT
权限授予该用户。您也可以仅授予oceanbase
库下GV$OB_LOG_STAT
、GV$OB_UNITS
、GV$OB_PARAMETERS
、DBA_OB_ACCESS_POINT
、DBA_OB_TENANTS
、DBA_OB_LS
等视图的 SELECT 权限。obclient [oceanbase]> GRANT SELECT ON oceanbase.* TO rep_user;
Oracle 模式
-
使用管理员用户登录到主租户。
-
创建一个新用户。
obclient [SYS]> CREATE USER rep_user IDENTIFIED BY ******;
-
将角色
STANDBY_REPLICATION
授予新用户rep_user
。STANDBY_REPLICATION
为系统默认角色,该角色默认包含CREATE SESSION
系统权限以及对以下视图的查询权限:- GV$OB_LOG_STAT
- GV$OB_UNITS
- GV$OB_PARAMETERS
- DBA_OB_ACCESS_POINT
- DBA_OB_TENANTS
- DBA_OB_LS
- DBA_OB_LS_HISTORY
语句如下:
obclient [SYS]> GRANT STANDBY_REPLICATION TO rep_user;
步骤二:创建备租户
-
使用
root
用户登录待创建的备租户所在集群的sys
租户。 -
执行以下命令,创建备租户所需的 Unit 规格。
例如,创建一个 CPU 为 1 核且内存为 5 GB 的 Unit 规格
unit1
。obclient [oceanbase]> CREATE RESOURCE UNIT unit1 MAX_CPU 1, MEMORY_SIZE = '5G';
有关 Unit 规格的详细创建操作,请参见 创建租户。
-
创建备租户所需的资源池。
例如,创建资源池
pool_for_standby
。obclient [oceanbase]> CREATE RESOURCE POOL pool_for_standby UNIT = 'unit1', UNIT_NUM = 1, ZONE_LIST = ('zone1','zone2','zone3');
有关资源池的详细创建操作,请参见 创建租户。
-
执行以下命令,创建空备租户。
SQL 语句如下:
CREATE STANDBY TENANT [IF NOT EXISTS] tenant_name LOG_RESTORE_SOURCE [=] string_value [tenant_characteristic_list]; tenant_characteristic_list: tenant_characteristic [, tenant_characteristic...] tenant_characteristic: COMMENT 'string' | PRIMARY_ZONE [=] zone_name | RESOURCE_POOL_LIST [=](pool_name [, pool_name...]) | LOCALITY [=] 'locality description'
部分参数说明如下:
-
tenant_name
:待创建的备租户名,必选。租户名不能是 OceanBase 数据库的关键字。 -
IF NOT EXISTS
:如果待创建的租户名已存在,并且未指定IF NOT EXISTS
,则系统会报错,可选。 -
LOG_RESTORE_SOURCE
:日志恢复源配置,必选。具体格式为:'SERVICE=$ip_list USER=$user_name@$tenant_name PASSWORD=$password';
,该参数所需要填写的信息与ALTER SYSTEM SET LOG_RESTORE_SOURCE
命令一致。其中:
$ip_list
:主租户所在副本的 OBServer 节点的 IP 及 SQL 端口号(默认为 2881)。可以在主租户上通过查询DBA_OB_ACCESS_POINT
视图获取。如果有多个 OBServer 节点信息,可以不用填写全部 OBServer 节点的信息。$user_name
:刚刚创建的访问视图的专用用户。$tenant_name
:待连接的主租户名。$password
:访问视图的专用用户对应的用户密码。
-
COMMENT
:注释,可选。 -
RESOURCE_POOL_LIST
:指定备租户所使用的资源池列表,必选。 -
PRIMARY_ZONE
:指定备租户所在的 Primary Zone,可选。 -
LOCALITY
:指定备租户的副本在 Zone 间的分布情况,可选。
示例如下:
obclient [oceanbase]> CREATE STANDBY TENANT IF NOT EXISTS standby_tenant LOG_RESTORE_SOURCE = "SERVICE=xx.xx.xx.1:2881;xx.xx.xx.2:2881;xx.xx.xx.3:2881 USER=rep _user@mysql PASSWORD=******" RESOURCE_POOL_LIST=('pool_for_standby');
-
-
执行以下命令,查看租户状态。
obclient [oceanbase]> SELECT TENANT_NAME, TENANT_TYPE, CREATE_TIME, STATUS, TENANT_ROLE,SCN_TO_TIMESTAMP(SYNC_SCN) FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'standby_tenant';
查询结果如下:
+----------------+-------------+----------------------------+--------+-------------+----------------------------+ | TENANT_NAME | TENANT_TYPE | CREATE_TIME | STATUS | TENANT_ROLE | SCN_TO_TIMESTAMP(SYNC_SCN) | +----------------+-------------+----------------------------+--------+-------------+----------------------------+ | standby_tenant | USER | 2023-04-14 21:06:48.787550 | NORMAL | STANDBY | 2023-04-14 21:12:59.183293 | +----------------+-------------+----------------------------+--------+-------------+----------------------------+ 1 row in set
根据查询结果,
TENANT_ROLE
的值为STANDBY
, 且STATUS
的值为NORMAL
,则表示备租户状态正常,备租户已创建成功。通过该方式创建的备租户在创建成功后,将自动进入持续同步模式。
使用备份恢复(带日志)功能创建备租户的方式为一种通用方式,该方式主要是从数据备份和日志归档中恢复出备租户,并且既可以从主租户的数据备份和日志归档中恢复,也可以从已存在的备租户的数据备份和日志归档中恢复。
步骤一:主租户或其他的备租户开启归档模式并执行数据备份
由于新的备租户需要从数据备份和日志归档中恢复出来,故在新建备租户前,需要为主租户或源端的备租户开启归档模式并执行一次全量数据备份。
说明
设置归档目的端、开启归档模式、设置备份目的端以及执行数据备份等操作均支持在系统租户(sys
租户)或用户租户下执行,在系统租户下执行时,需要在对应命令的结尾加 tenant = 'tenant_name'
,本文以在用户租户下的操作为例,提供操作指导。
-
主租户或源端的备租户开启归档模式,并保证归档状态一直为
DOING
。-
设置归档目的端。
假设归档介质使用 NFS,归档目的端路径为
/data/1/sh_archive/
,用户租户设置归档目的端的 SQL 语句示例如下:ALTER SYSTEM SET LOG_ARCHIVE_DEST = 'LOCATION=file:///data/1/sh_archive';
设置归档目的端的详细操作,请参见 日志归档前准备。
-
开启主租户或源端的备租户的归档模式。
注意
为了保证数据备份期间的日志都能被归档,必须先开启租户的归档模式后,再执行数据备份。
用户租户开启归档模式的 SQL 语句如下:
ALTER SYSTEM ARCHIVELOG;
开启归档模式的详细操作,请参见 开启归档模式。
-
确认归档状态是否为
DOING
。用户租户查询归档状态的语句如下,如果是系统租户,需要查询
CDB_OB_ARCHIVELOG
视图。-
系统租户
SELECT DEST_ID, ROUND_ID, DEST_NO, STATUS, CHECKPOINT_SCN, CHECKPOINT_SCN_DISPLAY, PATH FROM oceanbase.CDB_OB_ARCHIVELOG;
-
MySQL 租户
SELECT DEST_ID, ROUND_ID, DEST_NO, STATUS, CHECKPOINT_SCN, CHECKPOINT_SCN_DISPLAY, PATH FROM oceanbase.DBA_OB_ARCHIVELOG;
-
Oracle 租户
SELECT DEST_ID, ROUND_ID, DEST_NO, STATUS, CHECKPOINT_SCN, CHECKPOINT_SCN_DISPLAY, PATH FROM SYS.DBA_OB_ARCHIVELOG;
查询结果的示例如下:
+---------+----------+---------+--------+---------------------+----------------------------+--------------------------------+ | DEST_ID | ROUND_ID | DEST_NO | STATUS | CHECKPOINT_SCN | CHECKPOINT_SCN_DISPLAY | PATH | +---------+----------+---------+--------+---------------------+----------------------------+--------------------------------+ | 1001 | 1 | 0 | DOING | 1680265982125159110 | 2023-03-31 20:33:02.125159 | file:///data/1/sh_archive | +---------+----------+---------+--------+---------------------+----------------------------+--------------------------------+ 1 row in set
根据查询结果,
STATUS
的值为DOING
,表示归档处于正常工作状态。查看归档状态的详细操作,请参见 查看归档进度。
-
-
-
主租户或源端的备租户开启数据备份,并完成一次全量备份。
开启归档模式后,主租户或源端的备租户需要执行一次数据备份。
-
设置数据备份的备份目的端。
假设备份介质使用 NFS,备份目的端路径为
/data/1/sh_databackup
,用户租户设置备份目的端的 SQL 语句示例如下:ALTER SYSTEM SET DATA_BACKUP_DEST = 'file:///data/1/sh_databackup';
设置备份目的端的详细操作,请参见 备份前准备。
-
执行数据备份。
用户租户执行数据备份的 SQL 语句如下:
ALTER SYSTEM BACKUP DATABASE;
发起租户全量数据备份的详细操作,请参见 发起数据备份。
-
确认数据备份状态。
用户租户下通过
DBA_OB_BACKUP_JOBS
视图(系统租户查询CDB_OB_BACKUP_JOBS
视图)查询数据备份进度的 SQL 语句如下:-
系统租户
SELECT * FROM oceanbase.CDB_OB_BACKUP_JOBS;
-
MySQL 租户
SELECT * FROM oceanbase.DBA_OB_BACKUP_JOBS;
-
Oracle 租户
SELECT * FROM SYS.DBA_OB_BACKUP_JOBS;
如果备份正在执行,则该视图中会显示备份任务的进度信息。查看数据备份进度的详细操作,请参见 查看数据备份进度。
如果备份已完成,可以通过
DBA_OB_BACKUP_JOB_HISTORY
视图(系统租户查询CDB_OB_BACKUP_JOB_HISTORY
视图)进一步查询数据备份历史。-
系统租户
SELECT * FROM oceanbase.CDB_OB_BACKUP_JOB_HISTORY;
-
MySQL 租户
SELECT * FROM oceanbase.DBA_OB_BACKUP_JOB_HISTORY;
-
Oracle 租户
SELECT * FROM SYS.DBA_OB_BACKUP_JOB_HISTORY;
查询数据备份历史的结果如下:
+--------+-------------+---------------+---------------------+------------------+--------------------+-----------------+-------------+-------------+-----------------+--------+----------------------------+----------------------------+-----------+--------+---------+-------------+-------------------------------+ | JOB_ID | INCARNATION | BACKUP_SET_ID | INITIATOR_TENANT_ID | INITIATOR_JOB_ID | EXECUTOR_TENANT_ID | PLUS_ARCHIVELOG | BACKUP_TYPE | JOB_LEVEL | ENCRYPTION_MODE | PASSWD | START_TIMESTAMP | END_TIMESTAMP | STATUS | RESULT | COMMENT | DESCRIPTION | PATH | +--------+-------------+---------------+---------------------+------------------+--------------------+-----------------+-------------+-------------+-----------------+--------+----------------------------+----------------------------+-----------+--------+---------+-------------+-------------------------------+ | 1 | 1 | 1 | 1004 | 0 | 1004 | OFF | FULL | USER_TENANT | NONE | | 2023-03-31 20:48:32.342315 | 2023-03-31 20:49:39.908559 | COMPLETED | 0 | | | file:///data/1/sh_databackup | +--------+-------------+---------------+---------------------+------------------+--------------------+-----------------+-------------+-------------+-----------------+--------+----------------------------+----------------------------+-----------+--------+---------+-------------+-------------------------------+ 1 row in set
根据查询结果,当
STATUS
的值为COMPLETED
时,表示数据备份已完成。 -
-
步骤二:恢复出备租户
-
使用
root
用户登录到待创建的备租户所在集群的sys
租户。 -
执行以下命令,创建备租户所需的 Unit 规格。
例如,创建一个 CPU 为 1 核且内存为 5 GB 的 Unit 规格
unit1
。CREATE RESOURCE UNIT unit1 MAX_CPU 1, MEMORY_SIZE = '5G';
有关 Unit 规格的详细创建操作,请参见 创建租户。
-
创建备租户所需的资源池。
为备租户创建资源池时,建议尽量与源端租户保持同构,即建议备租户的资源池中
unit_num
的个数与源端租户相同。例如,创建资源池
pool_for_standby
。CREATE RESOURCE POOL pool_for_standby UNIT = 'unit1', UNIT_NUM = 1, ZONE_LIST = ('zone1','zone2','zone3');
有关资源池的详细创建操作,请参见 创建租户。
-
执行
RESTORE
命令,使用租户的数据备份和日志归档功能,恢复出备租户。语句如下:
ALTER SYSTEM RESTORE standby_tenant_name FROM uri UNTIL TIME ='timestamp' WITH 'restore_option' [WITH KEY FROM 'backup_key_path' ENCRYPTED BY 'password'] [DESCRIPTION description];
相关参数说明如下:
-
standby_tenant_name
:指待恢复出的备租户的名称。 -
uri
:需要分别指定主租户或源端的备租户的数据备份路径和归档路径。 -
UNTIL TIME= timestamp
:用于指定的恢复终点,恢复到该位点为止,且包括该位点。指定timestamp
必须以=
连接。timestamp
仅支持YYYY-MM-DD HH24:MI:SS.FF
格式, 精确到纳秒。关于如何选取
timestamp
的详细说明,请参见 物理恢复相关参数介绍。 -
restore_option
支持指定pool_list
、locality
、primary_zone
, 其中pool_list
为必选项, 其余为可选项。不同参数之间通过&
分隔。在指定locality
和primary_zone
时,建议尽量与源租户保持同构。如果不同构,待租户恢复后激活为主租户可能会产生负载均衡操作,影响性能。有关
restore_option
中各参数的详细说明,请参见 物理恢复相关参数介绍。 -
WITH KEY FROM 'backup_key_path' ENCRYPTED BY 'password'
:指定加密租户的秘钥备份信息。仅当源租户配置了透明加密,才需要在恢复时指定秘钥备份相关的信息。-
backup_key_path
:秘钥的备份路径。 -
password
:备份秘钥时设置的加密密码。
-
从日志归档路径
file:///data/1/sh_archive
与数据备份路径file:///data/1/sh_databackup
恢复出备租户standby_tenant
的示例如下:ALTER SYSTEM RESTORE standby_tenant FROM 'file:///data/1/sh_databackup,file:///data/1/sh_archive' UNTIL TIME='2023-05-26 15:04:23.825558' WITH 'pool_list=pool_for_standby';
关于
RESTORE
命令的更多介绍,请参见 物理恢复相关参数介绍。 -
-
确认恢复是否完成。
恢复过程中,可以通过
DBA_OB_TENANTS
视图确认恢复是否完成。SELECT TENANT_NAME, TENANT_TYPE, CREATE_TIME, STATUS, TENANT_ROLE,SCN_TO_TIMESTAMP(SYNC_SCN) FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'standby_tenant';
查询结果如下
+----------------+-------------+----------------------------+--------+-------------+----------------------------+ | TENANT_NAME | TENANT_TYPE | CREATE_TIME | STATUS | TENANT_ROLE | SCN_TO_TIMESTAMP(SYNC_SCN) | +----------------+-------------+----------------------------+--------+-------------+----------------------------+ | standby_tenant | USER | 2023-04-02 20:42:38.800518 | NORMAL | STANDBY | 2023-04-02 20:42:30.736135 | +----------------+-------------+----------------------------+--------+-------------+----------------------------+ 1 row in set
根据查询结果,当
TENANT_ROLE
的值为STANDBY
时,则表示备租户恢复完成。有关查看恢复进度的更多详细介绍,请参见 查看恢复进度。
步骤三:开启日志持续同步
使用默认的 RESTORE
命令创建的新备租户,不会连续同步主租户或源端备租户归档的日志,需要手动再执行 RECOVER
命令重新设置新备租户的恢复终点,开启日志持续同步模式。
-
使用管理员用户登录新备租户或新备租户所在集群的
sys
租户。 -
根据实际使用场景,执行
RECOVER
命令,更改新备租户的恢复终点。-
新备租户所在集群的
sys
租户为新备租户开启日志持续同步ALTER SYSTEM RECOVER STANDBY TENANT = tenant_name UNTIL UNLIMITED;
其中,
UNLIMITED
表示无穷大。示例如下:
ALTER SYSTEM RECOVER STANDBY TENANT = standby_tenant UNTIL UNLIMITED;
-
新备租户为本租户开启日志持续同步
ALTER SYSTEM RECOVER STANDBY UNTIL UNLIMITED;
-
-
再次查询
DBA_OB_TENANTS
视图,通过SYNC_SCN
字段确认新备租户的同步位点。其中,
SCN_TO_TIMESTAMP(SYNC_SCN)
列显示了新备租户当前的同步进度。-
新备租户所在集群的
sys
租户查询视图SELECT TENANT_NAME, TENANT_TYPE, CREATE_TIME, STATUS, TENANT_ROLE,SCN_TO_TIMESTAMP(SYNC_SCN) FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'standby_tenant';
-
新备租户查询视图
-
MySQL 租户
SELECT TENANT_NAME, TENANT_TYPE, CREATE_TIME, STATUS, TENANT_ROLE,SCN_TO_TIMESTAMP(SYNC_SCN) FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'standby_tenant';
查询结果如下:
+----------------+-------------+----------------------------+--------+-------------+----------------------------+ | TENANT_NAME | TENANT_TYPE | CREATE_TIME | STATUS | TENANT_ROLE | SCN_TO_TIMESTAMP(SYNC_SCN) | +----------------+-------------+----------------------------+--------+-------------+----------------------------+ | standby_tenant | USER | 2023-04-02 20:42:38.800518 | NORMAL | STANDBY | 2023-04-02 21:06:50.810688 | +----------------+-------------+----------------------------+--------+-------------+----------------------------+ 1 row in set
-
Oracle 租户
SELECT TENANT_NAME, TENANT_TYPE, CREATE_TIME, STATUS, TENANT_ROLE,SCN_TO_TIMESTAMP(SYNC_SCN) FROM SYS.DBA_OB_TENANTS WHERE TENANT_NAME = 'standby_tenant';
查询结果如下:
+------------------+-------------+------------------------------+--------+-------------+---------------------------------+ | TENANT_NAME | TENANT_TYPE | CREATE_TIME | STATUS | TENANT_ROLE | SCN_TO_TIMESTAMP(SYNC_SCN) | +------------------+-------------+------------------------------+--------+-------------+---------------------------------+ | standby_tenant | USER | 23-MAY-23 02.37.58.647507 PM | NORMAL | STANDBY | 26-MAY-23 01.34.46.896905660 PM | +------------------+-------------+------------------------------+--------+-------------+---------------------------------+ 1 row in set
-
-
使用 BACKUP DATABASE PLUS ARCHIVELOG 功能创建备租户的实现方法是,将主租户的所有数据和归档日志在本机或共享存储上生成一份带有归档日志的完整的数据集,再将该数据集上传到待创建的备租户所在集群可以访问的介质上,最后使用数据集恢复出一个备租户。
步骤一:主租户开启归档模式并执行数据备份
-
使用管理员用户登录主租户或主租户所在集群的
sys
租户。 -
主租户开启归档模式。
-
设置归档目的端。
对于主租户为单机的场景,您可以将租户副本所在机器(observer 进程所在的机器)的一个可以访问路径作为归档目的端。对于其他场景,需要使用共享存储(例如,NFS 或 阿里云 OSS)作为归档目的端。
假设归档介质使用 NFS,归档目的端路径为
/data/1/sh_archive/
,示例如下:-
主租户所在集群的
sys
租户设置主租户的归档目的端ALTER SYSTEM SET LOG_ARCHIVE_DEST = 'LOCATION=file:///data/1/sh_archive' TENANT = mysql;
其中,
mysql
为指定的主租户名。 -
主租户设置本租户的归档目的端
ALTER SYSTEM SET LOG_ARCHIVE_DEST = 'LOCATION=file:///data/1/sh_archive';
设置归档目的端的详细操作,请参见 日志归档前准备。
-
-
开启归档模式。
注意
为了保证数据备份期间的日志都能被归档,必须先开启租户的归档模式后,再执行数据备份。
-
主租户所在集群的
sys
租户开启主租户的归档模式ALTER SYSTEM ARCHIVELOG TENANT = mysql;
其中,
mysql
为指定的主租户名。 -
主租户开启本租户的归档模式
ALTER SYSTEM ARCHIVELOG;
开启归档模式的详细操作,请参见 开启归档模式。
-
-
确认归档状态是否为
DOING
。主租户通过查询
DBA_OB_ARCHIVELOG
视图(系统租户查询CDB_OB_ARCHIVELOG
视图)确认归档状态的语句如下:-
系统租户
SELECT DEST_ID, ROUND_ID, DEST_NO, STATUS, CHECKPOINT_SCN, CHECKPOINT_SCN_DISPLAY, PATH FROM oceanbase.CDB_OB_ARCHIVELOG;
-
MySQL 租户
SELECT DEST_ID, ROUND_ID, DEST_NO, STATUS, CHECKPOINT_SCN, CHECKPOINT_SCN_DISPLAY, PATH FROM oceanbase.DBA_OB_ARCHIVELOG;
-
Oracle 租户
SELECT DEST_ID, ROUND_ID, DEST_NO, STATUS, CHECKPOINT_SCN, CHECKPOINT_SCN_DISPLAY, PATH FROM SYS.DBA_OB_ARCHIVELOG;
查询结果的示例如下:
+---------+----------+---------+--------+---------------------+----------------------------+--------------------------------+ | DEST_ID | ROUND_ID | DEST_NO | STATUS | CHECKPOINT_SCN | CHECKPOINT_SCN_DISPLAY | PATH | +---------+----------+---------+--------+---------------------+----------------------------+--------------------------------+ | 1001 | 1 | 0 | DOING | 1680867152120380679 | 2023-04-07 19:32:32.120380 | file:///data/1/xianlin_archive | +---------+----------+---------+--------+---------------------+----------------------------+--------------------------------+ 1 row in set
根据查询结果,
STATUS
的值为DOING
,表示归档处于正常工作状态。查看归档状态的详细操作,请参见 查看归档进度。
-
-
-
主租户使用 BACKUP DATABASE PLUS ARCHIVELOG 功能执行数据备份。
开启归档模式后,主租户需要使用 BACKUP DATABASE PLUS ARCHIVELOG 功能执行一次数据备份,生成一份带有归档日志的完整数据集。
-
设置数据备份的备份目的端。
对于主租户为单机的场景,您可以将租户副本所在机器(observer 进程所在的机器)的一个可以访问路径作为备份目的端,且备份目的端与归档目的端的路径不能相同。其他场景,需要使用共享存储(例如,NFS 或 阿里云 OSS)作为备份目的端。
假设备份介质使用 NFS,备份目的端路径为
/data/1/sh_databackup
,示例如下:-
主租户所在集群的
sys
租户设置主租户的备份目的端ALTER SYSTEM SET DATA_BACKUP_DEST = 'file:///data/1/sh_databackup' TENANT = mysql;
其中,
mysql
为指定的主租户名。 -
主租户设置本租户的备份目的端
ALTER SYSTEM SET DATA_BACKUP_DEST = 'file:///data/1/sh_databackup';
设置备份目的端的详细操作,请参见 备份前准备。
-
-
执行数据备份。
-
主租户所在集群的
sys
租户对主租户执行数据备份ALTER SYSTEM BACKUP TENANT = mysql PLUS ARCHIVELOG;
其中,
mysql
为指定的主租户名。 -
主租户执行数据备份
ALTER SYSTEM BACKUP DATABASE PLUS ARCHIVELOG;
-
-
确认数据备份状态。
主租户下通过
DBA_OB_BACKUP_JOBS
视图(系统租户查询CDB_OB_BACKUP_JOBS
视图)查询数据备份进度的 SQL 语句如下:-
系统租户
SELECT * FROM oceanbase.CDB_OB_BACKUP_JOBS;
-
MySQL 租户
SELECT * FROM oceanbase.DBA_OB_BACKUP_JOBS;
-
Oracle 租户
SELECT * FROM SYS.DBA_OB_BACKUP_JOBS;
如果备份正在执行,则该视图中会显示备份任务的进度信息。查看数据备份进度的详细操作,请参见 查看数据备份进度。
如果备份已完成,可以通过
DBA_OB_BACKUP_JOB_HISTORY
视图(系统租户查询CDB_OB_BACKUP_JOB_HISTORY
视图)进一步查询数据备份历史。-
系统租户
SELECT * FROM oceanbase.CDB_OB_BACKUP_JOB_HISTORY;
-
MySQL 租户
SELECT * FROM oceanbase.DBA_OB_BACKUP_JOB_HISTORY;
-
Oracle 租户
SELECT * FROM SYS.DBA_OB_BACKUP_JOB_HISTORY;
查询数据备份历史的结果如下:
+--------+-------------+---------------+---------------------+------------------+--------------------+-----------------+-------------+-------------+-----------------+--------+----------------------------+----------------------------+-----------+--------+---------+-------------+-------------------------------+ | JOB_ID | INCARNATION | BACKUP_SET_ID | INITIATOR_TENANT_ID | INITIATOR_JOB_ID | EXECUTOR_TENANT_ID | PLUS_ARCHIVELOG | BACKUP_TYPE | JOB_LEVEL | ENCRYPTION_MODE | PASSWD | START_TIMESTAMP | END_TIMESTAMP | STATUS | RESULT | COMMENT | DESCRIPTION | PATH | +--------+-------------+---------------+---------------------+------------------+--------------------+-----------------+-------------+-------------+-----------------+--------+----------------------------+----------------------------+-----------+--------+---------+-------------+-------------------------------+ | 1 | 1 | 1 | 1004 | 0 | 1004 | ON | FULL | USER_TENANT | NONE | | 2023-04-07 19:52:35.361398 | 2023-04-07 19:58:57.223196 | COMPLETED | 0 | | | file:///data/1/sh_databackup | +--------+-------------+---------------+---------------------+------------------+--------------------+-----------------+-------------+-------------+-----------------+--------+----------------------------+----------------------------+-----------+--------+---------+-------------+-------------------------------+ 1 row in set
根据查询结果,当
STATUS
的值为COMPLETED
时,表示数据备份已完成。PLUS_ARCHIVELOG
列显示为ON
,表示使用的是 BACKUP DATABASE PLUS ARCHIVELOG 功能执行的数据备份,这样的备份目录下包含了数据库运行所必需的归档日志,两者一起构成了一份带有归档日志的完整数据集。 -
-
(可选)步骤二:主租户关闭归档模式
使用 BACKUP DATABASE PLUS ARCHIVELOG 功能执行数据备份后,如果不再需要持续进行日志归档了,可以关闭主租户的归档模式。
-
使用管理员用户登录主租户或主租户所在集群的
sys
租户。 -
执行以下命令,关闭主租户的归档模式。
-
主租户所在集群的
sys
租户关闭主租户的归档模式ALTER SYSTEM NOARCHIVELOG TENANT = mysql;
其中,
mysql
为指定的主租户名。 -
主租户关闭本租户的归档模式
ALTER SYSTEM NOARCHIVELOG;
-
步骤三:获取数据备份并放置在备租户可以访问的位置
-
从设置的备份目的端处获取主租户的数据备份。
例如,本文示例中,主租户数据备份的存放路径为
/data/1/sh_databackup
。 -
将获取的数据备份,放置在待创建的备租户可以访问的位置。
例如,对于主租户为单机的场景,只需要将数据备份打包并拷贝到备租户副本所在机器(observer 进程所在的机器)的一个可以访问的路径上。对于其他场景,可以放置在备租户可以访问的共享存储(例如,NFS 或 阿里云 OSS)上。
步骤四:使用带有归档日志的完整数据集恢复出租户
-
使用
root
用户登录到待创建的备租户所在集群的sys
租户。 -
执行以下命令,创建备租户所需的 Unit 规格。
创建新备租户所需的 Unit 规格时,不强制要求与源租户的 Unit 规格相同,允许使用更小的 Unit 规格。例如,创建一个 CPU 为 1 核且内存为 5 GB 的 Unit 规格
unit1
。例如,CREATE RESOURCE UNIT unit1 MAX_CPU 1, MEMORY_SIZE = '5G';
有关 Unit 规格的详细创建操作,请参见 创建租户。
-
创建备租户所需的资源池。
例如,创建资源池
pool_for_standby
。CREATE RESOURCE POOL pool_for_standby UNIT = 'unit1', UNIT_NUM = 1, ZONE_LIST = ('zone1','zone2','zone3');
有关资源池的详细创建操作,请参见 创建租户。
-
从主租户的带有归档日志的完整数据集中恢复出备租户。
假设获取到的数据备份放置在备租户可访问的路径
file:///data/1/sh_databackup
下,SQL 语句如下:ALTER SYSTEM RESTORE standby_tenant FROM 'file:///data/1/sh_databackup' WITH 'pool_list=pool_for_standby';
-
确认恢复是否完成。
恢复过程中,可以通过
DBA_OB_TENANTS
视图确认恢复是否完成。SELECT TENANT_NAME, TENANT_TYPE, CREATE_TIME, STATUS, TENANT_ROLE,SCN_TO_TIMESTAMP(SYNC_SCN) FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'standby_tenant';
查询结果如下:
+----------------+-------------+----------------------------+--------+-------------+----------------------------+ | TENANT_NAME | TENANT_TYPE | CREATE_TIME | STATUS | TENANT_ROLE | SCN_TO_TIMESTAMP(SYNC_SCN) | +----------------+-------------+----------------------------+--------+-------------+----------------------------+ | standby_tenant | USER | 2023-04-07 20:43:39.883628 | NORMAL | STANDBY | 2023-04-07 20:05:16.617492 | +----------------+-------------+----------------------------+--------+-------------+----------------------------+ 1 row in set
根据查询结果,当
TENANT_ROLE
的值为STANDBY
时,则表示备租户恢复完成。