Cronjob einrichten der täglich, alle 4 Stunden, zwei SQL-Updates durchführt

Thema wurde von Stromlinie21, 15. Dezember 2017 erstellt.

  1. Stromlinie21

    Stromlinie21 Erfahrener Benutzer

    Registriert seit:
    22. April 2015
    Beiträge:
    397
    Danke erhalten:
    39
    Danke vergeben:
    83
    Hallo,

    ich möchte einen Cronjob einrichten, der täglich, alle 4 Stunden, zwei (einfache) immergleiche SQL-Updates durchführt.
    (Email-Benachrichtungen, evtl. Ausgabedateien, etc. davon benötige ich nicht. Es sollen einfach immer nur die zwei immergleichen SQL-Updates durchgeführt werden)

    Die SQL-Update-Statements habe ich auch schon. So weit, so gut.

    Nun zu dem Teil, von dem ich (bisher) noch keinen blassen Schimmer habe:
    Wie richte einen solchen Cronjob ein?

    Mein Shop ist bei webgo.de gehostet.
    Desweiteren habe ich den MyOOSDumper im Einsatz (für manuelle SQL-Updates und manuelle Backups)

    Wie und wo richte so einen Cronjob am besten ein?
    Hat mir jemand vielleicht einen Cronjob als Beispiel, der einfach (täglich, alle 4 Stunden) zwei immergleiche
    SQL-Updates durchführt?
    (Ohne eMail-Benachrichtung, etc.)

    Damit ich nicht ganz bei 0 anfangen muss....Vielen Dank!
     
  2. Wilken (Gambio)

    Wilken (Gambio) Administrator
    Mitarbeiter

    Registriert seit:
    7. November 2012
    Beiträge:
    18.143
    Danke erhalten:
    6.945
    Danke vergeben:
    2.118
    Schreib eine PHP Datei, die die Updates ausführt. Darin musst du eine DB Verbindung aufbauen, deine Queries abschicken und dann (wichtig) die Verbindung wieder trennen. Die PHP Datei holst du dann per wget oder curl im Cronjob.
     
  3. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    34.101
    Danke erhalten:
    10.635
    Danke vergeben:
    1.517
    Wenn Dein Hoster Perl erlaubt, kannst Du auch einen Cronjob einrichten, der den MySQLDumper auslöst.
    Das mache ich bei mir z.B. Stündlich.
     
  4. Christian Mueller

    Christian Mueller Beta-Held

    Registriert seit:
    4. Juli 2011
    Beiträge:
    3.435
    Danke erhalten:
    755
    Danke vergeben:
    255
    Wenn Du einen Cronjob ausführen kannst, brauchst Du keinen MySQLDumper, sondern kannst die Datenbank lokal auf dem Server direkt per MySQL dumpen. Geht schneller und einfacher und geht nicht den Umweg über den Webserver und PHP
     
  5. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    34.101
    Danke erhalten:
    10.635
    Danke vergeben:
    1.517
    Hallo Christian.
    Ich arbeite lieber mit dem MSD, als in MySQL. Der ist irgendwie Übersichtlicher, auch wenn ich mal nur eine einzelne Tabelle wieder herstellen möchte.
    Mit MySQL werde ich irgendwie nicht richtig warm :oops:
     
  6. Stromlinie21

    Stromlinie21 Erfahrener Benutzer

    Registriert seit:
    22. April 2015
    Beiträge:
    397
    Danke erhalten:
    39
    Danke vergeben:
    83
    #6 Stromlinie21, 17. Dezember 2017
    Zuletzt bearbeitet: 17. Dezember 2017
    Hallo,

    da ich kein PHP kann habe ich das Thema vorhin nochmal gegoogelt...

    Dabei habe ich entdeckt, dadurch dass ich ja NUR REINES SQL ausführen möchte (ohne eMail-Benachrichtigung, etc.)
    ich dann dazu auch NUR PHPMYADMIN/SQL benötige! Also KEINEN CronJob mit PHP und so...

    Und zwar kennt PHPMYADMIN/SQL: (SQL-)EVENT(S), die man man alle paar Sekunden, alle paar Stunden oder alle paar Tage laufen lassen kann, also genau zu dem Zeitpunkt, dass man möchte, dass sie durchgeführt werden.

    In meinen Fall sieht ein solches SQL-Event-Statement wie folgt aus. Es soll alle 2 Stunden (120 Minuten) ausgeführt werden.
    Es kann ganz einfach (EINMALIG!) im SQL-Browser des MyOOSDumpers abgesetzt werden oder auch in seinem jeweiligen PHPMYADMIN-Panel, bei seinem jeweiligen Hoster:

    CREATE EVENT mein_products_Update_1
    ON SCHEDULE
    EVERY 120 MINUTE
    DO
    update `products` set .... ;

    CREATE EVENT mein_products_Update_2
    ON SCHEDULE
    EVERY 120 MINUTE
    DO
    update `products` set .... ;


    Hinweis:
    Die beiden Beispiel laufen ohne Start-/Endezeitpunkt bzw. Zeitbegrenzung, also theoretisch bis zum St. Nimmerleinstag, was ich aber in meinem Anwendungsfall möchte.
    Es gibt natürlich weitere Parameter, mit der ein Event z.B. am Tag/Datum "X" (automatisch) starten kann/ausgeführt wird und am Tag/Datum "Y" (automatisch) beendet werden kann.

    Anschließend kann sich seine eingerichteten SQL-Events mit folgendem SQL-Befehl anzeigen lassen:
    SHOW EVENTS; (Mehrzahl!)

    Möchte man ein Event löschen (um es z.B. neu anzulegen) gibt es den SQL-Befehl: DROP EVENT
    Hier an einem meiner beiden Beispiele würde der SQL-Befehl so aussehen:
    DROP EVENT mein_products_Update_2;


    Natürlich gibt es zu dem EVENT-Thema viele weitere Möglichkeit/Parameter, aber für den Anfang sollte das reichen... :)
     
  7. Christian Mueller

    Christian Mueller Beta-Held

    Registriert seit:
    4. Juli 2011
    Beiträge:
    3.435
    Danke erhalten:
    755
    Danke vergeben:
    255
    Ich nutze bei mir auch Events und auch Trigger, also Events, die nur ausgeführt werden wenn eine andere Aktion stattfindet, z.B. nur wenn in einer bestimmten Tabelle eine Änderung stattfindet. Das funktioniert hervorragend.

    Allerdings sind Events und Trigger nicht auf allen Servern verfügbar und dort wo sie verfügbar sind, nicht immer aktiviert. Im Zweifel beim Provider nachfragen damit der Event-Scheduler global eingeschaltet wird. Wenn man den Event-Scheduler manuell eingeschaltet hat, muss er nach jedem Neustart manuell neu gestartet werden.

    Man kann die auch sehr gut im MySQL-Admin verwalten:
    upload_2017-12-17_11-33-24.png
     
  8. Stromlinie21

    Stromlinie21 Erfahrener Benutzer

    Registriert seit:
    22. April 2015
    Beiträge:
    397
    Danke erhalten:
    39
    Danke vergeben:
    83
    Hallo Christian,

    vielen Dank, für den Hinweis zu der Aktivierung von Events und Triggern!

    Ich habe gerade mal nachgeschaut, ob meine Updates (mittlerweile) alle 2 Stunden durchgeführt wurden.
    Wie es aussieht, wurden die beiden Updates (bisher) nur zu dem Zeitpunkt durchgeführt, als die beiden SQL-Events eingerichtet wurden. Und seitdem nicht mehr...

    Dann werde ich da dann wohl mein Hoster anschreiben müssen, damit der den Event-Scheduler global eingeschaltet...
     
  9. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    9. Oktober 2014
    Beiträge:
    248
    Danke erhalten:
    31
    Danke vergeben:
    127
    PHP:
    <?php

    define
    ('MYSQL_HOST''      Serveradresse      ');
    define('MYSQL_USER''      Benutzername      ');
    define('MYSQL_PASS''      Passwort      ');
    define('MYSQL_DATABASE''      Datenbank      ');

    @
    mysql_connect(MYSQL_HOSTMYSQL_USERMYSQL_PASS) OR die("Keine Verbindung zur Datenbank. Fehlermeldung:".mysql_error());
    mysql_select_db(MYSQL_DATABASE) OR die("Konnte Datenbank nicht benutzen, Fehlermeldung: ".mysql_error());


    $update "      Dein Updatebefehl      ";
    $updaten mysql_query($update);
    ?>
    Durch solche Dateien führe ich diese Aufgaben aus. Diese rufe ich dann per Cronjob auf meinem Server aus
     
  10. Anonymous

    Anonymous Aktives Mitglied

    Registriert seit:
    16. Januar 2018
    Beiträge:
    40
    Danke erhalten:
    2
    Danke vergeben:
    7
    @Pascal (FGB.Berlin)
    Sollte man nach dem erstellen eines update nicht auch wieder disconnecten?
    Vielleicht ne blöde Frage, aber ich bin neu in dem Bereich :)
     
  11. Wilken (Gambio)

    Wilken (Gambio) Administrator
    Mitarbeiter

    Registriert seit:
    7. November 2012
    Beiträge:
    18.143
    Danke erhalten:
    6.945
    Danke vergeben:
    2.118
    Auf jeden Fall, ohne disconnect bleibt auf dem MySQL Server ein Verbindungszombie noch ne ganze Weile liegen. Gerade in kleineren Hostings sind die stark begrenzt und sorgen dann dafür, dass irgendein anderer Vorgang, ein Kunde oder ein Admin in einen Fehler läuft.
     
  12. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    9. Oktober 2014
    Beiträge:
    248
    Danke erhalten:
    31
    Danke vergeben:
    127
    Ah okai, das habe ich nicht bedacht. Wir haben da mehr als genug Kapazitäten.
     
  13. Anonymous

    Anonymous Aktives Mitglied

    Registriert seit:
    16. Januar 2018
    Beiträge:
    40
    Danke erhalten:
    2
    Danke vergeben:
    7
    Wie macht man das mit php, dass ein backup nicht überschrieben wird, sondern ein neues erstellt, mit neuen Namen.

    Bsp.

    backup.sql existiert, also soll die neue Datei backup1.sql heissen, die nächste backup2.sql, u.s.w?
     
  14. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    34.101
    Danke erhalten:
    10.635
    Danke vergeben:
    1.517
    Irgendwo im Forum fliegt ein Script dazu rum.....

    Ich habe das in 2 Varianten: Sicherung Stündlich - es wird nach 24 Stunden automatisch überschrieben
    Sicherung Täglich -. es wird nach 30 / 31 Tagen automatisch überschrieben

    PHP:
    <?php
    $dbhost     
    "localhost";
    $dbuser     "username";
    $dbpwd      "password";
    $dbname     "datenbank";
    $dbbackup   "/absoluter/pfad/zum/erstellen/vom/backup.sql";
    $filename   "/absoluter/pfad/zum/erstellen/vom/backup-$suffix.zip";

    // ab hier nichts mehr ändern
    $suffix time();
    $datum=date('_H:i');
    echo 
    "Start des Backups<br>";
    error_reporting(0);
    set_time_limit(0);
    $conn mysql_connect($dbhost$dbuser$dbpwd) or die(mysql_error());
    mysql_select_db($dbname);
    $f fopen($dbbackup"w");
    $tables mysql_list_tables($dbname);
    while (
    $cells mysql_fetch_array($tables))
    {
        
    $table $cells[0];
        
    fwrite($f,"DROP TABLE `".$table."`;\n");
        
    $res mysql_query("SHOW CREATE TABLE `".$table."`");
        if (
    $res)
        {
            
    $create mysql_fetch_array($res);
            
    $create[1] .= ";";
            
    $line str_replace("\n"""$create[1]);
            
    fwrite($f$line."\n");
            
    $data mysql_query("SELECT * FROM `".$table."`");
            
    $num mysql_num_fields($data);
            while (
    $row mysql_fetch_array($data))
            {
                
    $line "INSERT INTO `".$table."` VALUES(";
                for (
    $i=1;$i<=$num;$i++)
                {
                    
    $line .= "'".mysql_real_escape_string($row[$i-1])."', ";
                }
                
    $line substr($line,0,-2);
                
    fwrite($f$line.");\n");
            }
            echo 
    "Tabelle: ".$table." wurde gesichert.<br>";
        }
    }
    fclose($f);
    #Now zip that file
      
    $zip = new ZipArchive();
      if (
    $zip->open($filenameZIPARCHIVE::CREATE) !== TRUE) {
       exit(
    "cannot open <$filename>n");
      }
      
    $zip->addFile($dbbackup $dbname.$datum.".sql");
      
    $zip->close();
      
    #Now delete the .sql file without any warning
      
    @unlink($dbbackup);
      
    #Return the path to the zip backup file
      
    echo "Backup ".$filename." wurde beendet.";
     
      return 
    $filename;
    ?>
    Das wäre der Code für ein Stündliches Backup
    Wenn es täglich sein soll, muss diese Zeile
    PHP:
    $datum=date('_H:i');
    von Stunde auf Tag geännert werden:
    PHP:
    $datum=date('_d');
    Bisher funktioniert das gut.
     
  15. Anonymous

    Anonymous Aktives Mitglied

    Registriert seit:
    16. Januar 2018
    Beiträge:
    40
    Danke erhalten:
    2
    Danke vergeben:
    7
    #15 Anonymous, 24. Januar 2018
    Zuletzt bearbeitet: 28. Januar 2018
    Ich kämpfe gerade mit meinen Cron-jobs ...
    Die Zeiten stimmen, aber wenn ich als Befehl
    Code:
    mysqldump --opt -h host -u user -p passwort datenbank > /var/www/pfad/datenbank.sql
    eingebe, wird nur eine leere Datei erzeugt. Wo ist der Fehler?

    @barbara
    Wie rufst du dein Script auf?
     
  16. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    34.101
    Danke erhalten:
    10.635
    Danke vergeben:
    1.517
    Versuche es mal mit https://Domain....
    So wie Du die Datei im Browser aufrufen kannst
     
  17. Anonymous

    Anonymous Aktives Mitglied

    Registriert seit:
    16. Januar 2018
    Beiträge:
    40
    Danke erhalten:
    2
    Danke vergeben:
    7
    OK, das geht so :)

    Aber sollte das Ergebnis nicht eigentlich backup-01.zip bzw backup-02.zip ... heißen?
    Bei mir kommt nur backup-.zip bei raus, und wird damit natürlich immer wieder sofort überschrieben... :(
     
  18. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    34.101
    Danke erhalten:
    10.635
    Danke vergeben:
    1.517
    Schau mal in das ZIP
     
  19. Anonymous

    Anonymous Aktives Mitglied

    Registriert seit:
    16. Januar 2018
    Beiträge:
    40
    Danke erhalten:
    2
    Danke vergeben:
    7
    Alles klar...
    Man sollte sich Scripte doch schon irgendwie genauer anschauen, nicht nur mal eben überfliegen, und sich seinen Teil dazu denken :)
    Und mal wieder ein dickes Danke an dich :)
     
  20. Anonymous

    Anonymous Aktives Mitglied

    Registriert seit:
    16. Januar 2018
    Beiträge:
    40
    Danke erhalten:
    2
    Danke vergeben:
    7
    #20 Anonymous, 25. Januar 2018
    Zuletzt bearbeitet: 25. Januar 2018
    So, läuft bei mir jetzt auch, allerdings rufe ich das Script nicht über die Webseite auf, sondern mit

    Code:
    /usr/bin/php /absoluter/pfad/zum/backupscript.php
    Entscheidend dabei ist, dass php bei euch auch in dem Verzeichnis /usr/bin/ zu finden ist, das bekommt ihr heraus, in dem ihr in der Shell
    Code:
    which php
    eingebt, und das Ergebnis einfach übernehmt.
    Das ist erforderlich, damit der Server weiß, was er mit der .php Datei anstellen soll.

    Mein Cron sieht nun also so aus
    Code:
    0 * * * * /usr/bin/php /absoluter/pfad/zum/backupscript-stunde.php
    0 0 * * * /usr/bin/php /absoluter/pfad/zum/backupscript-tag.php 
    In der ersten Zeile wird ein stündliches Backup immer um zu jeder vollen Stunde erstellt,
    in der zweiten Zeile das selbe täglich immer um 0:00 Uhr.

    Natürlich können die Werte frei verändert werden, so würde
    Code:
    59 23 * * * /usr/bin/php /absoluter/pfad/zum/backupscript-tag.php
    das script täglich um 23:59 Uhr starten

    Vielleicht habe ich damit ja einigen geholfen, die sich mit dem aufrufen von .php Scripten über die Cron noch nicht so beschäftigt haben :)