![](/img/trans.png)
[英]Python equivalent of piping file output to gzip in Perl using a pipe
[英]Python: piping mysqldump output of MySQL databases through gzip using mutithreading hangs
我希望提高MySQL數據庫備份操作的性能。 然后,我想到了同時對2-3個mysql數據庫(每個大數據庫,〜-70+ GB,其中大多數是innodb)執行備份的想法,而我的要求基本上是基於完成工作的需要很快 以下是我目前用於Python備份過程的腳本。
然后,我編寫了以下備份腳本,該腳本通過gzip對不同線程中的每個數據庫執行了mysqldump管道。 我開始通過傳遞2個參數分別備份Staging和Production數據庫來運行它。 從測試的中間,我注意到該腳本導致我的Ubuntu盒子(沒有其他工作負載運行)在交換文件上運行,並且開始掛起。 (不幸的是,我無法及時拍攝快照以獲取一些證據,而更多地側重於殺死不必要的占用資源的運行任務。)
最重要的是,如果通常這種方法能否有效執行,我想征詢您的專家意見。 從硬件規格的角度來看,我的服務器看起來已經非常強大,具有64 GB的RAM和32個核心CPU / 2.7 GHz。 還是我的數據庫太大而系統的管道緩沖區似乎不夠大,無法處理將mysqldump輸出到gzip的管道操作的情況? 因此,系統最終繼續使用交換文件並隨后凍結。
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
有沒有一種方法可以改善我的腳本或使其按要求工作? 任何建議將不勝感激。
最快,最一致的方法如果您可以承受幾秒鍾的服務中斷:
如果您使用的是Red Hat(基於Linux)發行版,那么您很有可能已經在使用LVM。 如果不是,那么您需要LVM或其他解決方案來為您提供文件系統快照,以采用這種方法。
如果您只想修復腳本,則將mysqldump寫入磁盤並稍后對其進行壓縮。 無論如何使用交換時,這不會影響性能,因為您正在寫入磁盤。
[更新]
我找到了可以為您提供更多詳細信息的參考: https : //www.percona.com/blog/2006/08/21/using-lvm-for-mysql-backup-and-replication-setup/
因此,您無需完全停止服務器,因為您可以使用帶有讀取鎖的FLUSH TABLES在MySql上進行工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.