mysqldump per Cronjob bringt Fehler

  • Hallo,

    ich versuche gerade nach der Anleitung https://www.synology-wiki.de/i…k_%C3%BCber_einen_cronjob einen Cronjob einzurichten. Bei mir ist QMariadB installiert: Versuche ich manuell einen dump zu erzeugen kommt folgende Fehlermeldung. Damit kann ich gar nichts anfangen:

    Code
    [/] # /mnt/ext/opt/mariadb/bin/mysqldump -u root -p --all-databases >/share/Public/mysql.sql 
    Enter password: 
    mysqldump: Got error: 2002: "Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)" when trying to connect 

    Passwort ist richtig damit komme ich in die Mysql Datenbank. Kann es sein, dass es was mit der 2 Faktor Authentifizierung zu tun hat?

    2. Frage: Kann ich qmariadb.err ohne Gefahr löschen. Diese ist mittlerweile 1,2 Gig gross.Kann man mit einem Befehl die Größe der err. Datei begrenzen?


    Danke Bert

  • Hallo,


    Die Fehlermeldung besagt, dass der Standardsocket nicht benutzt wird. Das ist aber bei Qmariadb auch korrekt.

    Du musst erst mal in der Qmariadb-Config den Socket herausbekommen. Standardmäßig ist der Socket /tmp/QMariaDB2.sock laut dieser Dokumentation:


    [ QMariaDB ] [ 10.5.11 ] MariaDB Server (wth PhPMyadmin) - QNAP NAS Community Forum


    Dann kannst Du diesen als Parameter bei mysqldump mitgeben:


    Code
    mysqldump --protocol=socket -S /tmp/QMariadDB2.sock
  • Danke, das war es. Aber da kommt schon wieder das nächste Problem.

    Wenn ich in das angegebene Verzeichnis.

    /mnt/ext/opt/mariadb/bin/mysqldump --protocol=socket -S /tmp/QMariadDB2.sock -u root -p --all-databases --lock-tables =0 >/share/Public/mysql.sql

    sichere hat die Datei danach dieGröße 0.

    Code
    /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; 
    /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; 
    /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; 
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; 
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 
    /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; 
    -- Dump completed on 2023-01-08 22:54:57 


    Was mich auch stutzig macht, ich kann auch in kein anderes Verzeichnis Sichern. Wenn ich zum Beispiel in das Verzeichnis

    </share/Web/mysql.sql

    sichern möchte kommt:

    Code
    -sh: /share/Web/mysql.sql: No such file or directory 

    Es existiert und wird dann weitergeleitet auf
    /share/CE_CACHEDEV1_DATA/Web
    . Können das spezielle Rechte sein, die dump benötigt?

    Danke Bert

  • Das ist es nicht, habe ich probiert. Ich habe eine sql ohne Tabellen nur mit Rechten. Auch wenn ich eine sql einzeln sichere wird nichts gespeichert

  • Hat Dein SSH-Nutzer volle Adminrechte? Bzw. hat er Schreibrechte auf der Freigabe, auf die Du sicherst?


    Ist Dein root-Nutzer auf allen Datenbanken mit vollen Rechten berechtigt?


    Ich sichere jede Datenbank einzeln per Script mit folgendem Aufruf:


    mysqldump --protocol=socket -S /tmp/QMariadDB2.sock --single-transaction -h localhost -u root -pPASSWORT DATENBANK > /share/homes/dbbackup/DATENBANK.sql


    Ausgeführt wird das Script im Kontext des Ur-Adminnutzers des NAS per Cronjob. Alternativ kannst Du es mit sudo -u ADMINNUTZER aufrufen.

    PASSWORT und DATENBANK sind natürlich durch Deine individuellen Werte zu ersetzen.

  • Super das funktioniert jetzt auch über alle Datenbanken. Noch eine Frage dazu.

    Verstehe deine Bemerkung "Ausgeführt wird das Script im Kontext des Ur-Adminnutzers des NAS per Cronjob" nicht richtig

    Hast du dazu ein Script geschrieben und wenn ja, wo hast du das gespeichert? Ansonsten die Befehlszeile im Cronjob eingetragen? Sorry wegen den Fragen , bin nicht so im Linux bewandert..


    Danke Bert

  • Kein Problem. Ich habe es folgendermaßen gemacht:


    1. Ein Script in einem beliebigen share auf dem NAS angelegt, welches für JEDE Datenbank den in meinem letzten Post aufgeführten Befehl enthält. Anlegen und bearbeiten kannst Du das Script mit folgenden Befehlen:


    touch /share/Public/dump_db.sh

    vi /share/Public/dump_db.sh


    Nun die mysqldump- Aufrufe für jede DB eintragen - jeweils auf einer separaten Zeile.


    Dann mit ESC :wq speichern und vi beenden.


    Nun das Script ausführbar machen:


    chmod +x /share/Public/dump_db.sh


    Jetzt noch den Cronjob anlegen:


    crontab -e


    Nun den Cronjob in einer neuen Zeile eintragen:


    0 2 * * * /share/Public/dump_db.sh


    Dies würde bedeuten, dass der Cronjob jeden Tag um 2 Uhr in der Nacht das Script startet.


    Mit ESC :wq die Crontab speichern.


    Damit das ganze rebootsicher wird, dass gleiche noch mal mit der zentralen crontab machen:


    vi /mnt/HDA_ROOT/.config/crontab

  • Danke, das probiere ich. Gebe eine Rückmeldung.


    Also, dir noch mal danke.


    Habe es etwas anders gemacht mit deiner Anleitung:

    Diese Script Bachup sql ( anstatt deine mysqldump ) für mich 2 * hübsch gemacht. 1 * nur die Nextcloud Datenbank und einmal alle Datenbanken.

    2 Cronjobs erstellt: 1. tägliche Sicherung Nextcloud, und 1 * im Monat den Rest. Habe die beiden Scripte manuell und dann auch später mit Cron gestartet . Erstellung klappt erst einmal.

    vi /mnt/HDA_ROOT/.config/crontab



    Ist das jetzt richtig bootfest? Das war ja immer das Problem von QNAP, das es überschrieben wurde.


    Letzte Frage: Rückspielen der Datenbank ist Problemlos mit den richtigen Rechten? Das war bisher immer mein Problem, wenn ich diese in die phpMyAdmin als Datei importiert hatte.


    Ansonsten Top Service. Danke Dafür.


    Bert

    2 Mal editiert, zuletzt von Milchmann () aus folgendem Grund: Ein Beitrag von Milchmann mit diesem Beitrag zusammengefügt.

  • Hallo,


    ja, der Eintrag unter /mnt/HDA_ROOT/.config/crontab macht es bootfest.


    Rückspielen der Datenbank würde ich immer über die Konsole machen:


    mysql -u root -pPASSWORT <SICHERUNGSDATEI.SQL


    Erklärung:

    Passwort ist das root-Passwort Deiner Mysql-Instanz. Sicherungsdatei.sql ist die komplette Sicherungsdatei (in der alle Datenbanken enthalten sind).


    Wenn Du nur die Nextcloud-DB zurückspielen möchtest, sieht der Befehl wie folgt aus

    mysql -u root -pPASSWORT DROP DATABASE nextcloud

    mysql -u root -pPASSWORT CREATE DATABASE nextcloud

    mysql -u root -pPASSWORT nextcloud <SICHERUNGSDATEI_NEXTCLOUD.SQL

  • Ich muss leider noch mal zurück kommen.


    Nach einem Neustart waren meine Einstellungen in der Crontab weg.


    Ich habe das genau nach den Anleitungen oben gemacht und war auch in /mnt/HDA_ROOT/.config/crontab gespeichert.


    Mache ich was falsch?


    Danke Bert

  • Wie sieht denn der Eintrag in cron aus?

    Bisher sind alle meinn Einträge in der crontab bootresistent.

    Ausnahme ist der Eintrag @reboot, der wird immer entfernt.

    Hier muss man über einen Workaround (autorun.sh) gehen.


    Gruss

  • Der sollte drin bleiben.

    Wie legst Du den an, per sudo oder als original admin?

    Ich trage den immer mit sudo crontab -e ein und danach mit sudo vi /etc/config/crontab in die Datei.

    Wenn ich den original Admin account verwende, dann natürlich ohne sudo. :P


    Gruss

  • Ich gehe über ssh mit dem Haupt Admin " Admin" rein. Bisher ohne Sudo.


    Ich starte das NAS gleich noch mal und überprüfe , ob es drin geblieben ist. Gebe eine Rückmeldung


    Ist diesmal drin geblieben. Keine Ahnung was vorher war.


    Danke


    Bert

    Einmal editiert, zuletzt von Milchmann () aus folgendem Grund: Ein Beitrag von Milchmann mit diesem Beitrag zusammengefügt.

  • Ich habe en Problem mit dem folgenden Script "BackupMySQL.sh"

    Code
    /share/CE_CACHEDEV1_DATA/.qpkg/MariaDB10/bin/mysqldump --defaults-file=/share/homes/MyUser/BackupMySQL/my.cnf -u root database1 > /share/homes/MyUser/BackupMySQL/db1_$( date '+%Y%m%d_%H%M%S' ).sql
    /share/CE_CACHEDEV1_DATA/.qpkg/MariaDB10/bin/mysqldump --defaults-file=/share/homes/MyUser/BackupMySQL/my.cnf -u root database2 > /share/homes/MyUser/BackupMySQL/db2_$( date '+%Y%m%d_%H%M%S' ).sql
    /share/CE_CACHEDEV1_DATA/.qpkg/MariaDB10/bin/mysqldump --defaults-file=/share/homes/MyUser/BackupMySQL/my.cnf -u root database3  > /share/homes/MyUser/BackupMySQL/db3_$( date '+%Y%m%d_%H%M%S' ).sql

    Den Script habe ich in der crontab Datei eingefügt. Die Ausführung des Scripts funktionert soweit, jedoch entstehen leider nicht die gewünschten Dateinamen mit dem Datum und Zeit im Dateinamen.

    Es werden zufällig generierte Dateinamen erzeugt z.B. wie folgender "A14MAZ~4". Der Inhalt ist jedoch korrekt.


    Wenn ich jede einzelne Zeile in der Console ausführe funktioniert es wie gewünscht. Muss ich in einer Scriptdatei einen anderen Befehl anwenden?

  • Du müsstest die Befehle wie folgt ändern:


    /share/CACHEDEV1_DATA/.qpkg/MariaDB10/bin/mysqldump --single-transaction -h localhost -u USER -pPASSWORT DATENBANK > /share/homes/USER/DATENBANK_DB_`date +"%Y%m%d"`.sql


    Dann wird das Datum in den Dateiname übernommen.

  • Wie schon erwähnt wenn ich den Befehl einer einzelnen Zeile in der Console ausführe funktioniert es, rufe ich aber den Script auf geht es nicht!


    @lhsei Auch mit deiner Version das gleiche verhalten


    Übrigens: der Parameter -pPASSWORT geht bei mir nicht. Beim Ausführen wird doch das Passwort nochmals verlangt.

    Ich habe eine Config "my.cnf" angelegt mit folgenden Inhalt


    Code
    [mysqldump]
    password=PASSWORT