So verwenden Sie Xtrabackup zum Sichern und Wiederherstellen von MySQL

So verwenden Sie Xtrabackup zum Sichern und Wiederherstellen von MySQL

1. Sicherung

Vor dem Sichern müssen Sie einen Backup-Benutzer anlegen. Sie können auch den Root-Benutzer verwenden, um direkt zu sichern, dies ist jedoch nicht Standard.

    Erstellen Sie den Benutzer „backup@'localhost'“ mit der Identifizierung „123456“;
    Gewähren Sie Neuladen, Verarbeiten, Sperren von Tabellen, Replikationsclient auf *.* an Backup@localhost.

1.1 Vollständig vorbereitet

Sichern Sie die gesamte Bibliothek mit dem Backup-Benutzer. Die Sicherungsdatei wird unter /backup/ gespeichert.

    innobackupex --defaults-file=/etc/my.cnf --user=backup --password=123456 /backup/

1.2 Zusätzliche Vorbereitung

Gibt inkrementelle Sicherungen unter Verwendung des Backup-Benutzers an. Die inkrementelle Basis ist die letzte vollständige Sicherung und wurde mit --incremental-basedir angegeben. Die Sicherungsdatei wird in /backup/ gespeichert.

    innobackupex --defaults-file=/etc/my.cnf --user=backup --password=123456 --incremental --incremental-basedir=/backup/2021-06-01_14-44-54 /backup/

2 Sicherung und Wiederherstellung

2.1 Datenaufbereitung

Machen Sie nicht festgeschriebene Transaktionen rückgängig und synchronisieren Sie festgeschriebene Transaktionen mit Datendateien, um die Datendateien konsistent zu machen.

    innobackupex --apply-log --redo-only /backup/2021-06-01_14-44-54/

2.2 Wiederherstellung

Vor der Wiederherstellung müssen Sie sicherstellen, dass das MySQL-Datenverzeichnis gelöscht wurde.

    innobackupex --copy-back --datadir=/usr/local/mysql/data /backup/2021-06-01_14-44-54/

Nach der Wiederherstellung müssen Sie die Berechtigungen für das MySQL-Datenverzeichnis erneut erteilen:

    chown -R mysql:mysql-Daten/

An diesem Punkt ist die Wiederherstellung abgeschlossen.

3 Verzeichnisstruktur

4 Backup-Skripte

4.1 Skripte

Backup.sh

    #!/bin/bash
    # Holen Sie sich den Programmpfadnamen program_dir=`dirname $0`/..
    # Alle Variablenwerte in der Konfigurationsdatei lesen und als globale Variablen festlegen# Konfigurationsdatei conf_file="$program_dir/conf/backup.conf"
    #mysql-Benutzer Benutzer=`sed '/^Benutzer=/!d;s/.*=//' $conf_file`
    #mysql-Passwort Passwort=`sed '/^Passwort=/!d;s/.*=//' $conf_file`
    #mysql-Sicherungsverzeichnis backup_dir=`sed '/^backup_dir=/!d;s/.*=//' $conf_file`
    #mysql Backup-Komprimierungspaketverzeichnis gzip_dir=`sed '/^gzip_dir=/!d;s/.*=//' $conf_file`
    # percona-xtrabackup-Befehl xtrabackup-Pfad xtrabackup_bin=`sed '/^xtrabackup_bin=/!d;s/.*=//' $conf_file`
    #mysql-Präfixkennung für vollständige Sicherung full_backup_prefix=`sed '/^full_backup_prefix=/!d;s/.*=//' $conf_file`
    #mysql inkrementeller Präfixbezeichner increment_prefix=`sed '/^increment_prefix=/!d;s/.*=//' $conf_file`
    #Sicherungsfehlerprotokolldatei error_log=$program_dir/var/`sed '/^error_log=/!d;s/.*=//' $conf_file`
    #Indexdatei sichern index_file=$program_dir/var/`sed '/^index_file=/!d;s/.*=//' $conf_file`
    # Sicherungsdatum backup_date=`date +%F`
    # Sicherungszeit backup_time=`date +%H-%M-%S`
    # Der Wochentag für die Sicherung backup_week_day=`date +%u`
    # Erstellen Sie das entsprechende Verzeichnis log_dir=$program_dir/log/backup
    var_dir=$Programmverzeichnis/var
    mkdir -p $backup_dir
    mkdir -p $log_dir
    mkdir -p $var_dir
    mkdir -p $gzip_dir
    # Vollständiges Backup Funktion full_backup() {
      Backup-Ordner = ${full_backup_prefix}_${Backup_date}_${Backup_time}_${Backup_week_day}
      mkdir -p $Backup-Verzeichnis/$Backup-Ordner
      $xtrabackup_bin \
        --user=$Benutzer \
        --password=$passwort \
        --Backup \
        --target-dir=$Sicherungsverzeichnis/$Sicherungsordner > $Logverzeichnis/${Sicherungsordner}.log 2>&1
      zurückgeben $?
    }
    # Inkrementelles Backup Funktion increment_backup() {
      Backup-Ordner = ${Inkrementpräfix}_${Backup-Datum}_${Backup-Zeit}_${Backup-Wochentag}
      incr_base_folder=`sed -n '$p' $index_file | \
                       awk -F '[, {}]*' '{print $3}' | \
                       awk -F ':' '{print $2}'`
      mkdir -p $Backup-Verzeichnis/$Backup-Ordner
      $xtrabackup_bin \
        --user=$Benutzer \
        --password=$passwort \
        --Backup \
        --target-dir=$Sicherungsverzeichnis/$Sicherungsordner \
        --incremental-basedir=$backup_dir/$incr_base_folder > $log_dir/${backup_folder}.log 2>&1
      zurückgeben $?
    }
    # Löschen Sie das vorherige Backup (wird normalerweise nach Abschluss des vollständigen Backups verwendet)
    Funktion delete_before_backup() {
      Katze $index_datei | awk -F '[, {}]*' '{print $3}' | \
        awk -v Backup-Verzeichnis=$Backup-Verzeichnis -F ':' '{if($2!=""){printf("rm -rf %s/%s\n", Backup-Verzeichnis, $2)}}' | \
        /bin/bash
      Katze $index_file | awk -F '[, {}]*' '{print $3}' | \
        awk -v gzip_dir=$gzip_dir -F ':' '{if($2!=""){printf("rm -rf %s/%s\n", gzip_dir, $2)}}' | \
        /bin/bash
      Katze $index_file | awk -F '[, {}]*' '{print $3}' | \
        awk -v log_dir=$log_dir -F ':' '{if($2!=""){printf("rm -rf %s/%s.log\n", log_dir, $2)}}' | \
        /bin/bash
    }
    #Indexdatei sichern Funktion backup_index_file() {
      cp $index_file ${index_file}_$(date -d "vor 1 Tag" +%F)
    }
    #Indexdatei sichern Funktion send_index_file_to_remote() {
      # ./expect_scp IP-Adresse Konto Passwort ${index_file} Zielserver Ordner Portnummer echo 'sende Indexdatei ok'
    }
    # Einen Index hinzufügen, der das letzte Backup aufzeichnet function append_index_to_file() {
      echo "{Wochentag:$backup_Wochentag, \
             dir:${1}_${Sicherungsdatum}_${Sicherungszeit}_${Sicherungswochentag}, \
             Typ: ${1}, \
             Datum: ${Backup_Datum}}" >> $Indexdatei
    }
    # Fehlermeldungen in eine Datei protokollieren function logging_backup_err() {
      echo "{Wochentag:$backup_Wochentag, \
             dir:${1}_${Sicherungsdatum}_${Sicherungszeit}_${Sicherungswochentag}, \
             Typ: ${1}, \
             Datum: ${backup_date}}" >> $error_log
    }
    # Löschen Sie den Index Funktion purge_index_from_file() {
      > $index_datei
    }
    # Fehlerprotokollinformationen löschen Funktion purge_err_log() {
      > $Fehlerprotokoll
    }
    #Paketsicherungsfunktion tar_backup_file() {
      cd $backup_dir
      tar -jcf ${gzip_dir}/${1}_${Sicherungsdatum}_${Sicherungszeit}_${Sicherungswochentag}.tar.bz2 \
               ${1}_${Sicherungsdatum}_${Sicherungszeit}_${Sicherungwochentag}
      cd -> /dev/null
      rm -rf ${Sicherungsverzeichnis}/${1}_${Sicherungsdatum}_${Sicherungszeit}_${Sicherungswochentag}
    }
    # Backup an Remote-Funktion senden send_backup_to_remote() {
      # ./expect_scp IP-Adresse Konto Passwort ${gzip_dir}/${1}_${backup_date}_${backup_time}_${backup_week_day}.tar.bz2 Zielserverordner Portnummer echo "send $1 remote ok"
    }
    # Bestimmen Sie, ob eine vollständige oder inkrementelle Sicherung durchgeführt werden soll# 0:full, 1:incr
    Funktion get_backup_type() {
      Sicherungstyp = 0
      wenn [ 1 -eq `Datum +%H` ]; dann
        Sicherungstyp = 0
      anders
        Sicherungstyp = 1
      fi
      berühren Sie $index_file
      wenn [ ! -n "`cat $index_file`" ]; dann
        Sicherungstyp = 0
      fi
      returniere $backup_type
    }
    # Testen Sie die Richtigkeit der Konfigurationsdateifunktion test_conf_file() {
      # Überprüfen Sie, ob jede Variable in der Konfigurationsdatei konfiguriert ist. Wenn nicht, beenden Sie das Programm if [ ! -n "$user" ]; dann echo 'fail: configure file user not set'; exit 2; fi
      if [ ! -n "$password" ]; then echo 'fail: configure file password not set'; exit 2; fi
      if [ ! -n "$backup_dir" ]; dann echo 'Fehler: Konfigurationsdatei backup_dir nicht festgelegt'; exit 2; fi
      if [ ! -n "$gzip_dir" ]; dann echo 'fail: Konfigurationsdatei backup_dir nicht gesetzt'; exit 2; fi
      if [ ! -n "$full_backup_prefix" ]; dann echo 'fail: Konfigurationsdatei full_backup_prefix nicht gesetzt'; exit 2; fi
      if [ ! -n "$increment_prefix" ]; dann echo 'fail: Konfigurationsdatei increment_prefix nicht gesetzt'; exit 2; fi
      if [ ! -n "$error_log" ]; dann echo 'fail: Konfigurationsdatei error_log nicht gesetzt'; exit 2; fi
      if [ ! -n "$index_file" ]; then echo 'fail: configure file index_file not set'; exit 2; fi
    }
    # Funktion main() ausführen {
      # Erkennungskonfigurationsdateiwert test_conf_file
      # Bestimmen Sie, ob eine vollständige oder inkrementelle Sicherung durchgeführt werden soll get_backup_type
      Sicherungstyp = $?
      Fall $backup_type in
        0 )
          # Vollständige Sicherung full_backup
          backup_ok=$?
          wenn [ 0 -eq "$backup_ok" ]; dann
          # Vollständige Sicherung erfolgreich# Packen Sie die neueste tar_backup_file $full_backup_prefix
            # # Senden Sie das Tar-Backup an Remote send_backup_to_remote $full_backup_prefix
            #Indexdatei sichern backup_index_file
            # Löschen Sie das vorherige Backup delete_before_backup
            # Löschen Sie die Indexdatei purge_index_from_file
            # Fügen Sie einen Index hinzu, der das letzte Backup aufzeichnet. append_index_to_file $full_backup_prefix
            # Indexdatei an Remote senden send_index_file_to_remote
          anders
          # Vollständige Sicherung fehlgeschlagen # Löschen Sie das Sicherungsverzeichnis rm -rf ${backup_dir}/${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}
            # Protokollierungsfehlerprotokoll logging_backup_err $full_backup_prefix
          fi
          ;;
        1)
          # Inkrementelles Backup increment_backup
          backup_ok=$?
          wenn [ "$backup_ok" -eq 0 ]; dann
          # Inkrementelles Backup erfolgreich # Packen Sie das neueste Backup tar_backup_file $increment_prefix
            # # Tar-Backup an Remote senden send_backup_to_remote $increment_prefix
            # Fügen Sie einen Index hinzu, der das letzte Backup aufzeichnet. append_index_to_file $increment_prefix
            # # Indexdatei an Remote senden send_index_file_to_remote
          anders
          # Inkrementelles Backup fehlgeschlagen # Löschen Sie das Backup-Verzeichnis rm -rf ${backup_dir}/${increment_prefix}_${backup_date}_${backup_time}_${backup_week_day}
            # Fehlerprotokoll aufzeichnen logging_backup_err $increment_prefix
          fi
          ;;
      esac
    }
    hauptsächlich

4.2 Konfigurationsdateien

Backup.conf

    #mysql Benutzername Benutzer=Backup
    #mysql-Passwort password=123456
    # Sicherungspfad backup_dir=/data/backup
    # Verzeichnis des Backup-Komprimierungspakets gzip_dir=/data/backups/backups_zip
    # innobackupex-Befehlspfad xtrabackup_bin=/opt/xtrabackup/bin/xtrabackup
    #Präfix des Namens der vollständigen Sicherungsinformationen full_backup_prefix=full
    #Inkrementelles Backup-Informationsnamenpräfix increment_prefix=incr
    # Fehlerprotokolldatei (anhand dieser Datei wird festgestellt, ob die Sicherung erfolgreich war)
    # Format:
    # {Wochentag:1,Dir:voll/incr_2015-12-29_00-00-00_7,Typ:voll/incr,Datum:2015-12-30}
    error_log=mysql_increment_hot_backup.err
    # Indexdatei# Format:
    # {Wochentag:1,Dir:voll/incr_2015-12-29_00-00-00_7,Typ:voll/incr,Datum:2015-12-30}
    index_file=mysql_increment_hot_backup.index

5 Wiederherstellungsskripte

5.1 Skripte

wiederherstellen.sh

    #!/bin/bash
    # Holen Sie sich den Programmpfadnamen program_dir=`dirname $0`/..
    # Alle Variablenwerte in der Konfigurationsdatei lesen und als globale Variablen festlegen# Konfigurationsdatei conf_file="$program_dir/conf/restore.conf"
    # MySQL-Datenordner data_dir=`sed '/^data_dir=/!d;s/.*=//' $conf_file`
    # Pfad der Sicherungsindexdatei backup_index_file=`sed '/^backup_index_file=/!d;s/.*=//' $conf_file`
    # percona-xtrabackup-Befehl xtrabackup-Pfad xtrabackup_bin=`sed '/^xtrabackup_bin=/!d;s/.*=//' $conf_file`
    # Sicherungsdateiverzeichnis backup_restore_dir=`sed '/^backup_restore_dir=/!d;s/.*=//' $conf_file`
    # Überprüfen Sie die Richtigkeit der Konfigurationsdateifunktion exam_conf_file() {
        # Überprüfen Sie, ob jede Variable in der Konfigurationsdatei konfiguriert ist. Wenn nicht, beenden Sie das Programm if [ ! -n "$data_dir" ]; dann echo 'fail: configure file data_dir not set'; exit 2; fi
        if [ ! -n "$backup_index_file" ]; dann echo 'Fehler: Konfigurationsdatei backup_index_file nicht festgelegt'; exit 2; fi
        if [ ! -n "$xtrabackup_bin" ]; dann echo 'fail: Konfigurationsdatei xtrabackup_bin nicht gesetzt'; exit 2; fi
        if [ ! -n "$backup_restore_dir" ]; dann echo 'Fehler: Konfigurationsdatei backup_restore_dir nicht festgelegt'; exit 2; fi
    }
    # Überprüfen Sie, ob die Sicherungsdatei im komprimierten Format vorliegt Funktion exam_backup_restore_file(){
        file_backup_restore_name_arr=`ls $backup_restore_dir`
        für Dateiname in $file_backup_restore_name_arr;do
            wenn [ "${file_name##*.}"x = "bz2"x ];dann
                tar -jxf $backup_restore_dir/$file_name -C $backup_restore_dir
                rm -rf $backup_restore_dir/$dateiname
            fi

        Erledigt
    }
    # Prüfen, ob MySQL gestoppt ist Funktion exam_mysql_is_stop(){
        wenn [ 0 -eq `ps -ef | grep mysql | grep -v grep | wc -l` ]; dann
            echo "MySQL-Dienst wurde gestoppt"
        anders
            /etc/init.d/mysqld stoppen
            echo "MySQL-Dienst stoppen"
            Schlaf 3
            echo "MySQL-Dienst wurde gestoppt"
        fi
    }
    # Prüfen, ob MySQL-Datendatei gelöscht wurde Funktion exam_data_is_del(){
        wenn [ -d $data_dir ];dann
            echo "MySQL-Datendateien löschen"
            rm -rf $data_dir
        anders
            echo "MySQL-Datendateien wurden gelöscht"
        fi
    }
    # Lesen Sie die Backup-Indexdatei Funktion read_backup_index() {
        cat $backup_index_file | awk '{print $2}' | awk -F: '{print $2}' | awk '{sub(/.$/,"")}1'
    }
    # Vollständige Dateien vorbereiten Funktion ready_full(){
        vollständiger_Dateiname=`echo ${1} | awk '{print $1}'`
        $xtrabackup_bin/innobackupex \
            --apply-log \
            --redo-only \
            $backup_restore_dir/$vollständiger_dateiname

        echo "Alle Dateien sind bereit"
    }
    # Dateien zum Hinzufügen vorbereiten Funktion ready_incr(){
        Backup-Index = $ (Backup-Index lesen)
        vollständiger_Dateiname=`echo $backup_index | awk '{print $1}'`
        für Dateiname in $backup_index;do
            wenn [ 1 -eq `echo "$file_name" | grep incr | wc -l` ]; dann 
                $xtrabackup_bin/innobackupex \
                    --apply-log \
                    --redo-only \
                    $backup_restore_dir/$vollständiger_Dateiname \
                    --incremental-dir=$Backup_Restore_Dir/$Dateiname
            fi
        Erledigt
        echo "Weitere Dateien sind bereit"
    }
    # Führen Sie die Sicherungs- und Wiederherstellungsfunktion aus exec_backup_restore(){
        echo "Sicherung und Wiederherstellung starten"
        vollständiger_Dateiname=`echo ${1} | awk '{print $1}' `
        $xtrabackup_bin/innobackupex \
            --zurückkopieren \
            --datadir=$data_dir \
            $backup_restore_dir/$vollständiger_dateiname
    }
    # Funktion main() ausführen {
        # Überprüfen Sie die Richtigkeit der Konfigurationsdatei exam_conf_file
        # Überprüfen Sie, ob die Sicherungsdatei im komprimierten Format vorliegt exam_backup_restore_file
        # Prüfen, ob MySQL gestoppt ist exam_mysql_is_stop
        # Prüfen, ob die MySQL-Datendatei gelöscht ist exam_data_is_del
        # Lesen Sie die Indexdatei backup_index=$(read_backup_index)
        # Vollständige Sicherungsdatei vorbereiten ready_full $backup_index
        # Bereiten Sie das Hinzufügen der Datei ready_incr vor
        # Backup ausführen und wiederherstellen exec_backup_restore $backup_index
        # Berechtigungen für die Datendatei erteilen echo „Berechtigungen für das Datenverzeichnis erneut erteilen“
        chown -R mysql:mysql $data_dir
        echo "MySQL wird gestartet"
        /etc/init.d/mysqld starten
        echo "Sicherung und Wiederherstellung erfolgreich"
    }
    hauptsächlich

5.2 Konfigurationsdateien

wiederherstellen.conf

    #MySQL-Datenordner data_dir=/opt/mysql/data
    #Pfad der Sicherungsindexdatei backup_index_file=/opt/xtrabackup/backup/var/mysql_increment_hot_backup.index
    #xtrabackup bin-Verzeichnis xtrabackup_bin=/opt/xtrabackup/bin
    # Sicherungsdateiverzeichnis backup_restore_dir=/data/backups/backups_zip

Oben finden Sie Einzelheiten zur Verwendung von Xtrabackup zum Sichern und Wiederherstellen von MySQL. Weitere Informationen zum Sichern und Wiederherstellen von MySQL mit Xtrabackup finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Tutorial zur Installation und Verwendung von Percona XtraBackup zum Sichern und Wiederherstellen von MySQL
  • Sichern und Wiederherstellen mit dem Tool Xtrabackup (ein unverzichtbares Tool für MySQL DBA)
  • MySQL Xtrabackup - gemeinsame Nutzung der Backup- und Wiederherstellungsimplementierung
  • Detaillierte Erklärung des MySQL-Sicherungsprozesses mit Xtrabackup
  • xtrabackup MySQL-Datenbank sichern und wiederherstellen
  • MySQL verwendet xtrabackup für Sicherungs- und Wiederherstellungsvorgänge
  • Verwenden von xtrabackup zum Implementieren einer MySQL-Sicherung
  • Tutorial zum Schreiben von Skripten zur Verwendung von Xtrabackup zum Sichern von MySQL-Daten
  • Tutorial zur Verwendung von innobackupex und xtrabackup zum Sichern und Wiederherstellen großer Datenmengen in MySQL

<<:  Tutorial zur Installation und Nutzungskonfiguration von Docker+nacos+seata1.3.0

>>:  Ohne zu viel Code können Sie Hyperlinks verwenden, um einfache und schöne benutzerdefinierte Kontrollkästchen zu implementieren

Artikel empfehlen

Optimierung der Web-Frontend-Leistung

Best Practices für die Web-Frontend-Optimierung: ...

Teilen Sie die Fallstricke von MySQLs current_timestamp und ihre Lösungen

Inhaltsverzeichnis MySQLs current_timestamp-Falle...

Tutorial zur Installation von Elasticsearch 7.6.2 in Docker

Docker installieren Sie müssen Docker installiere...

SQL implementiert LeetCode (180. Fortlaufende Zahlen)

[LeetCode] 180. Aufeinanderfolgende Zahlen Schrei...

Eine kurze Diskussion über den gesamten Prozess des ersten Renderings von Vue

Inhaltsverzeichnis 1. Vue-Initialisierung Vue-Ein...

So erreichen Sie eine nahtlose Token-Aktualisierung

Inhaltsverzeichnis 1. Nachfrage Methode 1 Methode...

Installations-Tutorial zur dekomprimierten Version von MySQL5.7.21 unter Win10

Installieren Sie die entpackte Version von Mysql ...

Die Vor- und Nachteile von Nginx und LVS und ihre geeignete Nutzungsumgebung

Lassen Sie uns zu Beginn darüber sprechen, was La...

Uniapp WeChat-Applet: Lösung bei Schlüsselfehler

Uniapp-Code <Vorlage> <Ansicht> <i...

Zusammenfassung der wichtigsten Attribute des Body-Tags

bgcolor="Textfarbe" background="Hin...