租户 Locality 变更失败,合并超时怎样处理?

在 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 ;

解决方式

  1. 对表级的 Locality 进行同样的变更,保证与租户级的 Locality 一致。

obclient> ALTER TABLE table_name SET locality= ‘F{1}@z1,F{1}@z2,F{1}@z3,F{1}@z4,F{1}@z5’;

  1. 重新修改租户的 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’;

  1. 重新发起合并。

obclient> ALTER SYSTEM MAJOR FREEZE;

通常是不需要去修改表的默认locality。

早期的版本里,复制表是需要指定locality,这容易被忘记。好像是 3.1后面的版本,复制表再也不用指定locality了。

详细用法可以看这篇分享 :OceanBase 独立部署高级玩法三:副本数调整 (qq.com)

1 个赞