OceanBase 数据库无主状态的排查方法

介绍如何确认无主,以及造成无主的原因的排查方法。

适用版本

OceanBase 数据库所有版本

确认无主状态

对于容灾场景的测试过程中,经常会出现无主的情况,Election 模块的正常工作依赖于集群多数派副本进程正常且多数派与 Leader 间的网络连通。可以搜索

election.log

日志查看当前是否有副本无主。

[admin@hostname log]$ grep ‘lease is expire’ election.log

如果上述日志具有内容,则表示当前存在副本无主。

此外,还可以通过以下方式确认是否有副本处于无主状态。

  • 通过

    table_id

    partition_idx

    查询

    __all_meta_table

    (对于 OceanBase 数据库 V2.X 及后续版本,查询

  • __all_virtual_meta_table

    )、

    __all_virtual_clog_stat

    __all_virtual_election_info

    表,查看

    role

    leader

    列的情况。

  • 如果所有分区的

    role

    均为 2,则表示该分区无主;如果

    leader

    为空,也表示无主。

obclient> SELECT * FROM __all_meta_table WHERE table_id=xxx; obclient> SELECT * FROM __all_virtual_meta_table WHERE table_id=xxx; obclient> SELECT * FROM __all_virtual_clog_stat WHERE table_id=xxx AND partition_idx=xxxx; obclient> SELECT * FROM __all_virtual_election_info WHERE table_id=xxx AND partition_idx=xxxx;

  • 如果无法查询内部表,可以通过

    partition_key

    搜索

    observer.log

    日志,如果有 Clog 日志打印的

    ERROR

    日志中包含

    reconfirm

    leader_active_need_swtich

    等关键词,也表示有分区无主。

[admin@hostname log]$ grep ‘{tid:xxxxxxxxxxxxxxx, partition_id:x, part_cnt:x}’ observer.log

  • 通过

    partition_key

    搜索

    election.log

    日志,如果出现 ERROR 级别的

    leader_revoke

    信息,表示有 Leader 卸任,此时有分区无主。

[admin@hostname log]$ grep ‘{tid:xxxxxxxxxxxxxxxx, partition_id:x, part_cnt:x}’ election.log