我正在尝试使用Fabric备份数据库并将它们移动到不同的服务器。
在远程服务器上,要打开文件进行写入失败并显示错误。
newFile = open('%s%s' % (dumpPath,newFileName) ,'w')
IOError: [Errno 2] No such file or directory: '/home/ec2-user/dbbackup.sql.bz2'
那些文件存在,我甚至尝试过预先创建以防万一结构没有权限创建,但它仍然无法正常工作
run("touch dbbackup.sql.bz2")
编辑:我知道我可以将文件上传到远程服务器,但这不是我想用open命令做的事情。我正在尝试压缩大文件(数据库转储)是否可以在远程服务器上执行此操作,或者我是否必须将数据库转储复制到本地主机,在那里压缩然后再上传。这是本地主机上的压缩:
compObj= bz2.BZ2Compressor()
newFile = open('%s%s' % (dumpPath,newFileName) ,'w')
dbFile = file( '%s%s' % (dumpPath,filename), "r" )
block= dbFile.read( BLOCK_SIZE )
while True: #write the compressed data
cBlock= compObj.compress( block )
newFile.write(cBlock)
block= dbFile.read( BLOCK_SIZE )
if not block:
break
cBlock= compObj.flush()
答案 0 :(得分:7)
在Fabric中,您永远不会“在远程服务器上”。某些Fabric命令在本地运行,而某些命令在远程服务器上运行。在这种情况下,您正在使用Python的open
函数,该函数尝试在本地计算机上打开该文件,并且可以理解为失败。您可以使用Fabric put and get functions在本地计算机和远程服务器之间移动文件。
答案 1 :(得分:5)
我不知道你是否可以远程打开文件。但即使你可以,在你的情况下也可能不是一个好主意,因为你将通过ssh获取大文件(记住Fabric仍在你的本地机器上运行)。为什么不远程压缩文件,然后获取压缩文件?在mysqldump的情况下,它看起来像这样:
run('mysqldump [options] | gzip > outputfile.sql.gz')
get('outputfile.sql.gz')
(更多关于mysqldump和gzip here:Compressing mysqldump output)
答案 2 :(得分:0)