使用python进行MySQL备份时发生服务器崩溃

使用python进行MySQL备份时发生服务器崩溃,python,mysql,amazon-s3,Python,Mysql,Amazon S3,我有一个python脚本,它每小时将我的MySQL数据库备份到AmazonS3存储桶。我使用脚本简单地调用mysqldump来创建转储,然后使用tinys3将其上传到S3 bucket,请注意,我将lock tables设置为false,这样其他应用程序的事务就不会受到阻碍 以下是供您参考的脚本: import tinys3 import os from django.core.wsgi import get_wsgi_application os.environ.setdefault("DJA

我有一个python脚本,它每小时将我的MySQL数据库备份到AmazonS3存储桶。我使用脚本简单地调用
mysqldump
来创建转储,然后使用
tinys3
将其上传到S3 bucket,请注意,我将
lock tables
设置为false,这样其他应用程序的事务就不会受到阻碍

以下是供您参考的脚本:

import tinys3
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_project.settings")
application = get_wsgi_application()
from django.utils import timezone
import pytz
import datetime
import json


timezone.activate(pytz.timezone("Asia/Kolkata"))
current_datetime = timezone.localtime(
    datetime.datetime.utcnow().replace(tzinfo=pytz.utc)
)
dir_struct = '/'.join(current_datetime.strftime("%Y-%m-%d-%H-%M-%S").split('-'))

endpoint = 's3-us-west-2.amazonaws.com'

params = json.load(open('buckets.json'))
S3_ACCESS_KEY=params['S3_ACCESS_KEY']
S3_SECRET_KEY = params["S3_SECRET_KEY"]
bucket = params['mysql']
db_name = params['db_name']

mysql_command = 'sudo mysqldump --defaults-file=/home/ubuntu/.my.cnf --lock-tables=false %s > /home/ubuntu/%s.sql' %(db_name, db_name)
compress_command = "zip -r /home/ubuntu/%s.sql.zip /home/ubuntu/%s.sql" %(db_name, db_name)
delete_command = "sudo rm -rf /home/ubuntu/%s.sql*" %db_name

os.system(mysql_command)
os.system(compress_command)

backup_file = open('/home/ubuntu/%s.sql.zip' %db_name, 'rb')

conn = tinys3.Connection(S3_ACCESS_KEY, S3_SECRET_KEY, tls=True,endpoint=endpoint)
print conn.upload(
    (dir_struct+'%s.sql.zip' %db_name),
    backup_file,
    bucket,
    public=False
)
print conn.get((dir_struct+'%s.sql.zip' %db_name),bucket)

os.system(delete_command)

问题是,当我启动cron作业每小时运行一次这个脚本时,服务器会在几个小时后崩溃(比如5到7小时)。我还没有找到这种行为的充分理由。这里有什么问题?这个脚本或与MySQL相关的东西是否有错误?

很容易想象这里发生了什么。速度很慢。更糟

它不是用于备份的快速或可扩展的解决方案 大量的数据。数据量大,即使备份 这一步需要一段合理的时间,恢复数据可能非常缓慢 因为重播SQL语句需要磁盘I/O进行插入, 创建索引,等等

一旦你采取了备份,你似乎压缩它,然后上传到亚马逊s3。我的猜测是,您的第二次备份在第一次备份完成之前就开始了,并且它会不断升级,直到服务器无法正常工作

即使您的服务器没有崩溃,您也不应该使用这种方法,因为几个月后,您将在存储上花费巨资


有一个更好的方法。没有cronjobs,如果mast宕机,几乎无法进行恢复,没有大量的数据传输。

MySQL崩溃时有日志吗?整个服务器宕机,必须重新启动,而不仅仅是MySQL。MySQL错误日志也没有显示任何错误。