php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 24.10.2007, 01:34  
Erfahrener Benutzer
 
Registriert seit: 07.11.2003
Beiträge: 526
Promaetheus
Standard datenbank backup wieder einspielen

ich habe heute die wunderbaren seiten der cronjobs kennengelernt und wollte diese nun nutzen um eine demoseite jeden tag um mitternacht wieder auf originalzustand zu bringen. das script zur wiederherstellung der ordner ist bereits fertig (danke nochmal für die hilfestellung zergling!)

jetzt wollte ich auch noch die datenbank wiedereinspielen. ich habe von der standardkonfiguration einen sql-dump erstellt.

ist es jetzt besser ich lösche einfach immer mittels php skript (via cronjob) die ganze datenbank, erstelle sie neu und spiele dann den dump mittels mysql_query ein? oder löst man sowas auf andere art und weise wie zum beispiel mit zerglings funktion: http://www.phpfriend.de/forum/ftopic62425.html

EDIT:
ich habe jetzt gerade das script von zergling ausprobiert. ich erhalte eine fehlermeldung bezüglich der sql abfragen:
Zitat:
error while executing mysql query #1: Resource id #93
error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Resource id #93' at line 1
mir ist eine kleinigkeit aber recht unklar. woher kommt das $sql denn bei der abfrage in zeile 32? es wird doch nur ein array mit den queries durch die funktion übergeben. jedoch keine strings oder?

hier nochmal das skript von zergling:
PHP-Code:
<?php
function getQueriesFromFile($file)
{
    
// import file line by line
    // and filter (remove) those lines, beginning with an sql comment token
    
$file array_filter(file($file),
                         
create_function('$line',
                                         
'return strpos(ltrim($line), "--") !== 0;'));
    
// this is a list of SQL commands, which are allowed to follow a semicolon
    
$keywords = array('ALTER''CREATE''DELETE''DROP''INSERT''REPLACE''SELECT''SET',
                      
'TRUNCATE''UPDATE''USE');
    
// create the regular expression
    
$regexp sprintf('/\s*;\s*(?=(%s)\b)/s'implode('|'$keywords));
    
// split there
    
$splitter preg_split($regexpimplode("\r\n"$file));
    
// remove trailing semicolon or whitespaces
    
$splitter array_map(create_function('$line',
                                          
'return preg_replace("/[\s;]*$/", "", $line);'),
                          
$splitter);
    
// remove empty lines
    
return array_filter($splittercreate_function('$line''return !empty($line);'));
}

include(
'includes/configure.php');

$csvfile 'cronjob.sql';
if (!
is_readable($csvfile)) {
  exit;
}
$queries getQueriesFromFile($csvfile);
for (
$i 0$ix count($queries); $i $ix; ++$i) {
  if (!
mysql_query($sql)) {
    die(
sprintf("error while executing mysql query #%u: %s
\nerror: %s"
$i 1$sqlmysql_error()));
  }
}
echo 
"$ix queries imported";
?>
der sql dump von mir ist in ordnung. via phpmyadmin lässt er sich problemlos einspielen?!
__________________
mfg Alexander Haim
Promaetheus ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 24.10.2007, 08:40  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Alex,

für das Erstellen und wieder Einspielen von MySQL-Dumps stehen dir auf jedem LINUX-Server, auf dem die MySQL-Tools installiert sind, die Programme mysqldump und mysql zur Verfügung. Du kannst nun mit

Code:
mysqldump --host="localhost" --user="yourusername" --password="***" database | gzip -c9 > /path/to/your/backup/dir/backup.sql.gz
deine DB sichern und mit

Code:
gzip -d /path/to/your/backup/dir/backup.sql.gz
mysql --host="localhost" --user="yourusername" --password="***" database < /path/to/your/backup/dir/backup.sql
wieder einspielen. Das ganze kannst du natürlich in ein PHP-Script wrappen und die Commands mit exec() ausführen, macht aber keinen Sinn, da das mit einem Shell-Script besser funktioniert. Solltest du Beispiele benötigen, einfach schreien.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 24.10.2007, 09:36  
Erfahrener Benutzer
 
Registriert seit: 07.11.2003
Beiträge: 526
Promaetheus
Standard

hi christian!

danke für die info. ich möchte jedoch meiner cronjob.php sagen dass sie das jeden tag um 0:00 macht. deshalb wäre die lösung via php für mich von vorteil gewesen. das skript von zergling wäre dafür natürlich ideal. jedoch funktioniert es in meinem fall nicht. wobei mich wie gesagt wundert woher das "$sql" kommt.

die programme von dir müsste ich ja immer über die konsole aufrufen oder mittels php skript und exec() ausführen, wobei nicht auf allen servern exec() "freigegeben" ist.
__________________
mfg Alexander Haim
Promaetheus ist offline  
Alt 24.10.2007, 11:56  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Zitat:
deshalb wäre die lösung via php für mich von vorteil gewesen.
Nein, in die Crontab kannst du auch Shellscripte eintragen. Da gibt es kein Problem mit.


Zitat:
die programme von dir müsste ich ja immer über die konsole aufrufen oder mittels php skript und exec() ausführen, wobei nicht auf allen servern exec() "freigegeben" ist.
Und wo ist das Problem?

Code:
*  * * * * /usr/bin/php /path/to/my/scripts/cronjob.php
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 24.10.2007, 12:29  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard Re: datenbank backup wieder einspielen

Zitat:
Zitat von Promaetheus
mir ist eine kleinigkeit aber recht unklar. woher kommt das $sql denn bei der abfrage in zeile 32? es wird doch nur ein array mit den queries durch die funktion übergeben. jedoch keine strings oder?
Das sollte natürlich aus $queries[$i] stammen, ich habe es jetzt korrigiert.
Und SQL-Statements sind sehr wohl Strings
Zergling-new ist offline  
Alt 27.10.2007, 12:45  
Erfahrener Benutzer
 
Registriert seit: 07.11.2003
Beiträge: 526
Promaetheus
Standard

@christian: ich dachte exec würde im code aufgerufen. denn die crontab administration habe ich. da hast du natürlich recht.

@zergling: habe mich schon gewundert wo das $sql herkommt. natürlich sind es strings. ich habe nur gedacht ich sehe nirgends die zuweisung $sql = ... und als dein code nicht lief, liess ich zum debuggen das array ausgeben und habe gesehen dass es anstatt strings irgendwelche ressourcen sind.

eine kleine frage hätte ich noch zu dem thema bitte die mir sehr am herzen liegt und etwas verwunderung meinerseits auslöst:

nun läuft eigentlich alles gut, der cronjob spielt jeden tag um 0:00 die originalen bilder in den ordner images rein nachdem er die durch den user manipulierten gelöscht hat. auch die datenbank wird frisch eingespielt.

das einzige problem ist, dass die bilder die der user rauflädt dem user "wwwrun" zugesprochen werden.

jetzt bekomme ich immer wenn der cronjob abläuft eine mail mit der meldung (das gilt aber nur für die dateien die eben der user raufgespielt hat und die rechte "wwwrun" haben)
Zitat:
Warning: chmod(): Operation not permitted in /srv/www/vhosts/promadesign.com/subdomains/dev/httpdocs/cronjob.php on line 23
wobei ich ergänzend sagen muss dass die dateien aber trotzdem korrekt gelöscht werden! das sieht für mich nach safe_mode aus oder? in der phpinfo habe ich aber gesehen dass er LOCAL auf OFF ist, MASTER auf ON. gilt für den cronjob die master value?

wenn ja könnte ich das ganze ja nur lösen indem ich den bildupload für den user mittels ftp vollziehen lasse anstatt mit den "normalen" funktionen oder?

ich habe dann mal testhalber den cronjob mittels url aufgerufen und logischerweise hat es mir dann alles zusammengehauen, da ja nun alle dateien und ordner die "restauriert" werden dem user "wwwrun" zugeschrieben werden. kleiner auszug hieraus mit bestätigung dass es sich um safe_mode handelt:
Zitat:
Warning: chmod(): Operation not permitted in /srv/www/vhosts/domain.com/subdomains/dev/httpdocs/cronjob.php on line 23

Warning: chmod(): SAFE MODE Restriction in effect. The script whose uid is 10066 is not allowed to access /srv/www/vhosts/domain.com/subdomains/dev/httpdocs/images_X/1192109105.jpg owned by uid 30 in /srv/www/vhosts/domain.com/subdomains/dev/httpdocs/cronjob.php on line 23
der ordner images_X ist der temporäre ordner den das script vorher anlegt. das system funktioniert so:

1. images_orig kopieren nach images_X
2. images (wo daten durch user manipuliert wurden) löschen
3. images_X in images umbenennen <- urzustand wieder hergestellt

bei der zeile 23 handelt es sich um das chmoden der funktion welche die den ordner samt dateien löscht:
PHP-Code:
<?php
function delete($file) {
  
chmod($file,0777);               // DAS IST DIE BESAGTE ZEILE 23
  
if (is_dir($file)) {
    
$handle opendir($file);
    while(
$filename readdir($handle)) {
      if (
$filename != "." && $filename != "..") {
        
delete($file."/".$filename);
      }
    }
    
closedir($handle);
    
rmdir($file);
  } else {
    
unlink($file);
  }
}
?>
hat das skript welches die cronjob.php aufruft nun ftp rechte (namen des ftp-benutzers) oder die von "wwwrun", also vom webscript?

sonst könnte ich das ganze ja auch lösen indem ich für das cronjob script die ftp-funktionen von php verwende oder? denn als ftp-benutzer kann ich auch vom "wwwrun"-user erstellte dateien löschen oder sehe ich das falsch?
__________________
mfg Alexander Haim
Promaetheus ist offline  
Alt 27.10.2007, 13:02  
Erfahrener Benutzer
 
Registriert seit: 14.10.2007
Beiträge: 306
PHP-Kenntnisse:
Fortgeschritten
Papst befindet sich auf einem aufstrebenden Ast
Standard

Hi,

du kannst bei dem auführen eines Scriptes über die PHP binary via commandozeile eine andere php.ini übergeben.. ich weiß zwar nicht auswendig wie, aber das sollte die doku drin haben
Papst ist offline  
Alt 04.11.2007, 17:00  
Benutzer
 
Registriert seit: 04.11.2007
Beiträge: 59
alfonsodiecko
Standard

hi ich möchte auch so was wie Promaetheus machen aber das funzt net so ganz ^^
bei mir sieht mein script so aus

PHP-Code:
<?php
exec
("gunzip cms2.sql.gz");
exec("mysql --host="localhost" --user="test" --password="test" cmsdemoneu_ < cms2.sql");
echo 
"Das DUMP wurde eingespielt!";
?>
das geht aber nicht ^^
was mache ich falsch ???
alfonsodiecko ist offline  
Alt 04.11.2007, 18:48  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo alfonsodiecko,

was genau funktioniert den nicht? Hast du eine Fehlermeldung erhalten? Sinnvollerweise solltest du deinen Code wie folgt ergänzen:

PHP-Code:
<?php
exec
("gunzip cms2.sql.gz &> /unzip.log");
exec("mysql --host="localhost" --user="test" --password="test" cmsdemoneu_ < cms2.sql &> /restore.log");
echo 
"Das DUMP wurde eingespielt!";
?>
Die beiden Prozesse legen dir dann ein Logfile an, in dem du evtl. Gründe für "das geht aber nicht ^^" findest.


//EDIT: Ich hatte ganz vergessen, dich im phpfriend.de-Forum zu begrüßen! Hiermit noch ein Herzliches Willkommen und viel Spass bei uns!
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 04.11.2007, 20:56  
Benutzer
 
Registriert seit: 04.11.2007
Beiträge: 59
alfonsodiecko
Standard

also wenn ich den script über mein browser ausführe passiert nichts
und die log wird auch nicht angelegt
muss ich da noch irgendwas beachten ?
ach so nur mal so neben bei gibt es eigentlich ein script der zeit gesteuert eine mysql Tabelle rücksetzen kann ???
alfonsodiecko ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Mysql Backup im richtigem Format rbs_phoenix Datenbanken 10 13.05.2008 22:22
Backup einer MySql Datenbank dh1sbg Beitragsarchiv 1 13.04.2008 20:45
[Erledigt] confixx hat datenbank zerlegt Datenbanken 1 17.01.2006 08:37
Datenbank Backup mit phpMyAdmin Plague Datenbanken 1 20.11.2005 03:16
[Erledigt] Daten in MySQL Datenbank einspielen Datenbanken 1 26.10.2005 12:04
Probleme beim Einspielen eines Dumps - GELÖST Datenbanken 2 09.08.2005 13:35
mysql datenbank anlegen...aber WIE??? Datenbanken 0 05.08.2005 19:32
mysql datenbank anlegen...aber WIE??? Datenbanken 0 05.08.2005 19:31
[Erledigt] mysql datenbank anlegen...aber WIE??? Datenbanken 0 05.08.2005 19:31
Datenbank Backup PHP Tipps 2005-2 2 26.06.2005 21:49
mysql datei in datenbank einspielen Datenbanken 6 20.06.2005 16:07
Große Daten in Datenbank einspielen ohne timeout PHP-Fortgeschrittene 5 22.05.2005 08:47
Backup der Datenbank PHP Tipps 2005 3 07.04.2005 00:39
Automatisches Datenbank backup PHP Tipps 2005 3 15.03.2005 16:24
Datenbank Backup!! Datenbanken 1 10.11.2004 14:39

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php sql backup einspielen, sql.gz einspielen, mysql gz einspielen, mysql datenbank backup einspielen, http://www.php.de/php-tipps-2008/44991-datenbank-backup-wieder-einspielen.html, mysql dump einspielen gz, eqdkp backup einspielen, mysqldump gzip einspielen, mysql datenbank einspielen, mysql dump gz einspielen, sql datenbank backup wieder einspielen, eqdkp sicherung einspielen, mysqldump einspielen gzip, sql backup mit php einspielen, gz dump einspielen, vbulletin backup einspielen, mysql backup einspielen gz, sql.gz einspielen php script, gzip mysqldump einspielen, mysql dump einspielen sql.gz

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:10 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.