EsgynDB Troubleshooting - python脚本执行备份导出卡住的问题

2022-07-06 00:00:00 专区 订阅 备份 脚本 大小

EsgynDB数据库中使用DBManager可视化工具通过调用python脚本的方式来执行备份导出的任务。
在数据库节点的cds目录下有相关备份恢复的执行脚本如edb_br_action.py。

此脚本正常情况下均运行正常,但在个别运行很久的环境中,我们偶尔发现脚本会有执行卡住的问题。通过在脚本中关键位置中增加日志,我们定位到脚本卡在了以下语句:

p = subprocess.Popen(sqlci_cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, executable='/bin/bash')
stdout, stderr = p.communicate()


通过网上搜索相关文章,我们找到了避免python Popen阻塞

文中表示,python中subprocess的PIPE是有大小的。在python2.6.11之前,PIPE的大小为文件页的大小(i386上是4096),2.6.11之后变为65536.因此当输出内容超过65536,会引起阻塞。因为PIPE已经被塞满了,无法再塞进更多的数据。
解决方法是不用subprocess提供的PIPE,而是使用自己创建的流。如此,可以控制流的大小。

根据文章中的描述,我们把EsgynDB中调用备份导出任务的脚本edb_br_action.py中关键路径也进行了修改,修改如下:

out_temp = tempfile.SpooledTemporaryFile(bufsize=10*1000)
fileno = out_temp.fileno()
p = subprocess.Popen(sqlci_cmd, stdin=fileno, stdout=fileno, stderr=fileno, shell=True, executable='/bin/bash')
stdout, stderr = p.communicate()
out_temp.seek()
lines = ''.join(out_temp.readlines())
if out_temp:
out_temp.close()








————————————————
版权声明:本文为CSDN博主「post_yuan」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/post_yuan/article/details/123799927

相关文章