繁体   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