You can convert a full-featured replica of a log stream to a read-only replica or a read-only replica of a log stream to a full-featured replica based on your business needs.
Considerations
OceanBase Database supports only the conversion between full-featured and read-only replicas.
Convert the type of a replica by modifying the locality
The following example describes how to modify the locality of the mysql001 tenant from F@zone1,F@zone2,F@zone3 to F@zone1,F@zone2,R@zone3.
Log in to the
systenant of the cluster as therootuser.Here is an example:
obclient -h172.30.xxx.xxx -P2883 -uroot@sys#obdemo -pxxxx -AAccess the database named
oceanbase.obclient>use oceanbase;View the locality.
obclient> SELECT TENANT_ID,TENANT_NAME,TENANT_TYPE,PRIMARY_ZONE,LOCALITY FROM oceanbase.DBA_OB_TENANTS;The query result is as follows:
+-----------+-------------+-------------+-------------------+---------------------------------------------+ | 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 setModify the locality of the
mysql001tenant.obclient> ALTER TENANT mysql001 LOCALITY="F@zone1,F@zone2,R@zone3";View the execution status of the locality modification job.
obclient>SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE = 'ALTER_TENANT_LOCALITY';The query result is as follows:
+--------+-----------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+-----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------+----------------+-------------+ | 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 setIf the value of
JOB_STATUSisSUCCESS, the locality modification job is successful.View the modified locality.
obclient> SELECT TENANT_ID,TENANT_NAME,TENANT_TYPE,PRIMARY_ZONE,LOCALITY FROM oceanbase.DBA_OB_TENANTS;The query result is as follows:
+-----------+-------------+-------------+-------------------+-------------------------------------------------+ | 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 setThe query results in step 3 and step 6 show that the locality of the
mysql001tenant is changed fromFULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3toFULL{1}@zone1, FULL{1}@zone2, READONLY{1}@zone3, and the type of a replica of themysql001tenant has changed.
Manually convert the type of a replica
When you convert the type of a replica by modifying the locality of the tenant, the system automatically converts the type of the replica. However, if the system does not properly convert the type of the replica due to exceptions, you can execute the ALTER SYSTEM MODIFY REPLICA statement to convert the type of the replica.
Limitations
You can convert the types of replicas for log streams of all tenants in the
systenant but only for log streams of the current tenant in a user tenant.One log stream of a tenant supports only one replica task at a time, such as a task to add replicas, remove replicas, convert the type of a replica, modify the number of Paxos replicas of a log stream, or migrate replicas.
You can query ongoing replica tasks from the
CDB_OB_LS_REPLICA_TASKSview in thesystenant or from theDBA_OB_LS_REPLICA_TASKSview in a user tenant.
Prerequisites
You have the
ALTER SYSTEMprivilege.You have the
SELECTprivilege on the following views:DBA_OB_TENANTSDBA_OB_LS/CDB_OB_LSDBA_OB_LS_LOCATIONS/CDB_OB_LS_LOCATIONS
Procedure
Assume that the locality of a tenant named tenant1 is F@zone1,F@zone2,R@zone3, and log stream 1001 of the tenant1 tenant has a full-featured replica in each of zone1, zone2, and zone3. To convert the full-featured replica in zone3 to a read-only replica, perform the following steps:
Log in to the target tenant.
Here is an example:
obclient -h172.30.xxx.xxx -P2883 -uroot@tenant1#obdemo -pxxxx -AFor more information about how to connect to a database, see Overview (MySQL mode) or Overview (Oracle mode).
Query the tenant ID and locality of the target tenant.
systenantobclient [oceanbase]> SELECT TENANT_NAME,TENANT_ID,LOCALITY FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME='tenant1';User tenant
MySQL modeOracle modeExecute the following statement in MySQL mode:
obclient [oceanbase]> SELECT TENANT_NAME,TENANT_ID,LOCALITY FROM oceanbase.DBA_OB_TENANTS;Execute the following statement in Oracle mode:
obclient [SYS]> SELECT TENANT_NAME,TENANT_ID,LOCALITY FROM SYS.DBA_OB_TENANTS;A sample query result is as follows:
+-------------+-----------+-------------------------------------------------+ | TENANT_NAME | TENANT_ID | LOCALITY | +-------------+-----------+-------------------------------------------------+ | tenant1 | 1002 | FULL{1}@zone1, FULL{1}@zone2, READONLY{1}@zone3 | +-------------+-----------+-------------------------------------------------+ 1 row in setThe query result shows that the tenant ID is
1002.For more information about the fields in the
DBA_OB_TENANTSview, see DBA_OB_TENANTS.
Query all log streams of the target tenant.
systenantobclient [oceanbase]> SELECT * FROM oceanbase.CDB_OB_LS WHERE TENANT_ID=1002;For more information about the fields in the
CDB_OB_LSview, see CDB_OB_LS.User tenant
MySQL modeOracle modeExecute the following statement in MySQL mode:
obclient [oceanbase]> SELECT * FROM oceanbase.DBA_OB_LS;Execute the following statement in Oracle mode:
obclient [SYS]> SELECT * FROM SYS.DBA_OB_LS;A sample query result is as follows:
+-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+ | 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 setThe query result shows that the
tenant1tenant has log streams1and1001.For more information about the fields in the
DBA_OB_LSview, see DBA_OB_LS.
Query the replica distribution of the target log stream of the tenant.
systenantobclient [oceanbase]> SELECT * FROM oceanbase.CDB_OB_LS_LOCATIONS WHERE LS_ID=1001 AND TENANT_ID=1002;For more information about the fields in the
CDB_OB_LS_LOCATIONSview, see CDB_OB_LS_LOCATIONS.User tenant
MySQL modeOracle modeExecute the following statement in MySQL mode:
obclient [oceanbase]> SELECT * FROM oceanbase.DBA_OB_LS_LOCATIONS WHERE LS_ID=1001;Execute the following statement in Oracle mode:
obclient [SYS]> SELECT * FROM SYS.DBA_OB_LS_LOCATIONS WHERE LS_ID=1001;A sample query result is as follows:
+---------------------+---------------------+-------+----------------+----------+----------+-------+----------+-------------------------------------------------------------------+----------------------+--------------+--------------+---------+ | 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 setThe query result shows that log stream
1001has a full-featured replica on each of OBServer nodes172.xx.xxx.192:2882,172.xx.xxx.212:2882, and172.xx.xxx.226:2882. However, the locality of the tenant shows that a read-only replica is required inzone3. Therefore, you must convert the full-featured replica on OBServer node172.xx.xxx.192:2882to a read-only replica.For more information about the fields in the
DBA_OB_LS_LOCATIONSview, see DBA_OB_LS_LOCATIONS.
Execute the
ALTER SYSTEM MODIFY REPLICAstatement to convert the type of the replica.The syntax is as follows:
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'];The parameters in the syntax are described as follows:
ls_id: the ID of the log stream for which you want to convert the type of the replica.svr_ip:svr_port: the IP address and port number of the OBServer node on which you want to convert the type of the replica, for example,172.xx.xxx.192:2882.replica_type: the replica type to convert to. Conversion between the following two types of replicas is supported:- Full-featured replica: denoted as
FULLorF.
*Read-only replica: denoted as
READONLYorR.- Full-featured replica: denoted as
paxos_replica_num: the modified number of Paxos replicas of the log stream, which is the number of full-featured replicas specified in the locality of the tenant. A log stream supports a maximum of seven full-featured replicas.When you specify the
paxos_replica_numparameter, take note of the following considerations:Converting a full-featured replica to a read-only replica is equivalent to removing a full-featured replica. In this case, you must decrease the value of the
paxos_replica_numparameter by 1.Converting a read-only replica to a full-featured replica is equivalent to adding a full-featured replica. In this case, you must increase the value of the
paxos_replica_numparameter by 1.After the value of the
paxos_replica_numparameter is modified, the available replicas are the majority.The value of the
paxos_replica_numparameter must be greater than or equal to the number of members in theMEMBER_LISTof the leader. You can query theMEMBER_LISTfrom theCDB_OB_LS_LOCATIONSview in thesystenant or from theDBA_OB_LS_LOCATIONSview in a user tenant.The absolute value of the variation of the
paxos_replica_numvalue is not greater than 1. For example, if the value of thepaxos_replica_numparameter is3, you can change it only to2or4.
If any one of the preceding conditions is not met, the system will return an error. If this parameter is not specified, the default value is used. In this example, the default value is
3.tenant_name: the name of the target tenant. You can specify another tenant in thesystenant and specify only the current tenant in a user tenant. If this parameter is not specified, the name of the current tenant is used. You cannot use theall,all_user, orall_metaoption in this statement to specify all tenants, all user tenants, or all meta tenants.This statement converts the type of one replica at a time.
Here is an example:
obclient> ALTER SYSTEM MODIFY REPLICA LS = 1001 SERVER='172.xx.xxx.192:2882' REPLICA_TYPE='R' PAXOS_REPLICA_NUM=2;Query the replica distribution of the target log stream again.
systenantobclient [oceanbase]> SELECT * FROM oceanbase.CDB_OB_LS_LOCATIONS WHERE LS_ID=1001 AND TENANT_ID=1002;User tenant
MySQL modeOracle modeExecute the following statement in MySQL mode:
obclient [oceanbase]> SELECT * FROM oceanbase.DBA_OB_LS_LOCATIONS WHERE LS_ID=1001;Execute the following statement in Oracle mode:
obclient [SYS]> SELECT * FROM SYS.DBA_OB_LS_LOCATIONS WHERE LS_ID=1001;A sample query result is as follows:
+---------------------+---------------------+-------+----------------+----------+----------+-------+----------+---------------------------------------------+----------------------+--------------+-------------------------+---------+ | 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 setThe query result shows that the full-featured replica of log stream
1001on OBServer node172.xx.xxx.192:2882is converted to a read-only replica.