簡體   English   中英

Python:使用mutithreading掛起通過gzip對MySQL數據庫的mysqldump輸出進行管道傳遞

[英]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的管道操作的情況? 因此,系統最終繼續使用交換文件並隨后凍結。

備用碼(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

有沒有一種方法可以改善我的腳本或使其按要求工作? 任何建議將不勝感激。

最快,最一致的方法如果您可以承受幾秒鍾的服務中斷:

  • 停止數據庫-您的系統從此處不可用
  • 拍攝文件系統快照(大約需要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在MySql上進行工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM