2011-06-04 53 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