在 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 命令适用于“白手起家”的场景(全新的主租户)。
对于已经承载业务的主租户(已经运行一段时间、不确定日志是否完整),建议采用 物理备份恢复(带日志)功能创建备租户,以避免因日志不完整而导致的此错误。
如果在操作过程中遇到问题,欢迎在评论区留言交流,后续我们会持续分享更多实战运维干货,记得关注不迷路,下次见~

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70047467/viewspace-3173981/ ,如需转载,请注明出处,否则将追究法律责任。