![](/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.