暂无图片
分享
王小那个鑫
2020-02-25
GaussDB执行检查、显示备份的时候报错:'NoneType' object has no attribute 'endswith'
暂无图片 5M

使用GaussDB的Roach工具的时候,已经如下配置了环境变量:
export ROACH_HOME=/home/soft/gaussdb100/GaussDB_100_1.0.1-ROACH-REDHAT-64bit
export GAUSSLOG=/home/soft/gaussdb100/GaussDB_100_1.0.1-ROACH-REDHAT-64bit/log
export GAUSSHOME=/gaussdb_data/app
并且在可以正常执行-t backup的全量备份、增量备份以及删除备份(-t delete)、显示备份(-t show)。

但是在执行验证备份集完整行的时候(-t validate)操作,则会报错:
start run validate.
Parsing the configuration file.
‘NoneType’ object has no attribute ‘endswith’
Failed to do validate, ‘NoneType’ object has no attribute ‘endswith’
‘NoneType’ object has no attribute ‘endswith’
一般遇到这种问题,该从哪里入手分析呢?

收藏
分享
7条回答
默认
最新
王小那个鑫
升级问题到: 潜在风险
暂无图片 评论
暂无图片 有用 0
王小那个鑫

重新进行测试,发现是少了参数 --mode single(目前我安装的是单机版的),但是发现了新的问题。已经删除的备份时可以被validate成功的;但是备份有效的备份集时在进行validate检查时,会报错:
start run validate.
start validate backup data.
Validate backupset data failed. ‘NoneType’ object has no attribute ‘executeCommand’
Failed to do validate, ‘NoneType’ object has no attribute ‘executeCommand’
‘NoneType’ object has no attribute ‘executeCommand’
通过该错误,应该是程序中调用executeCommand函数的时候出现了异常,那么这种问题一般如何入手分析呢?这个错误是否可以分析出来是什么原因造成的呢?是bug么?

暂无图片 评论
暂无图片 有用 0
王小那个鑫

错误1.png

暂无图片 评论
暂无图片 有用 0
王小那个鑫

错误2.png

暂无图片 评论
暂无图片 有用 0
章芋文

可以跟踪下,或者打印日志看下
util/GSroachValidate.py文件如下部分:
g_opts.sshTool.executeCommand(cmd, “validate backupset sha245”,DefaultValue.SUCCESS, g_opts.nodeList)
一般都是因为参数中存在空值。

暂无图片 评论
暂无图片 有用 0
王小那个鑫

通过对Roach的py代码分析和使用方法发现,Roach的validate动作只能在集群中使用,不支持单机使用,具体原因如下:
首先以help的命令+提示进行validate操作来对日志进行跟踪,发现异常出现在GaussRoach.py的这三行出现的报错
image.png
所以我们可以到py脚本中看看这三行代码:
501行,这里我们可以看到这个报错代码已经跳转到init_cluster_info()函数中了,可以说明,此时语句默认初始化获取了集群信息,但是我们安装的版本是单机,所以获取不到一些集群的参数,于是错误日志会跳转到这里
image.png
583行,这里我们可以看到报错代码跳转到了do_roach函数中,但是从这里我们可以看到do_roach回去获取模式信息、动作信息,由于没有加mode参数,所以默认获取到的是集群信息,但我们没有集群,所以参数获取机会有问题于是会抛出错误
image.png
815行,这里我们看到实际上执行到了主函数,上面两个地方都会有错,那么根据函数调用顺序,这里执行也会有问题,所以不做过多解释。
image.png
那么,如果我们指定–mode single会怎么样呢?根据测试和之前的回答,其实也可以发现,执行成功了一半,然后又会有问题:
image.png
这次可以从日志中,跟踪到,错误代码有了一些变化,新的错误代码已经跟踪到了GSroachValidate.py:88行,那么我们就看看88行附近出现了什么:
image.png
这里可以看到已经准备开始检查了,但是却还是像章芋文老师说的因为缺少了参数而报错,所以基本可以定位,可能是这个地方的参数有问题:
image.png
但是核对了很久,发现参数数量也对,也没有错误的参数变量,所以应该问题不在这里了。
那么继续往下看:
g_opts.sshTool.executeCommand(cmd, “validate backupset sha245”,DefaultValue.SUCCESS, g_opts.nodeList)
在这段代码中,我们可以看到,调用了sshTool中的executeCommand动作。发现这个后,其实问题就很比较明了了。
即只要做validate就会跳转到GSroachValidate.py中,而GSroachValidate.py执行的真正检查函数中必须调用sshTool。而从GaussRoach.py中可以看到,sshTool函数只有在初始化集群参数的时候才会进行初始化,但是初始化单机环境,根本不会进行初始化。所以,在指定了–mode single的时候,我们可以跳过默认的cluster,告诉程序,通过了模式检查,但是在GSroachValidate.py的时候,由于无法调用sshTool中的executeCommand(或者说,调用后,少了初始化集群时候的参数),所以会造成这种错误。
image.png
最后,再解释一下,为什么在validate一个已经delete状态的备份集的时候就会显示出正常的不可用状态?
image.png
这是因为,我们已经告诉程序,我们是单机,且在GaussRoach.py中执行到do_validate的时候,会先去找backup-key,当发现没有这个backup-key的时候就会直接输出backup-key不可用,而不会跳转到GSroachValidate.py中做start_validate了
image.png

这里问题的解决,要特别感谢章芋文老师给我提出思路和建议以及我公司兰珊童鞋的老公-史云锋。是他们在深夜中,帮我一起查找分析原因,才能快速分析并找到问题原因。

从这里其实也可以看出GaussDB的一些工具中中,或多或少还是存在一些bug的。不过相信华为的GaussDB会一定会越来越完善

暂无图片 评论
暂无图片 有用 0
王小那个鑫
问题已关闭: 问题已经得到解决
暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏