Frage

Auf diese Frage gibt es hier bereits eine Antwort:

Wie erstelle ich Backups in MySQL?

Ich hoffe, dass es etwas Besseres gibt, als einfach alle „x“ Stunden mysqldump auszuführen.

Gibt es so etwas wie SQL Server, bei dem Sie jeden Tag ein vollständiges Backup und dann stündlich ein inkrementelles Backup erstellen können, sodass Sie bei einem Ausfall Ihrer Datenbank bis zum neuesten Backup wiederherstellen können?

Etwas wie das DB-Protokoll, bei dem Sie, solange das Protokoll nicht ausfällt, genau den Punkt wiederherstellen können, an dem die Datenbank ausgefallen ist?

Und wie wirken sich diese Dinge auf das Sperren aus?Ich gehe davon aus, dass die Online-Transaktionen für eine Weile gesperrt sind, wenn ich einen MySQL-Dump durchführe.

War es hilfreich?

Lösung

Vielleicht möchten Sie einen Blick darauf werfen inkrementelle Backups.

Andere Tipps

mysqldump ist ein vernünftiger Ansatz, aber bedenken Sie, dass dadurch bei einigen Engines Ihre Tabellen für die Dauer des Dumps gesperrt werden – und dies führt bei großen Produktionsdatensätzen zu Verfügbarkeitsproblemen.

Eine offensichtliche Alternative dazu ist mk-parallel-dump von Maatkit (http://www.maatkit.org/), was Sie unbedingt ausprobieren sollten, wenn Sie ein MySQL-Administrator sind.Dadurch werden mit mysqldump mehrere Tabellen oder Datenbanken parallel gesichert, wodurch sich die Gesamtzeit verringert, die Ihr Dump benötigt.

Wenn Sie in einem replizierten Setup arbeiten (und wenn Sie MySQL für wichtige Daten in der Produktion verwenden, gibt es keine Ausreden, dies nicht zu tun), verhindert das Erstellen von Dumps von einem Replikations-Slave, der für diesen Zweck vorgesehen ist, Sperrprobleme Ärger verursachen.

Die nächste offensichtliche Alternative – zumindest unter Linux – ist die Verwendung von LVM-Snapshots.Sie können Ihre Tabellen sperren, einen Snapshot des Dateisystems erstellen und die Tabellen wieder entsperren;Starten Sie dann ein zusätzliches MySQL mit einem Mount dieses Snapshots und erstellen Sie von dort aus einen Dump.Dieser Ansatz wird hier beschrieben: http://www.mysqlperformanceblog.com/2006/08/21/using-lvm-for-mysql-backup-and-replication-setup/

Jetzt fange ich an, wie ein Vermarkter für dieses Produkt zu klingen.Ich habe damit eine Frage beantwortet Hier, dann habe ich einem anderen noch einmal damit geantwortet Hier.

Kurz gesagt: Probieren Sie sqlyog (in Ihrem Fall Enterprise) aus webyog für alle Ihre MySQL-Anforderungen.es nicht nur plant Backups, aber auch plant die Synchronisierung So können Sie Ihre Datenbank tatsächlich auf einen Remote-Server replizieren.

Es gibt eine kostenlose Community-Edition sowie eine Enterprise-Edition.Ich empfehle Ihnen Letzteres, obwohl ich Ihnen auch empfehle, mit der Comm-Edition zu beginnen und zuerst Sehen Sie, wie es Ihnen gefällt.

Ich verwende mysqlhotcopy, a schnelles Online-Hot-Backup-Dienstprogramm für lokale MySQL-Datenbanken und -Tabellen.Ich bin ziemlich zufrieden damit.

Die Leute von Percona haben eine Open-Source-Alternative zu Innobackup entwickelt ...

Xtrabackup

https://launchpad.net/percona-xtrabackup/

Lesen Sie diesen Artikel über XtraDBhttp://www.linux-mag.com/cache/7356/1.html

Möglicherweise möchten Sie Ihr aktuelles Offline-Sicherungsschema um ergänzen MySQL-Replikation.

Wenn dann ein Hardwarefehler auftritt, können Sie die Maschinen einfach austauschen.Wenn Sie den Fehler schnell erkennen, werden Ihre Benutzer keine Ausfallzeiten oder Datenverluste bemerken.

Ich verwende ein einfaches Skript, das die MySQL-Datenbank in eine tar.gz-Datei speichert, sie mit GPG verschlüsselt und an ein E-Mail-Konto sendet (Google Mail, aber das ist eigentlich irrelevant).

Das Skript ist ein Python-Skript, das im Grunde den folgenden Befehl ausführt und die Ausgabedatei per E-Mail versendet.

mysqldump -u theuser -p mypassword thedatabase | gzip -9 - | gpg -e -r 12345 -r 23456 > 2008_01_02.tar.gz.gpg

Dies ist das gesamte Backup.Es verfügt auch über den Web-Backup-Teil, der die Dateien einfach tar/gzipt/verschlüsselt.Da es sich um eine relativ kleine Website handelt, sind die Web-Backups deutlich kleiner als 20 MB und können daher problemlos an das GMail-Konto gesendet werden (die MySQL-Dumps sind winzig, etwa 300 KB komprimiert).Es ist extrem einfach und lässt sich nicht sehr gut skalieren.Ich führe es einmal pro Woche mit cron aus.

Ich bin mir nicht ganz sicher, wie wir längere Skripte in Antworten einfügen sollen, also füge ich es einfach als Codeblock ein.

#!/usr/bin/env python
#encoding:utf-8
#
# Creates a GPG encrypted web and database backups, and emails it

import os, sys, time, commands

################################################
### Config

DATE = time.strftime("%Y-%m-%d_%H-%M")

# MySQL login
SQL_USER = "mysqluser"
SQL_PASS = "mysqlpassword"
SQL_DB = "databasename"

# Email addresses
BACKUP_EMAIL=["email1@example.com", "email2@example.com"] # Array of email(s)
FROM_EMAIL = "root@myserver.com" # Only one email

# Temp backup locations
DB_BACKUP="/home/backupuser/db_backup/mysite_db-%(date)s.sql.gz.gpg" % {'date':DATE}
WEB_BACKUP="/home/backupuser/web_backup/mysite_web-%(date)s.tar.gz.gpg" % {'date':DATE}

# Email subjects
DB_EMAIL_SUBJECT="%(date)s/db/mysite" % {'date':DATE}
WEB_EMAIL_SUBJECT="%(date)s/web/mysite" % {'date':DATE}

GPG_RECP = ["MrAdmin","MrOtherAdmin"]
### end Config
################################################

################################################
### Process config
GPG_RECP = " ".join(["-r %s" % (x) for x in GPG_RECP]) # Format GPG_RECP as arg

sql_backup_command = "mysqldump -u %(SQL_USER)s -p%(SQL_PASS)s %(SQL_DB)s | gzip -9 - | gpg -e %(GPG_RECP)s > %(DB_BACKUP)s" % {
    'GPG_RECP':GPG_RECP,
    'DB_BACKUP':DB_BACKUP,
    'SQL_USER':SQL_USER,
    'SQL_PASS':SQL_PASS,
    'SQL_DB':SQL_DB
}

web_backup_command = "cd /var/www/; tar -c mysite.org/ | gzip -9 | gpg -e %(GPG_RECP)s > %(WEB_BACKUP)s" % {
    'GPG_RECP':GPG_RECP,
    'WEB_BACKUP':WEB_BACKUP,
}
# end Process config
################################################

################################################
### Main application
def main():
        """Main backup function"""
        print "Backing commencing at %s" % (DATE)

        # Run commands
        print "Creating db backup..."
        sql_status,sql_cmd_out = commands.getstatusoutput(sql_backup_command)
        if sql_status == 0:
                db_file_size = round(float( os.stat(DB_BACKUP)[6]  ) /1024/1024, 2) # Get file-size in MB
                print "..successful (%.2fMB)" % (db_file_size)
                try:
                    send_mail(
                        send_from = FROM_EMAIL,
                        send_to   = BACKUP_EMAIL,
                        subject   = DB_EMAIL_SUBJECT,
                        text      = "Database backup",
                        files     = [DB_BACKUP],
                        server    = "localhost"
                    )
                    print "Sending db backup successful"
                except Exception,errormsg:
                    print "Sending db backup FAILED. Error was:",errormsg
                #end try

                # Remove backup file
                print "Removing db backup..."
                try:
                        os.remove(DB_BACKUP)
                        print "...successful"
                except Exception, errormsg:
                        print "...FAILED. Error was: %s" % (errormsg)
                #end try
        else:
                print "Creating db backup FAILED. Output was:", sql_cmd_out
        #end if sql_status

        print "Creating web backup..."
        web_status,web_cmd_out = commands.getstatusoutput(web_backup_command)
        if web_status == 0:
                web_file_size = round(float( os.stat(WEB_BACKUP)[6]  ) /1024/1024, 2) # File size in MB
                print "..successful (%.2fMB)" % (web_file_size)
                try:
                    send_mail(
                        send_from = FROM_EMAIL,
                        send_to   = BACKUP_EMAIL,
                        subject   = WEB_EMAIL_SUBJECT,
                        text      = "Website backup",
                        files     = [WEB_BACKUP],
                        server    = "localhost"
                    )
                    print "Sending web backup successful"
                except Exception,errormsg:
                    print "Sending web backup FAIELD. Error was: %s" % (errormsg)
                #end try

                # Remove backup file
                print "Removing web backup..."
                try:
                        os.remove(WEB_BACKUP)
                        print "...successful"
                except Exception, errormsg:
                        print "...FAILED. Error was: %s" % (errormsg)
                #end try
        else:
                print "Creating web backup FAILED. Output was:", web_cmd_out
        #end if web_status
#end main
################################################

################################################
# Send email function

# needed email libs..
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email import Encoders

def send_mail(send_from, send_to, subject, text, files=[], server="localhost"):
        assert type(send_to)==list
        assert type(files)==list

        msg = MIMEMultipart()
        msg['From'] = send_from
        msg['To'] = COMMASPACE.join(send_to)
        msg['Date'] = formatdate(localtime=True)
        msg['Subject'] = subject

        msg.attach( MIMEText(text) )

        for f in files:
                part = MIMEBase('application', "octet-stream")
                try:
                    part.set_payload( open(f,"rb").read() )
                except Exception, errormsg:
                    raise IOError("File not found: %s"%(errormsg))
                Encoders.encode_base64(part)
                part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(f))
                msg.attach(part)
    #end for f

        smtp = smtplib.SMTP(server)
        smtp.sendmail(send_from, send_to, msg.as_string())
        smtp.close()
#end send_mail
################################################

if __name__ == '__main__':
        main()

Sie können über mysqldump mit den Optionen „--single-transaction --skip-lock-tables“ vollständige Dumps von InnoDB-Datenbanken/-Tabellen ohne Sperren (Ausfallzeit) erstellen.Funktioniert gut für die Erstellung wöchentlicher Schnappschüsse + täglich/stündlich binäre Log-Inkremente (#Verwenden des Binärprotokolls zum Aktivieren inkrementeller Sicherungen).

@Jake,

Danke für die Info.Nun sieht es so aus, als ob nur die kommerzielle Version über Backup-Funktionen verfügt.

Ist in MySQL nichts eingebaut, um anständige Backups durchzuführen?

Die offizielle MySQL-Seite empfiehlt sogar Dinge wie „Nun, Sie können die Dateien kopieren, SO LANGE SIE NICHT AKTUALISIERT WERDEN“ ...

Das Problem bei einer direkten Sicherung des MySQL-Datenbankordners besteht darin, dass die Sicherung nicht unbedingt konsistent ist, es sei denn, Sie führen während der Sicherung eine Schreibsperre durch.

Ich führe ein Skript aus, das alle Datenbanken durchläuft, für jede eine mysqldump- und eine gzip-Datei in einen Sicherungsordner ausführt und diesen Ordner dann auf Band sichert.

Dies bedeutet jedoch, dass es so etwas nicht gibt inkrementell Sicherungen, da der nächtliche Dump ein vollständiger Dump ist.Aber ich würde behaupten, dass dies eine gute Sache sein könnte, da eine Wiederherstellung von einem Vollständige Sicherung ist ein erheblich schnellerer Prozess als die Wiederherstellung aus inkrementellen Dateien – und wenn Sie auf Band sichern, müssen Sie wahrscheinlich eine Reihe von Bändern sammeln, bevor Sie eine vollständige Wiederherstellung durchführen können.

Unabhängig davon, für welchen Backup-Plan Sie sich entscheiden, sollten Sie auf jeden Fall eine Testwiederherstellung durchführen, um sicherzustellen, dass sie funktioniert, und sich ein Bild davon machen, wie lange es dauern könnte und welche Schritte Sie genau durchführen müssen.

Der richtige Weg, inkrementelle oder kontinuierliche Sicherungen eines MySQL-Servers durchzuführen, ist die Verwendung von Binärprotokollen.

Sperren Sie zunächst alle Tabellen oder fahren Sie den Server herunter.Verwenden Sie MySQL Dump, um ein Backup zu erstellen, oder kopieren Sie einfach das Datenverzeichnis.Sie müssen dies nur einmal oder immer dann tun, wenn Sie eine VOLLSTÄNDIGE Sicherung wünschen.

Bevor Sie den Server wieder hochfahren, stellen Sie sicher, dass die binäre Protokollierung aktiviert ist.

Um eine inkrementelle Sicherung zu erstellen, melden Sie sich beim Server an und geben Sie einen FLUSH LOGS-Befehl aus.Sichern Sie dann die zuletzt geschlossene Binärprotokolldatei.

Wenn Sie alle innodb-Tabellen haben, ist es einfacher, einfach inno hot backup (nicht kostenlos) oder mysqldump mit der Option --single-transaction zu verwenden (Sie sollten besser über viel Speicher verfügen, um die Transaktionen abzuwickeln).

Binäre Protokolle sind wahrscheinlich die richtige Möglichkeit, inkrementelle Sicherungen durchzuführen. Wenn Sie jedoch binären Dateiformaten für die dauerhafte Speicherung nicht vertrauen, finden Sie hier eine ASCII-Methode zur Durchführung inkrementeller Sicherungen.

mysqldump ist kein schlechtes Format. Das Hauptproblem besteht darin, dass es eine Tabelle als eine große Zeile ausgibt.Das folgende triviale sed teilt seine Ausgabe entlang der Datensatzgrenzen auf:

Mysqldump --opt -p | sed -e "s/, (/, n (/g"> Datenbank.dump

Die resultierende Datei ist ziemlich diff-freundlich und ich habe sie ziemlich erfolgreich in einem Standard-SVN-Repository gespeichert.Dadurch können Sie auch einen Verlauf der Backups führen, falls Sie feststellen, dass die letzte Version fehlerhaft ist und Sie die Version der letzten Woche benötigen.

Dies ist eine ziemlich solide Lösung für die Linux-Shell.Ich benutze es seit Jahren:

http://sourceforge.net/projects/automysqlbackup/

  • Führt fortlaufende Backups durch:täglich, monatlich, jährlich
  • Viele Möglichkeiten

@Daniel,

Falls Sie immer noch interessiert sind, gibt es eine neue (für mich neue) Lösung, die von geteilt wird Paul Galbraith, ein Tool, das die Online-Sicherung von innodb-Tabellen namens ermöglicht ibbackup aus dem Orakel, um Paulus zu zitieren,

bei Verwendung in Verbindung mit innobackup, hat großartig bei der Erstellung eines nächtlichen Backups gearbeitet, ohne Ausfallzeiten während des Backups

Weitere Einzelheiten finden Sie unter Pauls Blog

Es hört sich so an, als würden Sie von einem Transaktions-Rollback sprechen.

Was Sie also brauchen: Wenn Sie über die Protokolle verfügen, die alle historischen Abfragen enthalten, ist das dann nicht bereits die Sicherung?Warum benötigen Sie ein inkrementelles Backup, das im Grunde eine redundante Kopie aller Informationen in DB-Protokollen ist?

Wenn ja, warum verwenden Sie nicht einfach mysqldump und führen von Zeit zu Zeit ein Backup durch?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top