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!
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.
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.
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
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
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...
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:
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...
PHP: <?phpdefine('MYSQL_HOST', ' Serveradresse ');define('MYSQL_USER', ' Benutzername ');define('MYSQL_PASS', ' Passwort ');define('MYSQL_DATABASE', ' Datenbank ');@mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_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
@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
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.
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?
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($filename, ZIPARCHIVE::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.
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?
Versuche es mal mit (Link nur für registrierte Nutzer sichtbar.).... So wie Du die Datei im Browser aufrufen kannst
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...
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
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