2016-08-11 2 views
1

Ich habe ein Python-Skript, das jede Stunde meine MySQL-Datenbank in Amazon S3-Buckets sichert. Ich verwende das Skript, um einfach mysqldump aufzurufen, um den Speicherauszug zu erstellen und dann in den S3-Bucket unter Verwendung von tinys3 hochzuladen, beachte, dass ich lock-tables auf false setze, so dass Transaktionen von anderen Anwendungen nicht behindert werden. HierServerabsturz bei MySQL-Sicherung mit Python

ist das Skript für Ihre Referenz:

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) 

Das Problem ist, dass, wenn ich starten Sie den Cron-Job dieses Skript jede Stunde, der Server abstürzt nach ein paar Stunden laufen (etwa 5 bis 7 Stunden) . Ich habe noch keinen wesentlichen Grund für dieses Verhalten gefunden. Was ist das Problem hier? Gibt es einen Fehler in diesem Skript oder etwas in Bezug auf MySQL?

+0

Erhalten Sie irgendwelche Protokolle, wenn MySQL abstürzt? – Chris

+0

Der gesamte Server ist ausgefallen und muss neu gestartet werden, nicht nur MySQL. Die MySQL-Fehlerprotokolle zeigen ebenfalls keine Fehler. –

Antwort

2

Es ist leicht sich vorzustellen, was hier passiert. Mysqldump ist langsam. Wiederherstellung schlechter.

Es ist nicht als eine schnelle oder skalierbare Lösung für die Sicherung von erhebliche Datenmengen gedacht. Bei großen Datengrößen kann die Wiederherstellung der Daten auch dann sehr langsam sein, wenn die Sicherung eine angemessene Zeit benötigt , da das Abspielen der SQL-Anweisungen Datenträger-E/A zum Einfügen, Indexerstellung usw. umfasst.

Sobald Sie das Backup nehmen, scheinen Sie es zu zippen, dann laden Sie es auf Amazon S3. Es ist meine Vermutung, dass Ihre zweite Sicherung beginnt, bevor die erste beendet wird und es eskaliert, bis der Server überlastet ist.

Auch wenn Ihr Server nicht abstürzt, sollten Sie diesen Ansatz immer noch nicht verwenden, da Sie in ein paar Monaten riesige Mengen für den Speicher ausgeben werden.

Es gibt viel viel besseren Weg. Mysql replication. Keine Cronjobs, fast sofortige Erholung, wenn der Mast ausfällt, keine sperrigen Datenübertragungen.

Verwandte Themen