2015-09-07 65 views
0

我正在尋求提高我的MySQL數據庫備份操作的性能。 然後,我想出了一個爲2-3個mysql數據庫(每個大規模,〜70+ GB,其中大多數都是innodb)同時執行備份的想法,並且我的要求基本上是基於需要獲取東西做得非常快。以下是我目前用於用Python編寫的備份過程的腳本。Python:通過使用mutithreading的gzip管道MySQL數據庫的mysqldump輸出掛起

然後我寫了下面的備份腳本,這是我進行的mysqldump管道通過的gzip用於在不同的線程每個數據庫。 我開始通過傳遞2個參數來分別備份Staging和Production dbs來運行它。 從測試的中間,我注意到腳本導致我的Ubuntu盒子沒有其他工作負載運行,在交換文件上運行,並且它開始掛起。 (不幸的是,我無法及時獲取快照以獲取一些證據,因爲更多的重點在於消除不必要的資源耗費的運行任務。)

最重要的是,如果通常這種方法可以得到您的專家意見有效地完成或不完成。從硬件規格方面來看,我的服務器看起來已經非常強大了,每塊內存爲64GB RAM和32個核心CPU/2.7 GHz。或者可能是因爲我的數據庫的大小非常大,系統的管道緩衝區似乎不夠大,無法處理將mysqldump輸出管道傳輸到gzip的操作?所以,系統結束了交換文件並隨後凍結。

備用碼(backup.py)

from datetime import datetime 
import threading 
import ftplib 
import sys 
import os 

hostname = '..host name..' 
username = '..user name..' 
password = '..password..' 

class backupThread (threading.Thread): 
    def __init__(self, threadID, counter, image_name): 

     self.threadID = threadID 
     self.counter = counter 
     self.db_name = db_name 
     threading.Thread.__init__(self) 

    def run(self): 

     dt = datetime.now().strftime('%Y%m%d%H%M') 
     filename = "%s_%s.sql" % (self.db_name,dt) 

     os.popen("mysqldump -u %s -p%s -h %s -e --opt -c %s | gzip -c > %s.gz" % (username, password, hostname, self.db_name, filename)) 


dbnames = sys.argv[1:] 

i = 1 
threads = [] 

for dbname in dbnames: 

    thread = backupThread(i, i, dbname) 
    thread.start() 
    threads.append(thread)   
    i += 1 

for t in threads: 
    t.join() 

調用命令

python backup.py staging production 

有沒有辦法,我可以提高我的腳本或得到這個按規定的工作方式?任何建議將非常感激。

+0

請問你能確認我的下列推測嗎? - 在備份期間您不關心數據庫服務器的可用性以用於其他目的; - 您的服務器不在雲中,我們可以完全訪問本機; - 您正在遠程運行mysqldump。 – olivecoder

+0

謝謝olivecoder。作爲迴應,不,沒有數據庫服務器的可用性是值得關注的,但事情只需要快。其次,是的,我的服務器位於我的公司本地。而且,是的,我們可以完全控制該機器。 但不,我只需要在本地運行mysqldump。對於給定用例的任何解決方案都將非常感激。 –

回答

1

這樣做,如果你能負擔得起的服務中斷幾秒鐘最快的,一致的方式:

  • 停止數據庫 - 你的系統變得不可用從這裏
  • 取一個文件系統快照(取〜 2秒,因爲它通常採用寫入時複製的方式)
  • 啓動數據庫 - 系統在此點之後回來
  • 從拍攝的快照中進行二進制備份。

如果您使用的是基於Red Hat(基於Linux)的發行版,那麼您很有可能已經在使用LVM。如果你不是那麼你需要LVM或其他解決方案,讓你的文件系統快照採用這種方法。

如果你只是想解決你的腳本然後寫mysqldump的磁盤,後來壓縮。這不應該影響使用交換時寫入磁盤的性能。

[更新]

我發現,給你更多的細節參考: https://www.percona.com/blog/2006/08/21/using-lvm-for-mysql-backup-and-replication-setup/

所以,你並不需要完全停止服務器,你可以使用FLUSH TABLES WITH READ LOCK做在MySql上的工作。

+0

我很欣賞你的建議。最後,我更喜歡按照您的建議修復腳本。它爲我工作。不過,我發現你對使用LVM的進一步建議非常有幫助,我一定會在不久的將來嘗試一下。 –