首批通过分布式安全可靠测评,为关键业务系统打造
副本类型转换
更新时间:2026-04-04 13:26:44
根据业务需要,可以将租户下日志流的 F 副本转换为 R 副本或者 R 副本转换为 F 副本。
注意事项
当前仅 R 副本与 F 副本支持副本类型的相互转换,C 副本不支持副本类型转换。
通过修改 Locality 转换副本类型
示例:将租户 mysql001 的 Locality 由 F@zone1,F@zone2,F@zone3 修改为 F@zone1,F@zone2,R@zone3。
使用 root 用户登录到集群的 sys 租户。
连接示例如下:
obclient -h172.30.xxx.xxx -P2883 -uroot@sys#obdemo -pxxxx -A进入
oceanbase数据库。obclient>use oceanbase;查看修改前的 Locality。
obclient> SELECT TENANT_ID,TENANT_NAME,TENANT_TYPE,PRIMARY_ZONE,LOCALITY FROM oceanbase.DBA_OB_TENANTS;查询结果如下:
+-----------+-------------+-------------+-------------------+---------------------------------------------+ | TENANT_ID | TENANT_NAME | TENANT_TYPE | PRIMARY_ZONE | LOCALITY | +-----------+-------------+-------------+-------------------+---------------------------------------------+ | 1 | sys | SYS | RANDOM | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | | 1001 | META$1002 | META | zone1;zone3;zone2 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | | 1002 | mysql001 | USER | zone1;zone3;zone2 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | | 1003 | META$1004 | META | zone1;zone2;zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | | 1004 | oracle001 | USER | zone1;zone2;zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | +-----------+-------------+-------------+-------------------+---------------------------------------------+ 5 rows in set修改租户
mysql001的 Locality。obclient> ALTER TENANT mysql001 LOCALITY="F@zone1,F@zone2,R@zone3";查看 Locality 变更任务的执行状态。
obclient>SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE = 'ALTER_TENANT_LOCALITY';查询结果如下:
+--------+-----------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+-----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------+----------------+-------------+ | JOB_ID | JOB_TYPE | JOB_STATUS | RESULT_CODE | PROGRESS | START_TIME | MODIFY_TIME | TENANT_ID | SQL_TEXT | EXTRA_INFO | RS_SVR_IP | RS_SVR_PORT | +--------+-----------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+-----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------+----------------+-------------+ | 1 | ALTER_TENANT_LOCALITY | SUCCESS | NULL | 0 | 2024-04-10 11:16:46.242622 | 2024-04-10 11:16:46.242622 | 1002 | ALTER TENANT mysql001 LOCALITY="F@zone1,F@zone2,R@zone3" | FROM: 'FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3', TO: 'FULL{1}@zone1, FULL{1}@zone2, READONLY{1}@zone3' | 172.xx.xxx.192 | 2882 | +--------+-----------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+-----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------+----------------+-------------+ 1 rows in set根据查询结果,
JOB_STATUS显示为SUCCESS,表示 Locality 变更任务执行成功。查看修改后的 Locality。
obclient> SELECT TENANT_ID,TENANT_NAME,TENANT_TYPE,PRIMARY_ZONE,LOCALITY FROM oceanbase.DBA_OB_TENANTS;查询结果如下:
+-----------+-------------+-------------+-------------------+-------------------------------------------------+ | TENANT_ID | TENANT_NAME | TENANT_TYPE | PRIMARY_ZONE | LOCALITY | +-----------+-------------+-------------+-------------------+-------------------------------------------------+ | 1 | sys | SYS | RANDOM | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | | 1001 | META$1002 | META | zone1;zone3;zone2 | FULL{1}@zone1, FULL{1}@zone2, READONLY{1}@zone3 | | 1002 | mysql001 | USER | zone1;zone3;zone2 | FULL{1}@zone1, FULL{1}@zone2, READONLY{1}@zone3 | | 1003 | META$1004 | META | zone1;zone2;zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | | 1004 | oracle001 | USER | zone1;zone2;zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | +-----------+-------------+-------------+-------------------+-------------------------------------------------+ 5 rows in set通过步骤 3 与步骤 6 的查询比较,租户
mysql001的 Locality 由原来的FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3变为FULL{1}@zone1, FULL{1}@zone2, READONLY{1}@zone3,租户mysql001的副本类型转换成功。
手动转换副本类型
当通过修改 Locality 的方式修改副本类型时,正常情况下,系统会自动转换副本类型,但由于一些异常原因,导致系统未正常工作,可以通过 ALTER SYSTEM MODIFY REPLICA 命令手动进行副本类型转换。
使用限制
系统租户(sys 租户)可以对所有租户的日志流执行副本类型转换操作,用户租户只能对本租户的日志流执行副本类型转换操作。
租户的同一个日志流,除了副本迁移任务可以并行执行多个以外,其他容灾任务(包括添加副本、删除副本、转换副本类型、修改日志流的法定成员数等)每次只能执行一个。
sys 租户可以通过视图
CDB_OB_LS_REPLICA_TASKS确认是否有正在运行的容灾任务;用户租户可以通过视图DBA_OB_LS_REPLICA_TASKS确认是否有正在运行的容灾任务。
前提条件
在执行副本类型转换操作前,请确认当前用户拥有
ALTER SYSTEM权限,否则无法执行ALTER SYSTEM MODIFY REPLICA命令。在查询视图前,请确认当前用户拥有以下视图的
SELECT权限,否则无法查询相关信息。DBA_OB_TENANTSDBA_OB_LS/CDB_OB_LSDBA_OB_LS_LOCATIONS/CDB_OB_LS_LOCATIONS
操作步骤
假设当前有一个 tenant1 租户,其 Locality 为 F@zone1,F@zone2,R@zone3,同时,tenant1 租户的 1002 日志流仅在 zone1 和 zone2 各有一个 F 类型的副本,在 zone3 上也有一个 F 类型的副本。现在需要手动将 zone3 上的 F 副本转换为 R 副本。
用户登录到集群对应的租户。
连接示例如下:
obclient -h172.30.xxx.xxx -P2883 -uroot@tenant1#obdemo -pxxxx -A有关更加详细的连接数据库的操作指引,参见 连接数据库概述(MySQL 模式) 和 连接数据库概述(Oracle 模式)。
获取待操作的租户对应的租户 ID 及 Locality 信息。
系统租户
obclient [oceanbase]> SELECT TENANT_NAME,TENANT_ID,LOCALITY FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME='tenant1';用户租户
MySQL 模式Oracle 模式MySQL 模式下执行以下语句:
obclient [oceanbase]> SELECT TENANT_NAME,TENANT_ID,LOCALITY FROM oceanbase.DBA_OB_TENANTS;Oracle 模式下执行以下语句:
obclient [SYS]> SELECT TENANT_NAME,TENANT_ID,LOCALITY FROM SYS.DBA_OB_TENANTS;查询结果的示例如下:
+-------------+-----------+-------------------------------------------------+ | TENANT_NAME | TENANT_ID | LOCALITY | +-------------+-----------+-------------------------------------------------+ | tenant1 | 1002 | FULL{1}@zone1, FULL{1}@zone2, READONLY{1}@zone3 | +-------------+-----------+-------------------------------------------------+ 1 row in set根据查询结果,该租户对应的租户 ID 为
1002。有关视图
DBA_OB_TENANTS中各字段的详细说明,请参见 DBA_OB_TENANTS。
获取待操作租户的所有日志流信息。
系统租户
obclient [oceanbase]> SELECT * FROM oceanbase.CDB_OB_LS WHERE TENANT_ID=1002;有关视图
CDB_OB_LS中各字段的详细说明,请参见 CDB_OB_LS。用户租户
MySQL 模式Oracle 模式MySQL 模式下执行以下语句:
obclient [oceanbase]> SELECT * FROM oceanbase.DBA_OB_LS;Oracle 模式下执行以下语句:
obclient [SYS]> SELECT * FROM SYS.DBA_OB_LS;查询结果的示例如下:
+-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+ | LS_ID | STATUS | PRIMARY_ZONE | UNIT_GROUP_ID | LS_GROUP_ID | CREATE_SCN | DROP_SCN | SYNC_SCN | READABLE_SCN | FLAG | +-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+ | 1 | NORMAL | zone1;zone2 | 0 | 0 | NULL | NULL | 1712122872503652000 | 1712122872503652000 | | | 1001 | NORMAL | zone1;zone2 | 1002 | 1001 | 1711951977207156000 | NULL | 1712122872503652000 | 1712122872503652000 | | +-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+ 2 rows in set根据查询结果可知,tenant1 租户有一个 1 号日志流和一个 1001 号日志流。
有关视图
DBA_OB_LS中各字段的详细说明,请参见 DBA_OB_LS。
查看待操作租户日志流的副本分布。
系统租户
obclient [oceanbase]> SELECT * FROM oceanbase.CDB_OB_LS_LOCATIONS WHERE LS_ID=1001 AND TENANT_ID=1002;有关视图
CDB_OB_LS_LOCATIONS中各字段的详细说明,请参见 CDB_OB_LS_LOCATIONS。用户租户
MySQL 模式Oracle 模式MySQL 模式下执行以下语句:
obclient [oceanbase]> SELECT * FROM oceanbase.DBA_OB_LS_LOCATIONS WHERE LS_ID=1001;Oracle 模式下执行以下语句:
obclient [SYS]> SELECT * FROM SYS.DBA_OB_LS_LOCATIONS WHERE LS_ID=1001;查询结果的示例如下:
+---------------------+---------------------+-------+----------------+----------+----------+-------+----------+-------------------------------------------------------------------+----------------------+--------------+--------------+---------+ | CREATE_TIME | MODIFY_TIME | LS_ID | SVR_IP | SVR_PORT | SQL_PORT | ZONE | ROLE | MEMBER_LIST | PAXOS_REPLICA_NUMBER | REPLICA_TYPE | LEARNER_LIST | REBUILD | +---------------------+---------------------+-------+----------------+----------+----------+-------+----------+-------------------------------------------------------------------+----------------------+--------------+--------------+---------+ | 01-APR-24 02.13.04. | 01-APR-24 02.13.04. | 1001 | 172.xx.xxx.192 | 2882 | 2881 | zone3 | FOLLOWER | NULL | NULL | FULL | NULL | FALSE | | 01-APR-24 02.13.04. | 01-APR-24 02.13.04. | 1001 | 172.xx.xxx.212 | 2882 | 2881 | zone2 | FOLLOWER | NULL | NULL | FULL | NULL | FALSE | | 01-APR-24 02.13.04. | 01-APR-24 02.13.10. | 1001 | 172.xx.xxx.226 | 2882 | 2881 | zone1 | LEADER | 172.xx.xxx.192:2882:1,172.xx.xxx.212:2882:1,172.xx.xxx.226:2882:1 | 3 | FULL | NULL | FALSE | +---------------------+---------------------+-------+----------------+----------+----------+-------+----------+-------------------------------------------------------------------+----------------------+--------------+--------------+---------+ 3 rows in set根据查询结果可知,租户的 1001 号 日志流在
172.xx.xxx.192:2882、172.xx.xxx.212:2882和172.xx.xxx.226:2882上均有一个 F 类型的副本。再结合查询的 Locality 信息,zone3上的副本类型应该是 R 类型,需要将100.xx.xxx.192:2882上的 F 副本转换为 R 副本。有关视图
DBA_OB_LS_LOCATIONS中各字段的详细说明,请参见 DBA_OB_LS_LOCATIONS。
执行副本类型转换命令。
语句如下:
ALTER SYSTEM MODIFY REPLICA LS [=] ls_id SERVER [=] 'svr_ip:svr_port' REPLICA_TYPE [=] 'replica_type' [PAXOS_REPLICA_NUM [=] paxos_replica_num] [TENANT [=] 'tenant_name'];语句使用说明:
ls_id:指定待转换副本类型的日志流 ID。svr_ip:svr_port:指定待转换副本类型的目标服务器的 IP 及端口号。示例:172.xx.xxx.192:2882。replica_type:指定转换后的目标副本类型。当前支持以下两种副本类型的相互转换:全功能型副本:使用
FULL或F表示。只读副本:使用
READONLY或R表示。
paxos_replica_num:指定修改后日志流的法定成员数,即租户 Locality 中全功能型(F)副本的数量。同时一个日志流的 F 副本数最多为 7 个。指定该参数的值时,需要注意以下事项:
如果是将 F 副本转换为 R 副本,转换后,相当于删除了一个 F 副本,故
paxos_replica_num的值需要减去 1。如果是将 R 副本转换为 F 副本,转换后,相当于添加了一个 F 副本,故
paxos_replica_num的值需要加上 1。修改后,
paxos_replica_num需要满足多数派。paxos_replica_num的值需要大于等于当前 Leader 副本中MEMBER_LIST的成员个数。sys 租户可以通过查询视图CDB_OB_LS_LOCATIONS确认;用户租户可以通过查询视图DBA_OB_LS_LOCATIONS确认。paxos_replica_num值变化的绝对值不能大于 1。例如,如果当前paxos_replica_num为3,只能将paxos_replica_num修改为2或4。
如果指定的值有以上任一条件不满足,则系统会报错。如果不显式指定该值,系统将使用当前默认的
paxos_replica_num。例如,本示例中,paxos_replica_num默认为 3。tenant_name:指定待操作的租户。系统租户可以指定其他租户,用户租户只能指定本租户。如果不显式指定待操作的租户,则默认租户名为当前租户。本语句不支持使用all、all_user、all_meta等指定所有租户、用户租户以及所有 Meta 租户。本语句一次只能修改一个副本的类型。
示例如下:
obclient> ALTER SYSTEM MODIFY REPLICA LS = 1001 SERVER='172.xx.xxx.192:2882' REPLICA_TYPE='R' PAXOS_REPLICA_NUM=2;命令执行成功后,再次查看目标日志流的副本分布。
系统租户
obclient [oceanbase]> SELECT * FROM oceanbase.CDB_OB_LS_LOCATIONS WHERE LS_ID=1001 AND TENANT_ID=1002;用户租户
MySQL 模式Oracle 模式MySQL 模式下执行以下语句:
obclient [oceanbase]> SELECT * FROM oceanbase.DBA_OB_LS_LOCATIONS WHERE LS_ID=1001;Oracle 模式下执行以下语句:
obclient [SYS]> SELECT * FROM SYS.DBA_OB_LS_LOCATIONS WHERE LS_ID=1001;查询结果的示例如下:
+---------------------+---------------------+-------+----------------+----------+----------+-------+----------+---------------------------------------------+----------------------+--------------+-------------------------+---------+ | CREATE_TIME | MODIFY_TIME | LS_ID | SVR_IP | SVR_PORT | SQL_PORT | ZONE | ROLE | MEMBER_LIST | PAXOS_REPLICA_NUMBER | REPLICA_TYPE | LEARNER_LIST | REBUILD | +---------------------+---------------------+-------+----------------+----------+----------+-------+----------+---------------------------------------------+----------------------+--------------+-------------------------+---------+ | 01-APR-24 02.13.04. | 03-APR-24 01.52.17. | 1001 | 172.xx.xxx.192 | 2882 | 2881 | zone3 | FOLLOWER | NULL | NULL | READONLY | NULL | FALSE | | 01-APR-24 02.13.04. | 03-APR-24 01.52.18. | 1001 | 172.xx.xxx.212 | 2882 | 2881 | zone2 | FOLLOWER | NULL | NULL | FULL | NULL | FALSE | | 01-APR-24 02.13.04. | 03-APR-24 01.52.17. | 1001 | 172.xx.xxx.226 | 2882 | 2881 | zone1 | LEADER | 172.xx.xxx.212:2882:1,172.xx.xxx.226:2882:1 | 2 | FULL | 172.xx.xxx.192:2882:1:0 | FALSE | +---------------------+---------------------+-------+----------------+----------+----------+-------+----------+---------------------------------------------+----------------------+--------------+-------------------------+---------+ 3 rows in set从查询结果可知,租户的 1001 号 日志流在
172.xx.xxx.192:2882上的副本变成了 R 类型的副本。