Question

Cette question a déjà une réponse ici:

Comment dois-je faire des sauvegardes MySQL?

J'espère qu'il y aura quelque chose de mieux que de courir juste mysqldump tous les "x" heures.

Est-il quelque chose comme SQL Server a, où vous pouvez prendre une sauvegarde complète chaque jour, et puis des incréments toutes les heures, donc si votre DB meurt, vous pouvez restaurer la dernière sauvegarde?

Quelque chose comme le journal de base de données, où aussi longtemps que le journal ne meurt pas, vous pouvez restaurer jusqu'au point exact où la DB est mort?

Aussi, comment ces choses affectent de verrouillage?J'imagine que les transactions en ligne pour être verrouillé pendant un certain temps si je fais un dump.

Était-ce utile?

La solution

Vous voudrez peut-être consulter sauvegardes incrémentielles.

Autres conseils

mysqldump est une approche raisonnable, mais garder à l'esprit que pour certains moteurs, cela permettra de verrouiller vos tables pour la durée de la décharge - et cela a des problèmes de disponibilité pour la production de grandes séries de données.

Une alternative évidente à cela est mk-parallèle-vidage de Maatkit (http://www.maatkit.org/) qui vous devriez vraiment vérifier si vous êtes un administrateur mysql.Cette décharges de plusieurs tables ou bases de données en parallèle à l'aide de la commande mysqldump, et donc de diminuer la quantité de temps total de votre dump prend.

Si vous êtes en cours d'exécution dans un répliquées setup (et si vous utilisez MySQL pour les données importantes dans la production, vous n'avez pas d'excuses pour ne pas le faire), pris des décharges à partir d'un esclave de réplication dédié à l'objectif de prévenir toute serrure questions de causer des ennuis.

La prochaine alternative évidente - sur Linux, au moins - est d'utiliser des snapshots LVM.Vous pouvez verrouiller vos tables, de l'instantané de système de fichiers, et de déverrouiller les tables de nouveau;démarrer ensuite une nouvelle MySQL à l'aide d'un montage de cet instantané, le dumping à partir de là.Cette approche est décrite ici: http://www.mysqlperformanceblog.com/2006/08/21/using-lvm-for-mysql-backup-and-replication-setup/

maintenant je commence à sonner comme un marché pour ce produit.j'ai répondu à une question avec elle ici, puis j'ai répondu à un autre avec elle à nouveau ici.

en un mot, essayez de sqlyog (enterprise dans votre cas) à partir de webyog pour tous vos mysql exigences.non seulement les horaires des sauvegardes, mais aussi horaires de la synchronisation vous pouvez donc en fait la reproduction de votre base de données vers un serveur distant.

il a une communauté libre de l'édition ainsi que l'édition entreprise.je recommande le plus tard pour vous mais aussi je vous conseille de commencer avec le comm de l'édition et de la première voir comment vous l'aimez.

J'utilise mysqlhotcopy, un vite sur la ligne à chaud de l'utilitaire de sauvegarde pour local MySQL bases de données et tables.Je suis très heureux avec elle.

le Percona les gars, un open source alternative de innobackup ...

Xtrabackup

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

Lire cet article sur XtraDB http://www.linux-mag.com/cache/7356/1.html

Il est conseillé de compléter votre actuelle hors ligne du système de sauvegarde avec La réplication MySQL.

Alors si vous avez une panne matérielle, vous pouvez juste changer les machines.Si vous prenez rapidement les pannes, vous êtes les utilisateurs ne remarquent même pas de temps ou de perte de données.

J'utilise un script simple qui vide la base de données mysql dans un tar.gz fichier, chiffre à l'aide de gpg et l'envoie à un compte de messagerie (Messagerie de Google, mais c'est vraiment hors de propos)

Le script est un script Python, qui, fondamentalement, exécute la commande suivante, et les mails, le fichier de sortie.

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

C'est l'ensemble de la sauvegarde.Il a également la web-sauvegarde de la partie, qui vient de goudron/archives gzip/crypte les fichiers.C'est un site relativement petit, de sorte que le web les sauvegardes sont beaucoup moins que 20 mo, donc peut être envoyé au compte GMail sans problème (la base de données MySQL sont minuscules, à environ 300 KO compressé).C'est très basique et n'a pas d'échelle très bien.Je le lance une fois par semaine à l'aide de cron.

Je ne suis pas tout à fait sûr de savoir comment nous sommes censés mettre longuets scripts de réponses, donc je vais pousser comme un code-block..

#!/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()

Vous pouvez faire plein de vidages des bases de données InnoDB/tables sans verrouillage (temps d'arrêt) via mysqldump avec "--single-transaction --skip-lock-tables" options.Fonctionne bien pour faire des instantanés hebdomadaires + quotidiennes/horaire le log binaire incréments (#À l'aide du Log Binaire pour Permettre des Sauvegardes Incrémentielles).

@Jake,

Merci pour l'info.Maintenant, il ressemble seulement la version commerciale dispose de fonctions de sauvegarde.

N'est-ce pas là quelque CHOSE de construit dans MySQL pour faire décent sauvegardes?

L'officiel de MySQL page recommande même des choses comme: "eh bien, vous pouvez copier les fichiers, tant QU'ILS ne sont PAS mis à JOUR"...

Le problème avec un droit de sauvegarde de la base de données mysql dossier est que la sauvegarde ne seront pas nécessairement homogènes, sauf si vous avez une écriture de verrouillage lors de la sauvegarde.

Je lance un script qui parcourt toutes les bases de données, faire un mysqldump et gzip sur chacun pour un dossier de sauvegarde, puis de la sauvegarde de ce dossier sur la bande.

Toutefois, cela signifie qu'il n'y a pas une telle chose comme différentiels sauvegardes, depuis la nuit de dump dump complet.Mais je dirais que ce pourrait être une bonne chose, car une restauration à partir d'une sauvegarde complète sera considérablement le processus plus rapide que la restauration à partir des incréments - et si vous êtes de sauvegarde sur bande, il va sûrement vouloir dire la collecte d'un certain nombre de bandes avant de pouvoir faire une restauration complète.

En tout cas, selon le plan de sauvegarde vous aller avec, assurez-vous de faire un essai de restauration pour s'assurer qu'il fonctionne, et obtenir une idée de combien de temps il pourrait prendre, et exactement ce que les étapes que vous devez aller à travers.

la bonne façon de run incremental ou des sauvegardes en continu d'un serveur mysql est binaire, journaux.

pour commencer, verrouiller toutes les tables ou mettez le serveur hors tension.utilisez dump mysql pour faire une sauvegarde, ou tout simplement copier le répertoire de données.vous avez seulement à faire une fois, ou à tout moment vous voulez une sauvegarde COMPLÈTE.

avant de vous remettre le serveur, assurez-vous que binaire la journalisation est activée.

pour prendre une sauvegarde incrémentielle, connectez-vous au serveur et à émettre une commande FLUSH LOGS de commande.ensuite, la sauvegarde la plus récente fermée binaire du fichier journal.

si vous avez toutes les tables innodb, il est plus simple d'utiliser le programme de sauvegarde à chaud (pas gratuit) ou mysqldump avec l' --single-transaction option (vous feriez mieux d'avoir beaucoup de mémoire pour gérer les transactions).

Binaire journaux sont probablement la façon correcte de faire des sauvegardes incrémentielles, mais si vous n'avez pas confiance dans les formats de fichier binaire pour le stockage permanent voici un ASCII façon de faire des sauvegardes incrémentielles.

mysqldump n'est pas un mauvais format, le principal problème est qu'il génère des trucs un tableau comme une grande ligne.La suite trivial sed va diviser sa sortie le long d'enregistrement des frontières:

mysqldump --opt -p | sed -e "s/,(/, (/g" > base de données.dump

Le fichier résultant est assez diff de l'environnement, et j'ai été de les garder dans un standard dépôt SVN assez réussi.Qui vous permet également de conserver un historique des sauvegardes, si vous trouvez que la dernière version suis complètement foireuse et vous avez besoin de la semaine dernière version.

C'est une bonne solution pour le shell Linux.Je l'utilise depuis des années:

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

  • Ne roulant des sauvegardes:quotidien, mensuel, annuel
  • De nombreuses options

@Daniel,

dans le cas où vous êtes toujours intéressé, il est plutôt neuf (nouveau pour moi), solution partagée par Paul Galbraith, un outil qui permet la sauvegarde en ligne de tables innodb appelé ibbackup à partir d'oracle qui, pour citer Paul,

lorsqu'il est utilisé conjointement avec innobackup, a beaucoup travaillé dans création d'une sauvegarde nocturne, sans les temps d'arrêt lors de la sauvegarde

plus de détails peuvent être trouvés sur Le blog de Paul

Son comme vous parlez de la transaction revenir.

Donc, en termes de ce que vous avez besoin, si vous avez les journaux contenant tout l'historique des requêtes, n'est-ce pas que la sauvegarde déjà?Pourquoi avez-vous besoin d'une sauvegarde incrémentielle qui est essentiellement une copie redondante de toutes les informations en DB journaux?

Si oui, pourquoi ne pas simplement utiliser mysqldump et de faire la sauvegarde chaque fois un certain temps?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top