====== SQL-SSH-Backup ======
Mit SQL-SSH-Backup lassen sich MySQL-, PostgreSQL- oder MongoDB-Pull-Sicherungen erstellen. Der Backupserver loggt sich dazu per SSH ein und führt die Befehle zur Sicherung auf dem zu sichernden Server aus. Der Backupserver benötigt dabei keinerlei Datenbank-Module oder -Programme. Jede Datenbank kann einzeln gesichert, was eine Rücksicherung erleichtert.
===== Copyright / Lizenz =====
SQL-SSH-Backup entstand hauptsächlich durch das Webserver-Team im Rahmen des Webhostings der FeM e.V. und steht unter der [[http://www.gnu.de/documents/gpl-2.0.de.html|GPL-2]].
===== Features (der aktuellen Version) =====
* Dump für MySQL, PostgreSQL oder MongoDB via SSH
* benötigt kein MySQL/PostgreSQL auf dem Backup-Server
* sichere Übertragung/Nutzung der Datenbank-Zugangsdaten möglich
* Einzel- oder Gesamtsicherung aller Datenbanken
* Sicherung einzelner Datenbanken
* Kompression der Dumps mit bzip2/xz (alle DBs) oder PosgreSQL-Dump-Format möglich
* mehrere Backups täglich möglich (Verzeichnisstruktur enthält dann Uhrzeit)
* automatische Bereinigung von alten Backups
===== Sourcecode / Tarballs =====
* [[https://github.com/fem/sql-ssh-backup]]
* Gentoo-FeM-Overlay (**//app-backup/sql-ssh-backup//**)
===== Installation =====
==== Backupserver ====
Auf dem Backupserver wird neben SQL-SSH-Backup nur SSH (meist vorhanden) und ggf. bzip2/xz (für komprimierte MySQL-Backups) benötigt.
Versionen:
* 1.3 - erstes kombiniertes MySQL/PgSQL-Release
* 1.4 - Zeitangabe in Sicherungsordner integrieren (erlaubt Mehrfach-Sicherungen an einem Tag)
* 1.5 - Konfigurationsdatei für Benutzer/Passwort bei MySQL (verhindert auslesen des Passworts via ps), SSH-Port-Angabe
* 1.6 - Konfigurationsdatei für Benutzer/Passwort bei PgSQL (verhindert auslesen des Passworts via ps)
* 1.7 - Gesamtdump aller Datenbanken statt Einzeldump ermöglichen
* 1.8 - Sicherung einer einzelnen Datenbank möglich
* 1.9 - Wiederholung von Dumps bei Fehlern ermöglichen (Retry), bereinigte Exit-Codes, kleinere Fehlerkorrekturen
* 2.0 - Backup von MongoDB (ohne Datenbankauthentifizierung)
* 2.1 - Max-allowed-packet für MySQL
==== zu sichernder Server ====
Auf dem zu sichernden Server müssen nur SSH (meist vorhanden) und MySQL / PostgreSQL / MongoDB (sowieso vorhanden) zur Verfügung stehen.
===== Konfiguration =====
==== zu sichernder Server ====
=== Benutzer und SSH-Key anlegen ===
Der Schlüssel muss __ohne__ Passwort (Passphrase) erstellt werden, sonst macht das automatische Backup wenig Spaß.
* **//useradd -m backup//**
* **//ssh-keygen -f /home/backup/.ssh/id_rsa//**
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/backup/.ssh/id_rsa.
Your public key has been saved in /home/backup/.ssh/id_rsa.pub.
The key fingerprint is:
3e:65:ec:fd:ba:92:15:94:18:da:74:26:d4:fc:b9:f0 root@server1
The key's randomart image is:
+--[ RSA 2048]----+
| .==o. |
| +.+= |
| . .. . . |
| . o o |
| S + + . |
| . + .. E |
| o .o. |
| .o . |
| .oo. |
+-----------------+
* **//echo "no-port-forwarding,no-X11-forwarding $(cat /home/backup/.ssh/id_rsa.pub)" >> /home/backup/.ssh/authorized_keys//**
* **//chown backup:backup /home/backup/.ssh/*//**
Der Private Schlüssel für den Backup-Nutzer (/home/backup/.ssh/id_rsa) muss nun sicher (z.B. per SCP) auf den Backup-Server übertragen werden. Anschließend kann er auf dem zu sichernden Server gelöscht werden.
* **//rm /home/backup/.ssh/id_rsa//**
=== Datenbank-Benutzer anlegen ===
== MySQL ==
Der Backup-Benutzer benötigt lediglich folgende Rechte:
* SELECT
* SHOW DATABASES
* LOCK TABLES
* SHOW VIEW
CREATE USER 'backup'@'localhost' IDENTIFIED BY '';
GRANT USAGE ON * . * TO 'backup'@'localhost' IDENTIFIED BY '' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
REVOKE ALL PRIVILEGES ON * . * FROM 'backup'@'localhost';
REVOKE GRANT OPTION ON * . * FROM 'backup'@'localhost';
GRANT SELECT, SHOW DATABASES, LOCK TABLES, SHOW VIEW, PROCESS ON * . * TO 'backup'@'localhost' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
Beim Einsatz von MySQL 5.7 / MariaDB 10.6 (oder neuer) und der Sicherung aller Datenbanken inkl. Sys-Schema werden folgende Rechte zusätzlich benötigt:
GRANT EXECUTE ON FUNCTION `sys`.`extract_table_from_file_name` TO 'backup'@'localhost';
GRANT EXECUTE ON FUNCTION `sys`.`format_path` TO 'backup'@'localhost';
GRANT EXECUTE ON FUNCTION `sys`.`format_statement` TO 'backup'@'localhost';
GRANT EXECUTE ON FUNCTION `sys`.`extract_schema_from_file_name` TO 'backup'@'localhost';
GRANT EXECUTE ON FUNCTION `sys`.`ps_thread_account` TO 'backup'@'localhost';
GRANT EXECUTE ON FUNCTION `sys`.`format_time` TO 'backup'@'localhost';
GRANT EXECUTE ON FUNCTION `sys`.`format_bytes` TO 'backup'@'localhost';
== PostgreSQL ==
Der Backup-Benutzer benötigt folgende Rechte __nicht__:
* Datenbanken anlegen
* Rollen anlegen
Er benötigt die Rolle:
* Superuser
Folgendes als root auf dem zu sichernden Server ausführen und erst das Passwort (und Wiederholung) für den neuen Nutzer und dann ggf. das Passwort für den postgres-Benutzer eingeben:
* **//su - postgres//**
* **//createuser -D -R -s backup -P //**
==== Backupserver ====
Annahmen:
* Server: server1.example.org (Port 1022)
* Backup-Verzeichnis: /mnt/backup/server1.example.org/backupsql/
* SSH-Key: /mnt/backup/server1.example.org/identity
=== SSH-Hostkey speichern ===
Zu allererst muss man sich einmal per SSH mit dem zu sichernden Server als der Benutzer auf dem Backupserver verbinden unter dem dann das Backup läuft. Der SSH-Key muss dem Nutzer gehören und "rw-------" (600) als Benutzerrechte haben.
* //**chmod 600 /mnt/backup/server1.example.org/identity**//
* //**ssh backup@server1.example.org -i /mnt/backup/server1.example.org/identity**//
* Are you sure you want to continue connecting (yes/no)? //**yes**//
The authenticity of host 'server1.example.org (10.200.2.211)' can't be established.
RSA key fingerprint is c9:08:84:ea:1c:2c:84:5a:0f:cd:6e:1f:a1:bf:fe:4a.
Are you sure you want to continue connecting (yes/no)?
Nun sollte man als Nutzer Backup auf dem genannten Server eingeloggt sein.
=== Backup ===
Auf dem Backupserver kann nun das Backup anstoßen werden. Anschließend kann man dies auch per Cronjob erledigen lassen. Der Parameter "-e" gibt an, wieviele Tage Backups vorgehalten werden - im Beispiel sind das die letzten 120 Tage (Standard: 90).
== MySQL ==
* //**sql-ssh-backup -T mysql -l backup -s server1.example.org -P 1022 -d /mnt/backup/server1.example.org/backupsql -i /mnt/backup/server1.example.org/identity -e 120 -u backup -p PASSWORT**//
== PostgreSQL ==
* //**sql-ssh-backup -T pgsql -l backup -s server1.example.org -P 1022 -d /mnt/backup/server1.example.org/backupsql -i /mnt/backup/server1.example.org/identity -e 120 -u backup -p PASSWORT**//
== MongoDB ==
* //**sql-ssh-backup -T mongodb -l backup -s server1.example.org -P 1022 -d /mnt/backup/server1.example.org/backupsql -i /mnt/backup/server1.example.org/identity -e 120 **//