我正在尋求提高我的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
有沒有辦法,我可以提高我的腳本或得到這個按規定的工作方式?任何建議將非常感激。
請問你能確認我的下列推測嗎? - 在備份期間您不關心數據庫服務器的可用性以用於其他目的; - 您的服務器不在雲中,我們可以完全訪問本機; - 您正在遠程運行mysqldump。 – olivecoder
謝謝olivecoder。作爲迴應,不,沒有數據庫服務器的可用性是值得關注的,但事情只需要快。其次,是的,我的服務器位於我的公司本地。而且,是的,我們可以完全控制該機器。 但不,我只需要在本地運行mysqldump。對於給定用例的任何解決方案都將非常感激。 –