我编写了一个python脚本来转储数据库,对其进行gzip压缩并将其移动到云存储中。
在本地,一切正常,基本上不消耗内存(最大20MB RAM,CPU很高,I / O处于最大值)。
当我在kubernetes集群中将其作为作业运行时,内存使用量会累积到约1.6 GB。
大约等于我压缩后的转储文件的大小。
这是我的转储逻辑:
mysqldump_command = ['mysqldump', f'--host={host}', f'--port={port}', f'--user={username}',
f'--password={password}', '--databases', '--compact',
'--routines', db_name, f'--log-error={self.errorfile}']
print(f'## Creating mysql dump')
with open(self.filename_gzip, 'wb', 0) as f:
p1 = subprocess.Popen(mysqldump_command, stdout=subprocess.PIPE)
p2 = subprocess.Popen('gzip', stdin=p1.stdout, stdout=f)
p1.stdout.close() # force write error (/SIGPIPE) if p2 dies
p2.wait()
p1.wait()
我尝试过:
PYTHONUNBUFFERED=1
,无效。 还有其他想法吗?
谢谢!
答案 0 :(得分:1)
我复制了您的设置,转储仍然具有更严格的限制。
我只是在my-job.yml中设置资源上限,它不再消耗太多内存:
'DRIVER={SQL Server Native Client 11.0};SERVER=servername;DATABASE=databasename;Trusted_Connection=yes'
答案 1 :(得分:0)
您可以使用pydump编写的GuruTux。
至于缓冲区限制,请参见Python subprocess文档,以更详细地使用该结构,SAPvsSH
如下。
此外,您可以执行远程mysql转储,只需拉出.gz文件即可保存麻烦。