2011-06-04 51 views
3

我试图备份数据库并使用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") 

编辑:我知道,我可以上传到文件一个远程服务器,但那不是我想要做的与打开命令。我试图压缩一个大文件(数据库转储)是否可以在远程服务器上执行此操作,或者是否必须将数据库转储复制到本地主机,然后在那里进行压缩,然后重新上传。这是本地主机上压缩:

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() 

回答

5

我不知道你是否可以远程打开一个文件。但即使可以,对您而言也许并不是一个好主意,因为您将通过ssh获取大文件(请记住Fabric仍在本地计算机上运行)。为什么不远程压缩文件,然后获取压缩文件?在mysqldump的情况下,它应该是这样的:

run('mysqldump [options] | gzip > outputfile.sql.gz') 
get('outputfile.sql.gz') 

(更多的mysqldump和gzip这里:Compressing mysqldump output

+0

谢谢,正在尝试使用python进行压缩,但使用gzip也能正常工作。 – JiminyCricket 2011-06-06 19:21:03

0
  1. 您需要再次读取面料教程。
  2. 你应该使用os.path.join来组装你的文件路径。
  3. open()调用试图打开本地机器上的文件,而不是远程服务器。
7

在Fabric中,您从不“在远程服务器上”。一些结构命令在本地运行,一些运行在远程服务器上。在这种情况下,您正在使用Python的open函数,该函数试图在本地计算机上打开该文件,并且可以理解为失败。您可以使用Fabric的put and get functions在本地计算机和远程服务器之间移动文件。

+0

感谢张贴的链接。请看我更新的问题。我可以远程打开远程主机上的数据并添加到远程文件中,还是需要来回复制 – JiminyCricket 2011-06-06 02:15:55