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

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(0)
lines = ''.join(out_temp.readlines())
if out_temp:
     out_temp.close()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据源的港湾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值