Cluster reload Error “RuntimeError: 'NoneType' object is not iterable”

【 使用环境 】 测试环境
【 OB or 其他组件 】 oceanbase-ce
【 使用版本 】4.2.1.8
【问题描述】 集群reload报错
【附件及日志】

查看日志:

[2025-03-25 20:33:27.323] [DEBUG] -- obshell_port is not a oceanbase parameter. skip
[2025-03-25 20:33:27.323] [DEBUG] -- production_mode is not a oceanbase parameter. skip
[2025-03-25 20:33:27.323] [DEBUG] -- apply new configuration
[2025-03-25 20:33:27.323] [INFO] Reload observer
[2025-03-25 20:33:27.324] [DEBUG] -- execute sql: alter system reload server. args: None
[2025-03-25 20:33:27.326] [DEBUG] -- execute sql: alter system reload zone. args: None
[2025-03-25 20:33:27.330] [DEBUG] -- execute sql: alter system reload unit. args: None
[2025-03-25 20:33:27.455] [DEBUG] - sub reload ref count to 0
[2025-03-25 20:33:27.455] [DEBUG] - export reload
[2025-03-25 20:33:27.455] [DEBUG] - plugin oceanbase-ce-py_script_reload-4.2.1.4 result: True
[2025-03-25 20:33:27.455] [DEBUG] - Searching obshell_password_reload plugin for components ...
[2025-03-25 20:33:27.456] [DEBUG] - Searching obshell_password_reload plugin for oceanbase-ce-4.2.1.8-108000022024072217.el7-499b676f2ede5a16e0c07b2b15991d1160d972e8
[2025-03-25 20:33:27.456] [DEBUG] - Found for oceanbase-ce-py_script_obshell_password_reload-4.2.1.4 for oceanbase-ce-4.2.1.8
[2025-03-25 20:33:27.457] [DEBUG] - Call plugin oceanbase-ce-py_script_obshell_password_reload-4.2.1.4 for oceanbase-ce-4.2.1.8-108000022024072217.el7-499b676f2ede5a16e0c07b2b15991d1160d972e8
[2025-03-25 20:33:27.457] [DEBUG] - import obshell_password_reload
[2025-03-25 20:33:28.180] [DEBUG] - add obshell_password_reload ref count to 1
[2025-03-25 20:33:28.183] [ERROR] oceanbase-ce-py_script_obshell_password_reload-4.2.1.4 RuntimeError: 'NoneType' object is not iterable
[2025-03-25 20:33:28.183] [ERROR] Traceback (most recent call last):
[2025-03-25 20:33:28.183] [ERROR]   File "core.py", line 2393, in reload_cluster
[2025-03-25 20:33:28.183] [ERROR]   File "core.py", line 2437, in _reload_cluster
[2025-03-25 20:33:28.183] [ERROR]   File "core.py", line 228, in run_workflow
[2025-03-25 20:33:28.183] [ERROR]   File "core.py", line 270, in run_plugin_template
[2025-03-25 20:33:28.183] [ERROR]   File "core.py", line 315, in call_plugin
[2025-03-25 20:33:28.184] [ERROR]   File "_plugin.py", line 347, in __call__
[2025-03-25 20:33:28.184] [ERROR]   File "_plugin.py", line 304, in _new_func
[2025-03-25 20:33:28.184] [ERROR]   File "/home/dba/.obd/plugins/oceanbase-ce/4.2.1.4/obshell_password_reload.py", line 31, in obshell_password_reload
[2025-03-25 20:33:28.184] [ERROR]     for key in global_change_conf:
[2025-03-25 20:33:28.184] [ERROR] TypeError: 'NoneType' object is not iterable
[2025-03-25 20:33:28.184] [ERROR]
[2025-03-25 20:33:28.184] [DEBUG] - sub obshell_password_reload ref count to 0
[2025-03-25 20:33:28.184] [DEBUG] - export obshell_password_reload
[2025-03-25 20:33:28.184] [DEBUG] - plugin oceanbase-ce-py_script_obshell_password_reload-4.2.1.4 result: False
[2025-03-25 20:33:28.186] [DEBUG] - open /home/dba/.obd/cluster/mediatest_ocpserver_ce/inner_config.yaml for w
[2025-03-25 20:33:28.204] [WARNING] Some configuration items reload failed
[2025-03-25 20:33:28.209] [INFO] See https://www.oceanbase.com/product/ob-deployer/error-codes .
[2025-03-25 20:33:28.209] [INFO] Trace ID: 588553ea-0975-11f0-8bfb-246e96c6abc8
[2025-03-25 20:33:28.210] [INFO] If you want to view detailed obd logs, please run: obd display-trace 588553ea-0975-11f0-8bfb-246e96c6abc8
[2025-03-25 20:33:28.210] [DEBUG] - unlock /home/dba/.obd/lock/global
[2025-03-25 20:33:28.211] [DEBUG] - unlock /home/dba/.obd/lock/deploy_mediatest_ocpserver_ce
[2025-03-25 20:33:28.211] [DEBUG] - unlock /home/dba/.obd/lock/mirror_and_repo

shell:~/.obd/plugins/oceanbase-ce/4.2.1.4$ cat /home/dba/.obd/plugins/oceanbase-ce/4.2.1.4/obshell_password_reload.py

# coding: utf-8
# Copyright (c) 2025 OceanBase.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from __future__ import absolute_import, division, print_function

from obshell import ClientSet
from obshell.auth import PasswordAuth

from _errno import EC_OBSERVER_INVALID_MODFILY_GLOBAL_KEY

def obshell_password_reload(plugin_context, *args, **kwargs):
    global_ret = True
    stdio = plugin_context.stdio
    cluster_config = plugin_context.cluster_config
    servers = cluster_config.servers
    global_change_conf = plugin_context.get_variable('global_change_conf')
    change_conf = plugin_context.get_variable('change_conf')
    server = cluster_config.servers[0]
    for key in global_change_conf:
        try:
            value = change_conf[server][key] if change_conf[server].get(key) is not None else ''
            if key == 'root_password':
                for server in servers:
                    stdio.verbose('update %s obshell password' % (server))
                    server_config = cluster_config.get_server_conf(server)
                    obshell_port = server_config.get('obshell_port')
                    client = ClientSet(server.ip, obshell_port, PasswordAuth(value))
                    client.v1.get_ob_info()
        except:
            stdio.exception("")
            global_ret = False

    if not global_ret:
        return plugin_context.return_false()
    return plugin_context.return_true()

由于这个问题可能一直会导致 obd cluster reload 不完全成功。

看上去是因为 因 global_change_confNone 而引发的错误 我尝试修改了一下脚本, 修改后的代码添加了对 global_change_conf 的检查,会先确认 global_change_conf 是否存在以及其中是否包含 root_password 。若不满足条件,就会输出日志信息并跳过密码更新逻辑,暂时先跨过了这个问题。

def obshell_password_reload(plugin_context, *args, **kwargs):
    global_ret = True
    stdio = plugin_context.stdio
    cluster_config = plugin_context.cluster_config
    servers = cluster_config.servers
    global_change_conf = plugin_context.get_variable('global_change_conf')
    change_conf = plugin_context.get_variable('change_conf')

    # 这里检查 global_change_conf 是否存在且包含 root_password
    if global_change_conf and 'root_password' in global_change_conf:
        for key in global_change_conf:
            if key == 'root_password':
                value = global_change_conf[key]  
                for server in servers:
                    stdio.verbose('update %s obshell password' % (server))
                    server_config = cluster_config.get_server_conf(server)
                    obshell_port = server_config.get('obshell_port')
                    try:
                        client = ClientSet(server.ip, obshell_port, PasswordAuth(value))
                        client.v1.get_ob_info()
                    except Exception as e:
                        stdio.exception(f"Failed to update password for {server}: {str(e)}")
                        global_ret = False
    else:
        stdio.verbose("No root_password change required. Skipping password reload.")

    return plugin_context.return_true() if global_ret else plugin_context.return_false()

@论坛小助手 辛苦同学帮忙看一下这个问题,如若我的修改不妥,看下可否通过其他方法跨过此问题。

日志采集场景: 集群基础信息
日志采集命令: obdiag gather scene run --scene=observer.base

推荐使用 obdiag 工具进行日志采集,并且将采集到的日志提供给我们以便确认问题所在。通过采集集群的基础信息,我们可以更好地分析出现 RuntimeError: 'NoneType' object is not iterable 错误的原因。

麻烦您提供一些信息以便我们更好地帮助您:

  1. 您是在执行 reload 操作时遇到了这个错误,请问具体是通过什么方式触发的 reload 操作(例如手动操作、脚本调用等)?
  2. 出现该错误之前,是否对 OceanBase 集群进行了任何配置修改或升级操作?如果有,请详细描述修改或升级的内容。
  3. 是否可以提供完整的错误堆栈信息(如果有的话)?这有助于我们更准确地定位问题。
  4. 当前 OceanBase 集群的版本号是多少?可以通过 select version(); 查询。
  5. 集群当前的状态是否正常?例如是否有其他异常日志或警告信息?

附上敏捷诊断工具 obdiag 使用帮助链接

1 个赞
  1. 您是在执行 reload 操作时遇到了这个错误,请问具体是通过什么方式触发的 reload 操作(例如手动操作、脚本调用等)?
1.obd cluster edit-config 部署的集群名称
2.修改log_disk_size大小
3.obd cluster reload 部署的集群名称
4.show parameters like ‘%log_disk_size%’;
  1. 出现该错误之前,是否对 OceanBase 集群进行了任何配置修改或升级操作?如果有,请详细描述修改或升级的内容。
    升级过 ocp,通过 obd upgrade完成的升级到了 ocp当前社区版最新版本

  2. 是否可以提供完整的错误堆栈信息(如果有的话)?这有助于我们更准确地定位问题。

dba@mongodb10-online-cmpri:~/.obd/plugins/oceanbase-ce/4.2.1.4$ obd display-trace 588553ea-0975-11f0-8bfb-246e96c6abc8
[2025-03-25 20:33:24.945] [DEBUG] - cmd: ['mediatest_ocpserver_ce']
[2025-03-25 20:33:24.945] [DEBUG] - opts: {}
[2025-03-25 20:33:24.945] [DEBUG] - mkdir /home/dba/.obd/lock/
[2025-03-25 20:33:24.945] [DEBUG] - unknown lock mode
[2025-03-25 20:33:24.946] [DEBUG] - try to get share lock /home/dba/.obd/lock/global
[2025-03-25 20:33:24.946] [DEBUG] - share lock `/home/dba/.obd/lock/global`, count 1
[2025-03-25 20:33:24.946] [DEBUG] - Get Deploy by name
[2025-03-25 20:33:24.946] [DEBUG] - mkdir /home/dba/.obd/cluster/
[2025-03-25 20:33:24.947] [DEBUG] - mkdir /home/dba/.obd/config_parser/
[2025-03-25 20:33:24.947] [DEBUG] - try to get exclusive lock /home/dba/.obd/lock/deploy_mediatest_ocpserver_ce
[2025-03-25 20:33:24.947] [DEBUG] - exclusive lock `/home/dba/.obd/lock/deploy_mediatest_ocpserver_ce`, count 1
[2025-03-25 20:33:24.955] [DEBUG] - Deploy status judge
[2025-03-25 20:33:24.956] [INFO] Get local repositories and plugins
[2025-03-25 20:33:24.957] [DEBUG] - mkdir /home/dba/.obd/repository
[2025-03-25 20:33:24.957] [DEBUG] - Get local repository oceanbase-ce-4.2.1.8-499b676f2ede5a16e0c07b2b15991d1160d972e8
[2025-03-25 20:33:24.957] [DEBUG] - try to get share lock /home/dba/.obd/lock/mirror_and_repo
[2025-03-25 20:33:24.958] [DEBUG] - share lock `/home/dba/.obd/lock/mirror_and_repo`, count 1
[2025-03-25 20:33:24.960] [DEBUG] - Get local repository obproxy-ce-4.3.2.0-b7ae0af3860478f3caecaaec05bd67d0565e4021
[2025-03-25 20:33:24.961] [DEBUG] - share lock `/home/dba/.obd/lock/mirror_and_repo`, count 2
[2025-03-25 20:33:24.963] [DEBUG] - Get local repository ocp-server-ce-4.3.5-5c670871a262a5c95649ca8e2ad4b237e2a8aa43
[2025-03-25 20:33:24.963] [DEBUG] - share lock `/home/dba/.obd/lock/mirror_and_repo`, count 3
[2025-03-25 20:33:25.088] [DEBUG] - Get deploy config
[2025-03-25 20:33:25.129] [DEBUG] - Get new deploy config
[2025-03-25 20:33:25.169] [INFO] Load cluster param plugin
[2025-03-25 20:33:25.170] [DEBUG] - Searching param plugin for components ...
[2025-03-25 20:33:25.170] [DEBUG] - Search param plugin for oceanbase-ce
[2025-03-25 20:33:25.170] [DEBUG] - mkdir /home/dba/.obd/plugins
[2025-03-25 20:33:25.171] [DEBUG] - Found for oceanbase-ce-param-4.2.1.4 for oceanbase-ce-4.2.1.8
[2025-03-25 20:33:25.171] [DEBUG] - Applying oceanbase-ce-param-4.2.1.4 for oceanbase-ce-4.2.1.8-108000022024072217.el7-499b676f2ede5a16e0c07b2b15991d1160d972e8
[2025-03-25 20:33:25.838] [DEBUG] - Search param plugin for obproxy-ce
[2025-03-25 20:33:25.838] [DEBUG] - Found for obproxy-ce-param-4.3.0 for obproxy-ce-4.3.2.0
[2025-03-25 20:33:25.838] [DEBUG] - Applying obproxy-ce-param-4.3.0 for obproxy-ce-4.3.2.0-42.el7-b7ae0af3860478f3caecaaec05bd67d0565e4021
[2025-03-25 20:33:26.007] [DEBUG] - Search param plugin for ocp-server-ce
[2025-03-25 20:33:26.007] [DEBUG] - Found for ocp-server-ce-param-4.2.1 for ocp-server-ce-4.3.5
[2025-03-25 20:33:26.008] [DEBUG] - Applying ocp-server-ce-param-4.2.1 for ocp-server-ce-4.3.5-20250319105844.el7-5c670871a262a5c95649ca8e2ad4b237e2a8aa43
[2025-03-25 20:33:26.129] [DEBUG] - Searching param plugin for components ...
[2025-03-25 20:33:26.130] [DEBUG] - Search param plugin for oceanbase-ce
[2025-03-25 20:33:26.130] [DEBUG] - Found for oceanbase-ce-param-4.2.1.4 for oceanbase-ce-4.2.1.8
[2025-03-25 20:33:26.130] [DEBUG] - Applying oceanbase-ce-param-4.2.1.4 for oceanbase-ce-4.2.1.8-108000022024072217.el7-499b676f2ede5a16e0c07b2b15991d1160d972e8
[2025-03-25 20:33:26.130] [DEBUG] - Search param plugin for obproxy-ce
[2025-03-25 20:33:26.131] [DEBUG] - Found for obproxy-ce-param-4.3.0 for obproxy-ce-4.3.2.0
[2025-03-25 20:33:26.131] [DEBUG] - Applying obproxy-ce-param-4.3.0 for obproxy-ce-4.3.2.0-42.el7-b7ae0af3860478f3caecaaec05bd67d0565e4021
[2025-03-25 20:33:26.131] [DEBUG] - Search param plugin for ocp-server-ce
[2025-03-25 20:33:26.131] [DEBUG] - Found for ocp-server-ce-param-4.2.1 for ocp-server-ce-4.3.5
[2025-03-25 20:33:26.131] [DEBUG] - Applying ocp-server-ce-param-4.2.1 for ocp-server-ce-4.3.5-20250319105844.el7-5c670871a262a5c95649ca8e2ad4b237e2a8aa43
[2025-03-25 20:33:26.203] [INFO] Open ssh connection
[2025-03-25 20:33:26.209] [DEBUG] - host: 10.46.128.24, port: 1046, user: dba, password: ******
[2025-03-25 20:33:26.295] [DEBUG] - host: 10.46.128.11, port: 1046, user: dba, password: ******
[2025-03-25 20:33:26.386] [DEBUG] - host: 10.46.128.12, port: 1046, user: dba, password: ******
[2025-03-25 20:33:26.504] [DEBUG] - Searching status_check template for components ...
[2025-03-25 20:33:26.505] [DEBUG] - mkdir /home/dba/.obd/workflows
[2025-03-25 20:33:26.506] [DEBUG] - Call workflow oceanbase-ce-py_script_workflow_status_check-0.1 for oceanbase-ce-4.2.1.8-108000022024072217.el7-499b676f2ede5a16e0c07b2b15991d1160d972e8
[2025-03-25 20:33:26.506] [DEBUG] - mkdir /home/dba/.obd/mirror
[2025-03-25 20:33:26.506] [DEBUG] - mkdir /home/dba/.obd/mirror/remote
[2025-03-25 20:33:26.506] [DEBUG] - mkdir /home/dba/.obd/mirror/local
[2025-03-25 20:33:26.506] [DEBUG] - mkdir /home/dba/.obd/optimize/
[2025-03-25 20:33:26.507] [DEBUG] - mkdir /home/dba/.obd/tool/
[2025-03-25 20:33:26.507] [DEBUG] - import status_check
[2025-03-25 20:33:26.508] [DEBUG] - add status_check ref count to 1
[2025-03-25 20:33:26.508] [DEBUG] - sub status_check ref count to 0
[2025-03-25 20:33:26.508] [DEBUG] - export status_check
[2025-03-25 20:33:26.508] [DEBUG] - plugin oceanbase-ce-py_script_workflow_status_check-0.1 result: True
[2025-03-25 20:33:26.509] [DEBUG] - Found for oceanbase-ce-py_script_workflow_status_check-0.1 for oceanbase-ce-0.1
[2025-03-25 20:33:26.509] [DEBUG] - Searching status_check template for components ...
[2025-03-25 20:33:26.509] [DEBUG] - Call workflow obproxy-ce-py_script_workflow_status_check-0.1 for obproxy-ce-4.3.2.0-42.el7-b7ae0af3860478f3caecaaec05bd67d0565e4021
[2025-03-25 20:33:26.509] [DEBUG] - import status_check
[2025-03-25 20:33:26.510] [DEBUG] - add status_check ref count to 1
[2025-03-25 20:33:26.510] [DEBUG] - sub status_check ref count to 0
[2025-03-25 20:33:26.510] [DEBUG] - export status_check
[2025-03-25 20:33:26.510] [DEBUG] - plugin obproxy-ce-py_script_workflow_status_check-0.1 result: True
[2025-03-25 20:33:26.510] [DEBUG] - Found for obproxy-ce-py_script_workflow_status_check-0.1 for obproxy-ce-0.1
[2025-03-25 20:33:26.510] [DEBUG] - Searching status_check template for components ...
[2025-03-25 20:33:26.511] [DEBUG] - Call workflow ocp-server-ce-py_script_workflow_status_check-0.1 for ocp-server-ce-4.3.5-20250319105844.el7-5c670871a262a5c95649ca8e2ad4b237e2a8aa43
[2025-03-25 20:33:26.511] [DEBUG] - import status_check
[2025-03-25 20:33:26.511] [DEBUG] - add status_check ref count to 1
[2025-03-25 20:33:26.512] [DEBUG] - sub status_check ref count to 0
[2025-03-25 20:33:26.512] [DEBUG] - export status_check
[2025-03-25 20:33:26.512] [DEBUG] - plugin ocp-server-ce-py_script_workflow_status_check-0.1 result: True
[2025-03-25 20:33:26.512] [DEBUG] - Found for ocp-server-ce-py_script_workflow_status_check-0.1 for ocp-server-ce-0.1
[2025-03-25 20:33:26.512] [DEBUG] - share lock `/home/dba/.obd/lock/mirror_and_repo`, count 4
[2025-03-25 20:33:26.515] [DEBUG] - Searching status plugin for components ...
[2025-03-25 20:33:26.515] [DEBUG] - Searching status plugin for oceanbase-ce-4.2.1.8-108000022024072217.el7-499b676f2ede5a16e0c07b2b15991d1160d972e8
[2025-03-25 20:33:26.516] [DEBUG] - Found for oceanbase-ce-py_script_status-3.1.0 for oceanbase-ce-4.2.1.8
[2025-03-25 20:33:26.516] [DEBUG] - Call plugin oceanbase-ce-py_script_status-3.1.0 for oceanbase-ce-4.2.1.8-108000022024072217.el7-499b676f2ede5a16e0c07b2b15991d1160d972e8
[2025-03-25 20:33:26.516] [DEBUG] - import status
[2025-03-25 20:33:26.517] [DEBUG] - add status ref count to 1
[2025-03-25 20:33:26.518] [DEBUG] -- dba@10.46.128.24 execute: cat /home/dba/oceanbase/run/observer.pid
[2025-03-25 20:33:26.524] [DEBUG] -- exited code 0
[2025-03-25 20:33:26.524] [DEBUG] -- dba@10.46.128.24 execute: ls /proc/48503
[2025-03-25 20:33:26.570] [DEBUG] -- exited code 0
[2025-03-25 20:33:26.572] [DEBUG] -- dba@10.46.128.11 execute: cat /home/dba/oceanbase/run/observer.pid
[2025-03-25 20:33:26.577] [DEBUG] -- exited code 0
[2025-03-25 20:33:26.577] [DEBUG] -- dba@10.46.128.11 execute: ls /proc/2251886
[2025-03-25 20:33:26.629] [DEBUG] -- exited code 0
[2025-03-25 20:33:26.630] [DEBUG] -- dba@10.46.128.12 execute: cat /home/dba/oceanbase/run/observer.pid
[2025-03-25 20:33:26.635] [DEBUG] -- exited code 0
[2025-03-25 20:33:26.635] [DEBUG] -- dba@10.46.128.12 execute: ls /proc/1689002
[2025-03-25 20:33:26.685] [DEBUG] -- exited code 0
[2025-03-25 20:33:26.686] [DEBUG] - sub status ref count to 0
[2025-03-25 20:33:26.686] [DEBUG] - export status
[2025-03-25 20:33:26.686] [DEBUG] - plugin oceanbase-ce-py_script_status-3.1.0 result: True
[2025-03-25 20:33:26.687] [DEBUG] - Searching status_check plugin for components ...
[2025-03-25 20:33:26.687] [DEBUG] - Searching status_check plugin for general-4.2.1.8--None
[2025-03-25 20:33:26.687] [DEBUG] - Found for general-py_script_status_check-0.1 for general-4.2.1.8
[2025-03-25 20:33:26.688] [DEBUG] - Call plugin general-py_script_status_check-0.1 for oceanbase-ce-4.2.1.8-108000022024072217.el7-499b676f2ede5a16e0c07b2b15991d1160d972e8
[2025-03-25 20:33:26.688] [DEBUG] - import status_check
[2025-03-25 20:33:26.688] [DEBUG] - add status_check ref count to 1
[2025-03-25 20:33:26.689] [DEBUG] - sub status_check ref count to 0
[2025-03-25 20:33:26.689] [DEBUG] - export status_check
[2025-03-25 20:33:26.689] [DEBUG] - plugin general-py_script_status_check-0.1 result: True
[2025-03-25 20:33:26.689] [DEBUG] - share lock `/home/dba/.obd/lock/mirror_and_repo`, count 5
[2025-03-25 20:33:26.692] [DEBUG] - Searching status plugin for components ...
[2025-03-25 20:33:26.692] [DEBUG] - Searching status plugin for obproxy-ce-4.3.2.0-42.el7-b7ae0af3860478f3caecaaec05bd67d0565e4021
[2025-03-25 20:33:26.692] [DEBUG] - Found for obproxy-ce-py_script_status-3.1.0 for obproxy-ce-4.3.2.0
[2025-03-25 20:33:26.692] [DEBUG] - Call plugin obproxy-ce-py_script_status-3.1.0 for obproxy-ce-4.3.2.0-42.el7-b7ae0af3860478f3caecaaec05bd67d0565e4021
[2025-03-25 20:33:26.692] [DEBUG] - import status
[2025-03-25 20:33:26.693] [DEBUG] - add status ref count to 1
[2025-03-25 20:33:26.693] [DEBUG] -- dba@10.46.128.24 execute: cat /home/dba/oceanbase/obproxy/run/obproxy-10.46.128.24-2883.pid
[2025-03-25 20:33:26.699] [DEBUG] -- exited code 0
[2025-03-25 20:33:26.700] [DEBUG] -- dba@10.46.128.24 execute: ls /proc/51157
[2025-03-25 20:33:26.746] [DEBUG] -- exited code 0
[2025-03-25 20:33:26.747] [DEBUG] -- dba@10.46.128.11 execute: cat /home/dba/oceanbase/obproxy/run/obproxy-10.46.128.11-2883.pid
[2025-03-25 20:33:26.752] [DEBUG] -- exited code 0
[2025-03-25 20:33:26.752] [DEBUG] -- dba@10.46.128.11 execute: ls /proc/2253818
[2025-03-25 20:33:26.805] [DEBUG] -- exited code 0
[2025-03-25 20:33:26.806] [DEBUG] -- dba@10.46.128.12 execute: cat /home/dba/oceanbase/obproxy/run/obproxy-10.46.128.12-2883.pid
[2025-03-25 20:33:26.810] [DEBUG] -- exited code 0
[2025-03-25 20:33:26.811] [DEBUG] -- dba@10.46.128.12 execute: ls /proc/1690740
[2025-03-25 20:33:26.861] [DEBUG] -- exited code 0
[2025-03-25 20:33:26.862] [DEBUG] - sub status ref count to 0
[2025-03-25 20:33:26.862] [DEBUG] - export status
[2025-03-25 20:33:26.862] [DEBUG] - plugin obproxy-ce-py_script_status-3.1.0 result: True
[2025-03-25 20:33:26.863] [DEBUG] - Searching status_check plugin for components ...
[2025-03-25 20:33:26.863] [DEBUG] - Searching status_check plugin for general-4.3.2.0--None
[2025-03-25 20:33:26.863] [DEBUG] - Found for general-py_script_status_check-0.1 for general-4.3.2.0
[2025-03-25 20:33:26.863] [DEBUG] - Call plugin general-py_script_status_check-0.1 for obproxy-ce-4.3.2.0-42.el7-b7ae0af3860478f3caecaaec05bd67d0565e4021
[2025-03-25 20:33:26.863] [DEBUG] - plugin general-py_script_status_check-0.1 result: True
[2025-03-25 20:33:26.863] [DEBUG] - share lock `/home/dba/.obd/lock/mirror_and_repo`, count 6
[2025-03-25 20:33:26.866] [DEBUG] - Searching status plugin for components ...
[2025-03-25 20:33:26.866] [DEBUG] - Searching status plugin for ocp-server-ce-4.3.5-20250319105844.el7-5c670871a262a5c95649ca8e2ad4b237e2a8aa43
[2025-03-25 20:33:26.867] [DEBUG] - Found for ocp-server-ce-py_script_status-4.2.1 for ocp-server-ce-4.3.5
[2025-03-25 20:33:26.867] [DEBUG] - Call plugin ocp-server-ce-py_script_status-4.2.1 for ocp-server-ce-4.3.5-20250319105844.el7-5c670871a262a5c95649ca8e2ad4b237e2a8aa43
[2025-03-25 20:33:26.867] [DEBUG] - import status
[2025-03-25 20:33:26.868] [DEBUG] - add status ref count to 1
[2025-03-25 20:33:26.868] [DEBUG] -- dba@10.46.128.24 execute: cat /home/dba/oceanbase/ocp/run/ocp-server.pid
[2025-03-25 20:33:26.875] [DEBUG] -- exited code 0
[2025-03-25 20:33:26.875] [DEBUG] -- dba@10.46.128.24 execute: ls /proc/23325
[2025-03-25 20:33:26.922] [DEBUG] -- exited code 0
[2025-03-25 20:33:26.922] [DEBUG] -- dba@10.46.128.11 execute: cat /home/dba/oceanbase/ocp/run/ocp-server.pid
[2025-03-25 20:33:26.928] [DEBUG] -- exited code 0
[2025-03-25 20:33:26.928] [DEBUG] -- dba@10.46.128.11 execute: ls /proc/1071879
[2025-03-25 20:33:26.978] [DEBUG] -- exited code 0
[2025-03-25 20:33:26.979] [DEBUG] -- dba@10.46.128.12 execute: cat /home/dba/oceanbase/ocp/run/ocp-server.pid
[2025-03-25 20:33:26.983] [DEBUG] -- exited code 0
[2025-03-25 20:33:26.984] [DEBUG] -- dba@10.46.128.12 execute: ls /proc/4025701
[2025-03-25 20:33:27.033] [DEBUG] -- exited code 0
[2025-03-25 20:33:27.034] [DEBUG] - sub status ref count to 0
[2025-03-25 20:33:27.034] [DEBUG] - export status
[2025-03-25 20:33:27.034] [DEBUG] - plugin ocp-server-ce-py_script_status-4.2.1 result: True
[2025-03-25 20:33:27.034] [DEBUG] - Searching status_check plugin for components ...
[2025-03-25 20:33:27.035] [DEBUG] - Searching status_check plugin for general-4.3.5--None
[2025-03-25 20:33:27.035] [DEBUG] - Found for general-py_script_status_check-0.1 for general-4.3.5
[2025-03-25 20:33:27.035] [DEBUG] - Call plugin general-py_script_status_check-0.1 for ocp-server-ce-4.3.5-20250319105844.el7-5c670871a262a5c95649ca8e2ad4b237e2a8aa43
[2025-03-25 20:33:27.035] [DEBUG] - plugin general-py_script_status_check-0.1 result: True
[2025-03-25 20:33:27.035] [DEBUG] - Searching reload template for components ...
[2025-03-25 20:33:27.036] [DEBUG] - Call workflow oceanbase-ce-py_script_workflow_reload-4.2.1.4 for oceanbase-ce-4.2.1.8-108000022024072217.el7-499b676f2ede5a16e0c07b2b15991d1160d972e8
[2025-03-25 20:33:27.036] [DEBUG] - import reload
[2025-03-25 20:33:27.037] [DEBUG] - add reload ref count to 1
[2025-03-25 20:33:27.037] [DEBUG] - sub reload ref count to 0
[2025-03-25 20:33:27.037] [DEBUG] - export reload
[2025-03-25 20:33:27.037] [DEBUG] - plugin oceanbase-ce-py_script_workflow_reload-4.2.1.4 result: True
[2025-03-25 20:33:27.038] [DEBUG] - Found for oceanbase-ce-py_script_workflow_reload-4.2.1.4 for oceanbase-ce-4.2.1.4
[2025-03-25 20:33:27.038] [DEBUG] - Searching reload template for components ...
[2025-03-25 20:33:27.038] [DEBUG] - Call workflow obproxy-ce-py_script_workflow_reload-4.2.3 for obproxy-ce-4.3.2.0-42.el7-b7ae0af3860478f3caecaaec05bd67d0565e4021
[2025-03-25 20:33:27.038] [DEBUG] - import reload
[2025-03-25 20:33:27.039] [DEBUG] - add reload ref count to 1
[2025-03-25 20:33:27.039] [DEBUG] - sub reload ref count to 0
[2025-03-25 20:33:27.039] [DEBUG] - export reload
[2025-03-25 20:33:27.039] [DEBUG] - plugin obproxy-ce-py_script_workflow_reload-4.2.3 result: True
[2025-03-25 20:33:27.039] [DEBUG] - Found for obproxy-ce-py_script_workflow_reload-4.2.3 for obproxy-ce-4.2.3
[2025-03-25 20:33:27.039] [DEBUG] - Searching reload template for components ...
[2025-03-25 20:33:27.039] [DEBUG] - Call workflow ocp-server-ce-py_script_workflow_reload-0.1 for ocp-server-ce-4.3.5-20250319105844.el7-5c670871a262a5c95649ca8e2ad4b237e2a8aa43
[2025-03-25 20:33:27.040] [DEBUG] - import reload
[2025-03-25 20:33:27.040] [DEBUG] - add reload ref count to 1
[2025-03-25 20:33:27.040] [INFO] Nothing to do for ocp-server-ce reload
[2025-03-25 20:33:27.040] [DEBUG] - sub reload ref count to 0
[2025-03-25 20:33:27.040] [DEBUG] - export reload
[2025-03-25 20:33:27.041] [DEBUG] - plugin ocp-server-ce-py_script_workflow_reload-0.1 result: True
[2025-03-25 20:33:27.041] [DEBUG] - Found for ocp-server-ce-py_script_workflow_reload-0.1 for ocp-server-ce-0.1
[2025-03-25 20:33:27.041] [DEBUG] - Searching connect plugin for components ...
[2025-03-25 20:33:27.041] [DEBUG] - Searching connect plugin for oceanbase-ce-4.2.1.8-108000022024072217.el7-499b676f2ede5a16e0c07b2b15991d1160d972e8
[2025-03-25 20:33:27.042] [DEBUG] - Found for oceanbase-ce-py_script_connect-3.1.0 for oceanbase-ce-4.2.1.8
[2025-03-25 20:33:27.042] [DEBUG] - Call plugin oceanbase-ce-py_script_connect-3.1.0 for oceanbase-ce-4.2.1.8-108000022024072217.el7-499b676f2ede5a16e0c07b2b15991d1160d972e8
[2025-03-25 20:33:27.042] [DEBUG] - import connect
[2025-03-25 20:33:27.043] [DEBUG] - add connect ref count to 1
[2025-03-25 20:33:27.044] [INFO] Connect to observer
[2025-03-25 20:33:27.045] [DEBUG] -- connect 10.46.128.24 -P2881 -uroot -p******
[2025-03-25 20:33:27.047] [DEBUG] -- execute sql: select 1. args: None
[2025-03-25 20:33:27.176] [DEBUG] - sub connect ref count to 0
[2025-03-25 20:33:27.177] [DEBUG] - export connect
[2025-03-25 20:33:27.177] [DEBUG] - plugin oceanbase-ce-py_script_connect-3.1.0 result: True
[2025-03-25 20:33:27.177] [DEBUG] - Searching connect plugin for components ...
[2025-03-25 20:33:27.177] [DEBUG] - Searching connect plugin for obproxy-ce-4.3.2.0-42.el7-b7ae0af3860478f3caecaaec05bd67d0565e4021
[2025-03-25 20:33:27.177] [DEBUG] - Found for obproxy-ce-py_script_connect-3.1.0 for obproxy-ce-4.3.2.0
[2025-03-25 20:33:27.177] [DEBUG] - Call plugin obproxy-ce-py_script_connect-3.1.0 for obproxy-ce-4.3.2.0-42.el7-b7ae0af3860478f3caecaaec05bd67d0565e4021
[2025-03-25 20:33:27.178] [DEBUG] - import connect
[2025-03-25 20:33:27.180] [DEBUG] - add connect ref count to 1
[2025-03-25 20:33:27.181] [INFO] Connect to obproxy
[2025-03-25 20:33:27.183] [DEBUG] -- connect 10.46.128.24 -P2883 -uroot@proxysys -p******
[2025-03-25 20:33:27.185] [DEBUG] -- connect 10.46.128.11 -P2883 -uroot@proxysys -p******
[2025-03-25 20:33:27.187] [DEBUG] -- connect 10.46.128.12 -P2883 -uroot@proxysys -p******
[2025-03-25 20:33:27.314] [DEBUG] - sub connect ref count to 0
[2025-03-25 20:33:27.314] [DEBUG] - export connect
[2025-03-25 20:33:27.315] [DEBUG] - plugin obproxy-ce-py_script_connect-3.1.0 result: True
[2025-03-25 20:33:27.315] [DEBUG] - Searching reload plugin for components ...
[2025-03-25 20:33:27.315] [DEBUG] - Searching reload plugin for oceanbase-ce-4.2.1.8-108000022024072217.el7-499b676f2ede5a16e0c07b2b15991d1160d972e8
[2025-03-25 20:33:27.316] [DEBUG] - Found for oceanbase-ce-py_script_reload-4.2.1.4 for oceanbase-ce-4.2.1.8
[2025-03-25 20:33:27.316] [DEBUG] - Call plugin oceanbase-ce-py_script_reload-4.2.1.4 for oceanbase-ce-4.2.1.8-108000022024072217.el7-499b676f2ede5a16e0c07b2b15991d1160d972e8
[2025-03-25 20:33:27.316] [DEBUG] - import reload
[2025-03-25 20:33:27.318] [DEBUG] - add reload ref count to 1
[2025-03-25 20:33:27.318] [DEBUG] -- get 10.46.128.24 old configuration
[2025-03-25 20:33:27.319] [DEBUG] -- get 10.46.128.24 new configuration
[2025-03-25 20:33:27.319] [DEBUG] -- get 10.46.128.24 cluster address
[2025-03-25 20:33:27.319] [DEBUG] -- compare configuration of 10.46.128.24
[2025-03-25 20:33:27.319] [DEBUG] -- obshell_port is not a oceanbase parameter. skip
[2025-03-25 20:33:27.319] [DEBUG] -- production_mode is not a oceanbase parameter. skip
[2025-03-25 20:33:27.319] [DEBUG] -- get 10.46.128.11 old configuration
[2025-03-25 20:33:27.320] [DEBUG] -- get 10.46.128.11 new configuration
[2025-03-25 20:33:27.321] [DEBUG] -- get 10.46.128.11 cluster address
[2025-03-25 20:33:27.321] [DEBUG] -- compare configuration of 10.46.128.11
[2025-03-25 20:33:27.321] [DEBUG] -- obshell_port is not a oceanbase parameter. skip
[2025-03-25 20:33:27.321] [DEBUG] -- production_mode is not a oceanbase parameter. skip
[2025-03-25 20:33:27.321] [DEBUG] -- get 10.46.128.12 old configuration
[2025-03-25 20:33:27.322] [DEBUG] -- get 10.46.128.12 new configuration
[2025-03-25 20:33:27.323] [DEBUG] -- get 10.46.128.12 cluster address
[2025-03-25 20:33:27.323] [DEBUG] -- compare configuration of 10.46.128.12
[2025-03-25 20:33:27.323] [DEBUG] -- obshell_port is not a oceanbase parameter. skip
[2025-03-25 20:33:27.323] [DEBUG] -- production_mode is not a oceanbase parameter. skip
[2025-03-25 20:33:27.323] [DEBUG] -- apply new configuration
[2025-03-25 20:33:27.323] [INFO] Reload observer
[2025-03-25 20:33:27.324] [DEBUG] -- execute sql: alter system reload server. args: None
[2025-03-25 20:33:27.326] [DEBUG] -- execute sql: alter system reload zone. args: None
[2025-03-25 20:33:27.330] [DEBUG] -- execute sql: alter system reload unit. args: None
[2025-03-25 20:33:27.455] [DEBUG] - sub reload ref count to 0
[2025-03-25 20:33:27.455] [DEBUG] - export reload
[2025-03-25 20:33:27.455] [DEBUG] - plugin oceanbase-ce-py_script_reload-4.2.1.4 result: True
[2025-03-25 20:33:27.455] [DEBUG] - Searching obshell_password_reload plugin for components ...
[2025-03-25 20:33:27.456] [DEBUG] - Searching obshell_password_reload plugin for oceanbase-ce-4.2.1.8-108000022024072217.el7-499b676f2ede5a16e0c07b2b15991d1160d972e8
[2025-03-25 20:33:27.456] [DEBUG] - Found for oceanbase-ce-py_script_obshell_password_reload-4.2.1.4 for oceanbase-ce-4.2.1.8
[2025-03-25 20:33:27.457] [DEBUG] - Call plugin oceanbase-ce-py_script_obshell_password_reload-4.2.1.4 for oceanbase-ce-4.2.1.8-108000022024072217.el7-499b676f2ede5a16e0c07b2b15991d1160d972e8
[2025-03-25 20:33:27.457] [DEBUG] - import obshell_password_reload
[2025-03-25 20:33:28.180] [DEBUG] - add obshell_password_reload ref count to 1
[2025-03-25 20:33:28.183] [ERROR] oceanbase-ce-py_script_obshell_password_reload-4.2.1.4 RuntimeError: 'NoneType' object is not iterable
[2025-03-25 20:33:28.183] [ERROR] Traceback (most recent call last):
[2025-03-25 20:33:28.183] [ERROR]   File "core.py", line 2393, in reload_cluster
[2025-03-25 20:33:28.183] [ERROR]   File "core.py", line 2437, in _reload_cluster
[2025-03-25 20:33:28.183] [ERROR]   File "core.py", line 228, in run_workflow
[2025-03-25 20:33:28.183] [ERROR]   File "core.py", line 270, in run_plugin_template
[2025-03-25 20:33:28.183] [ERROR]   File "core.py", line 315, in call_plugin
[2025-03-25 20:33:28.184] [ERROR]   File "_plugin.py", line 347, in __call__
[2025-03-25 20:33:28.184] [ERROR]   File "_plugin.py", line 304, in _new_func
[2025-03-25 20:33:28.184] [ERROR]   File "/home/dba/.obd/plugins/oceanbase-ce/4.2.1.4/obshell_password_reload.py", line 31, in obshell_password_reload
[2025-03-25 20:33:28.184] [ERROR]     for key in global_change_conf:
[2025-03-25 20:33:28.184] [ERROR] TypeError: 'NoneType' object is not iterable
[2025-03-25 20:33:28.184] [ERROR]
[2025-03-25 20:33:28.184] [DEBUG] - sub obshell_password_reload ref count to 0
[2025-03-25 20:33:28.184] [DEBUG] - export obshell_password_reload
[2025-03-25 20:33:28.184] [DEBUG] - plugin oceanbase-ce-py_script_obshell_password_reload-4.2.1.4 result: False
[2025-03-25 20:33:28.186] [DEBUG] - open /home/dba/.obd/cluster/mediatest_ocpserver_ce/inner_config.yaml for w
[2025-03-25 20:33:28.204] [WARNING] Some configuration items reload failed
[2025-03-25 20:33:28.209] [INFO] See https://www.oceanbase.com/product/ob-deployer/error-codes .
[2025-03-25 20:33:28.209] [INFO] Trace ID: 588553ea-0975-11f0-8bfb-246e96c6abc8
[2025-03-25 20:33:28.210] [INFO] If you want to view detailed obd logs, please run: obd display-trace 588553ea-0975-11f0-8bfb-246e96c6abc8
[2025-03-25 20:33:28.210] [DEBUG] - unlock /home/dba/.obd/lock/global
[2025-03-25 20:33:28.211] [DEBUG] - unlock /home/dba/.obd/lock/deploy_mediatest_ocpserver_ce
[2025-03-25 20:33:28.211] [DEBUG] - unlock /home/dba/.obd/lock/mirror_and_repo

dba@mongodb10-online-cmpri:~/.obd/plugins/oceanbase-ce/4.2.1.4$ cat /home/dba/.obd/plugins/oceanbase-ce/4.2.1.4/obshell_password_reload.py

我是通过这个步骤执行的,问题发生在 3.obd cluster reload 部署的集群名称· 这一步。

  1. 当前 OceanBase 集群的版本号是多少?可以通过 select version(); 查询。
obclient(root@(none))[oceanbase]> select version();
+------------------------------+
| version()                    |
+------------------------------+
| 5.7.25-OceanBase_CE-v4.2.1.8 |
+------------------------------+
1 row in set (0.001 sec)
  1. 集群当前的状态是否正常?例如是否有其他异常日志或警告信息?
    当前集群是正常的,但是偶尔会报出

偶尔会报出这个错误,不确定是啥问题导致的。

2 个赞

根据您提供的信息和日志分析,以下是问题的详细解答:

问题分析

  1. 错误原因
    错误 RuntimeError: 'NoneType' object is not iterable 发生在 obshell_password_reload.py 脚本中。具体是由于变量 global_change_confNone,导致尝试迭代时抛出异常。

    for key in global_change_conf:
    

    根据日志,global_change_conf 是通过 plugin_context.get_variable('global_change_conf') 获取的,但其值可能未正确初始化或传递。

  2. 触发场景
    您提到问题发生在执行 obd cluster reload 命令后。此命令会调用多个插件来重新加载集群配置,其中包括 obshell_password_reload 插件。如果某些配置项(如 root_password)未正确设置或传递,则可能导致上述错误。

  3. 版本信息
    当前 OceanBase 集群版本为 v4.2.1.8,属于社区版。该版本可能存在插件逻辑上的问题,特别是在处理 global_change_conf 变量时。

  4. 集群状态
    您确认当前集群状态正常,但偶尔会出现内部错误日志,例如:

    Unexpected internal error happen, please checkout the internal errcode(errcode=-4009, file="ob_tx_data_functor.cpp’, line_no=391, info="unexpected io error")
    

    这些日志可能与事务处理或 IO 操作有关,需进一步排查。


解决方案

方法一:修改脚本以增强健壮性

您已对脚本进行了修改,增加了对 global_change_conf 的检查。以下是改进后的代码片段:

def obshell_password_reload(plugin_context, *args, **kwargs):
    global_ret = True
    stdio = plugin_context.stdio
    cluster_config = plugin_context.cluster_config
    servers = cluster_config.servers
    global_change_conf = plugin_context.get_variable('global_change_conf')
    change_conf = plugin_context.get_variable('change_conf')

    # 检查 global_change_conf 是否存在且包含 root_password
    if global_change_conf and 'root_password' in global_change_conf:
        for key in global_change_conf:
            if key == 'root_password':
                value = global_change_conf[key]
                for server in servers:
                    stdio.verbose(f'update {server} obshell password')
                    server_config = cluster_config.get_server_conf(server)
                    obshell_port = server_config.get('obshell_port')
                    try:
                        client = ClientSet(server.ip, obshell_port, PasswordAuth(value))
                        client.v1.get_ob_info()
                    except Exception as e:
                        stdio.exception(f"Failed to update password for {server}: {str(e)}")
                        global_ret = False
    else:
        stdio.verbose("No root_password change required. Skipping password reload.")

    return plugin_context.return_true() if global_ret else plugin_context.return_false()

修改点说明:

  • 在迭代 global_change_conf 前,增加对其是否存在以及是否包含 root_password 的检查。
  • 如果条件不满足,直接跳过密码更新逻辑,并输出日志提示。

方法二:检查并修复配置文件

确保 inner_config.yaml 文件中包含正确的配置项。例如,global_change_confchange_conf 应正确初始化。可以通过以下步骤验证:

  1. 查看配置文件路径:

    cat /home/dba/.obd/cluster/mediatest_ocpserver_ce/inner_config.yaml
    
  2. 确保文件中包含类似以下内容:

    global_change_conf:
      root_password: "your_new_password"
    change_conf:
      - ip: "10.46.128.24"
        root_password: "your_new_password"
      - ip: "10.46.128.11"
        root_password: "your_new_password"
      - ip: "10.46.128.12"
        root_password: "your_new_password"
    
  3. 如果缺少相关配置项,请手动补充或重新编辑配置:

    obd cluster edit-config mediatest_ocpserver_ce
    

方法三:升级 OBD 工具

当前使用的 OBD 版本可能存在插件逻辑上的问题。建议升级到最新版本:

  1. 卸载旧版本:

    obd self uninstall
    
  2. 安装最新版本:

    bash <(curl -fsSL https://mirrors.oceanbase.com/obd/obd_installer.sh)
    
  3. 验证版本:

    obd version
    

方法四:排查内部错误日志

针对偶尔出现的内部错误日志,建议使用 obdiag 工具采集更多信息:

  1. 执行日志采集命令:

    obdiag gather scene run --scene=observer.base
    
  2. 将生成的日志文件上传至 OceanBase 社区支持团队进行进一步分析。


总结

  1. 修改脚本以增强健壮性,避免因 global_change_confNone 导致的错误。
  2. 检查并修复配置文件,确保 global_change_confchange_conf 正确初始化。
  3. 升级 OBD 工具至最新版本,获取更稳定的插件支持。
  4. 使用 obdiag 工具采集日志,排查偶尔出现的内部错误。

如果问题仍未解决,请提供更多日志信息或联系 OceanBase 技术支持团队以获取进一步帮助。

更多信息请查看:

  1. 创建 MySQL 模式的用户租户

(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)

1 个赞

学习了!

学习了

这个需要发下包含报错时段的observer.log 才能具体分析了