在 OceanBase 数据库中,执行 Locality 变更后执行合并,合并超时。本文介绍出现该问题的原因以及解决方法。
影响版本
OceanBase 数据库所有版本。
问题现象
对 3 副本集群 test_tenant 变更租户的 Locality 为 5 副本后,继续执行 Locality 变更为 6 副本失败,错误信息如下:
obclient> ALTER TENANT test_tenant set locality = ‘F{1}@z1,F{1}@z2,F{1}@z3,F{1}@z4,F{1}@z5,F{1}@z6’; ERROR 4012(HY000) : invalid argument
此时如果执行合并,则会发生合并超时,部分分区无法合并,错误信息如下:
2020-08-28 09:18:33.872750] WARN [RS] filter_readonly_at_all (ob_alloc_replica_strategy.cpp:1796) [81122][YB420B1E46D2-0005ADC96FE74ADB] [lt=15] filter readonly@all locality, lost replica(*zone=NA633_7, readonly_count=17, expect_readonly_count=19, REPLICA_TYPE_READONLY=16, table_id_=1101710651081591, partition_id_=0)
可能原因
引起问题的原因是进行了变更 Locality 操作,因此考虑 Locality 问题。
OceanBase 数据库中,表级与租户级都具有 Locality 配置,如果表级的 Locality 设置与当前租户的 Locality 不一致,则会出现错误。
在 sys 租户上的
__all_table
表上查询表级与租户级的 Locality 发现是由于二者不一致导致的错误。查询语句如下:
obclient>SELECT a.tenant_id,a.table_name,a.locality FROM gv$table a,gv$tenant b WHERE a.tenant_id = b.tenant_id AND a.locality <> b.locality ;
解决方式
- 对表级的 Locality 进行同样的变更,保证与租户级的 Locality 一致。
obclient> ALTER TABLE table_name SET locality= ‘F{1}@z1,F{1}@z2,F{1}@z3,F{1}@z4,F{1}@z5’;
- 重新修改租户的 Locality 设置。
obclient> ALTER TENANT test_tenant set locality = ‘F{1}@z1,F{1}@z2,F{1}@z3,F{1}@z4,F{1}@z5,F{1}@z6’;
- 重新发起合并。
obclient> ALTER SYSTEM MAJOR FREEZE;