×
技术社区 >  技术博客 >  OceanBase 创建空白租户 ERROR 4179 报错分析与解决方案

OceanBase 创建空白租户 ERROR 4179 报错分析与解决方案

在 OceanBase 物理主备容灾搭建过程中,不少运维同学使用CREATE STANDBY TENANT 创建备租户时,会遇到ERROR 4179 (HY000) 报错:primary tenant LS log may be recycled, create standby tenant is not allowed

今天结合实操案例,带大家拆解报错根源、区分使用场景,并附上可直接落地的完整操作步骤。

1. 创建同步用户

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 |
+-----------+-------------+--------------+----------+

2. 创建备租户

2.1 创建资源单元及资源池

使用 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');

2.2 创建备租户

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) ,无法成功创建备租户。

3. 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_STATGV$OB_UNITSGV$OB_PARAMETERSDBA_OB_ACCESS_POINTDBA_OB_TENANTSDBA_OB_LS 等系统视图的专用用户。
  • 需要通过待创建的备租户所在集群的 sys 租户来创建空的备租户,且创建的备租户为只读模式。

4. 创建新的主租户及其备租户

4.1 创建新的主租户

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='%';

4.2 创建主租户的同步用户并授权

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 |
+-----------+-------------+--------------+----------+

4.3 创建备租户

-- 创建资源池
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 |
+---------------+-------------+----------------------------+--------+-------------+----------------------------+

可以看到,这次创建空的备租户成功了。因为新创建的主租户,其日志是完整的。

5. 总结

OceanBase 数据库提供了三种方式创建备租户:

  • 创建空备租户:若主租户为刚刚新创建的主租户,或者用户可以确认主租户所在集群或日志归档介质上保存有该主租户自创建后完整的日志,则其备租户在创建时不需要依赖除日志外的其他基线或转储数据。此时,可以通过 CREATE STANDBY TENANT 语句创建备租户。
  • 使用物理备份恢复(带日志)功能创建备租户:该方式为创建备租户的通用方式,任何场景下均适用。
  • 使用 BACKUP DATABASE PLUS ARCHIVELOG 功能创建备租户:由于使用常规的物理备份恢复(带日志)功能创建备租户时,要求使用共享存储(例如,OSS、NFS 等)来保存数据备份和日志归档,同时要求主租户和备租户所在的集群可以同时访问共享存储。使用 BACKUP DATABASE PLUS ARCHIVELOG 功能,将主租户的所有数据和归档日志在本机上生成一份数据库的快照,该快照中包含了基线数据和数据库运行必需的归档日志,再将该快照上传到待创建的备租户所在集群可以访问的介质上,最后使用数据库快照恢复出一个备租户。

简单来说,CREATE STANDBY TENANT 命令适用于“白手起家”的场景(全新的主租户)。

对于已经承载业务的主租户(已经运行一段时间、不确定日志是否完整),建议采用物理备份恢复(带日志)功能创建备租户,以避免因日志不完整而导致的此错误。

精选推荐