联系我们
18591797788
hubin@rlctech.com
北京市海淀区中关村南大街乙12号院天作国际B座1708室
18681942657
lvyuan@rlctech.com
上海市浦东新区商城路660号乐凯大厦26c-1
18049488781
xieyi@rlctech.com
广州市越秀区东风东路华宫大厦808号1608房
029-81109312
service@rlctech.com
西安市高新区天谷七路996号西安国家数字出版基地C座501
在 OceanBase 物理主备容灾搭建过程中,不少运维同学使用CREATE STANDBY TENANT 创建备租户时,会遇到ERROR 4179 (HY000) 报错:primary tenant LS log may be recycled, create standby tenant is not allowed。
今天结合实操案例,带大家拆解报错根源、区分使用场景,并附上可直接落地的完整操作步骤。
在tenant 1 租户中,创建同步用户并授权:
obclient(root@tenant1)[oceanbase]> create user rep_user identified by 'aaAA11__';
obclient(root@tenant1)[oceanbase]> grant select on oceanbase.* to rep_user;
查询主租户的 IP 列表:
obclient(root@tenant1)[oceanbase]> select * from dba_ob_access_point;
+-----------+-------------+--------------+----------+
| TENANT_ID | TENANT_NAME | SVR_IP | SQL_PORT |
+-----------+-------------+--------------+----------+
| 1002 | tenant1 | xx.yy.zz.104 | 2881 |
| 1002 | tenant1 | xx.yy.zz.105 | 2881 |
| 1002 | tenant1 | xx.yy.zz.106 | 2881 |
+-----------+-------------+--------------+----------+
使用 sys 租户,创建供备租户使用的资源单元及资源池。
obclient(root@sys)[oceanbase]> create resource unit unit1 max_cpu=3, memory_size = '1G';
obclient(root@sys)[oceanbase]> create resource pool pool1 unit='unit1', unit_num=1,zone_list=('zone1','zone2','zone3');
obclient(root@sys)[oceanbase]> create standby tenant tenant1_back log_restore_source='service=xx.yy.zz.104:2881;xx.yy.zz.105:2881;xx.yy.zz.106:2881 user=rep_user@tenant1 password=aaAA11__' resource_pool_list=('pool1');
ERROR 4179 (HY000): primary tenant LS log may be recycled, create standby tenant is not allowed
创建失败,报错:ERROR 4179 (HY000) ,无法成功创建备租户。
ERROR 4179 (HY000) 报错分析报错:ERROR 4179 (HY000): primary tenant LS log may be recycled, create standby tenant is not allowed
该报错是 OceanBase 数据库在物理主备容灾场景下的一个保护性机制。这是使用 CREATE STANDBY TENANT 创建空白租户时的一个常见报错。
此错误的核心原因是:尝试创建备租户时,OceanBase 系统检测到主租户的日志可能不完整,无法提供从租户创建之初开始的全部日志流(Log Stream, LS)数据。
OceanBase 的备租户通过持续拉取并重放主租户的日志来保持数据同步。为了确保数据的一致性和完整性,创建备租户的操作要求主租户必须拥有从其自身创建时刻起至今的完整日志。如果主租户因为以下原因导致早期日志被回收(删除),就会触发此错误:
ha_low_thread_score) 影响了日志的保留。CREATE STANDBY TENANT 使用限制:
CREATE STANDBY TENANT 语句用于在物理备库场景中创建空的备租户。通过该方式创建备租户成功后,该备租户将自动进入持续同步状态。
GV$OB_LOG_STAT、GV$OB_UNITS、GV$OB_PARAMETERS、DBA_OB_ACCESS_POINT、DBA_OB_TENANTS、DBA_OB_LS 等系统视图的专用用户。sys 租户来创建空的备租户,且创建的备租户为只读模式。CREATE RESOURCE UNIT u1c1g MAX_CPU 1, MIN_CPU 1, MEMORY_SIZE '1G' ;
CREATE RESOURCE POOL mysql_pool UNIT 'u1c1g', UNIT_NUM 1, ZONE_LIST ('zone1','zone2','zone3');
CREATE TENANT mysql RESOURCE_POOL_LIST=('mysql_pool') SET ob_tcp_invited_nodes='%';
obclient(root@mysql)[oceanbase]> create user rep_user identified by 'aaAA11__';
obclient(root@mysql)[oceanbase]> grant select on oceanbase.* to rep_user;
obclient(root@mysql)[oceanbase]> select * from dba_ob_access_point;
+-----------+-------------+--------------+----------+
| TENANT_ID | TENANT_NAME | SVR_IP | SQL_PORT |
+-----------+-------------+--------------+----------+
| 1014 | mysql | xx.yy.zz.101 | 2881 |
| 1014 | mysql | xx.yy.zz.102 | 2881 |
| 1014 | mysql | xx.yy.zz.103 | 2881 |
+-----------+-------------+--------------+----------+
-- 创建资源池
obclient(root@sys)[oceanbase]> create resource pool mysql_std_pool1 unit='u1c1g', unit_num=1,zone_list=('zone1','zone2','zone3');
-- 创建备租户
obclient(root@sys)[oceanbase]> create standby tenant mysql_standby log_restore_source='service=xx.yy.zz.101:2881;xx.yy.zz.102:2881;xx.yy.zz.103:2881 user=rep_user@mysql password=aaAA11__' resource_pool_list=('mysql_std_pool1');
Query OK, 0 rows affected (1 min 10.265 sec)
-- 查询租户信息
obclient(root@sys)[oceanbase]> SELECT TENANT_NAME, TENANT_TYPE, CREATE_TIME, STATUS, TENANT_ROLE,SCN_TO_TIMESTAMP(SYNC_SCN) FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME like 'mysql%';
+---------------+-------------+----------------------------+--------+-------------+----------------------------+
| TENANT_NAME | TENANT_TYPE | CREATE_TIME | STATUS | TENANT_ROLE | SCN_TO_TIMESTAMP(SYNC_SCN) |
+---------------+-------------+----------------------------+--------+-------------+----------------------------+
| mysql | USER | 2026-04-07 10:11:42.187516 | NORMAL | PRIMARY | 2026-04-07 10:29:43.606412 |
| mysql_standby | USER | 2026-04-07 10:18:25.191779 | NORMAL | STANDBY | 2026-04-07 10:29:44.514500 |
+---------------+-------------+----------------------------+--------+-------------+----------------------------+
可以看到,这次创建空的备租户成功了。因为新创建的主租户,其日志是完整的。
OceanBase 数据库提供了三种方式创建备租户:
CREATE STANDBY TENANT 语句创建备租户。简单来说,CREATE STANDBY TENANT 命令适用于“白手起家”的场景(全新的主租户)。
对于已经承载业务的主租户(已经运行一段时间、不确定日志是否完整),建议采用物理备份恢复(带日志)功能创建备租户,以避免因日志不完整而导致的此错误。