php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Datenbank-Backup


 
bigtail
11-08-2003, 22:03 
 
Hi,
ich benötige ein Skript, dass jeden Tag um 24 Uhr eine Datenbank auf C:/ speichert.
Das alte Backup muss überschrieben werden.

Ist das mit PHP möglich??
Kennt jemand ein Skript oder Tutorials dafür??
Könntet ihr mir Tipps geben, wie ich an die Sache ran gehen muss??

Wie sichert ihr eure Datenbanken??

Vielleicht ein Beispiel??

Besten Dank im Voraus

 
thebrain
11-08-2003, 22:18 
 
http://www.mysql.com/doc/en/mysqldump.html

 
Abraxax
11-08-2003, 22:23 
 
.... und das dann einfach via cronjob aufrufen. fertig.

 
jamaica-man
12-08-2003, 01:52 
 
Hallo alle zusammen, kann mal jemand kurz die Synax posten, wie ich die db "foo" auf "C:\bar" mysqldumpe?

Der mehrt mir immer fehler in mein phpmyadmin wenn ich den Befehl da eingebe. Kann man den da eingeben?


mfg Martin

 
Uzimaster
12-08-2003, 08:04 
 
Dieser Befehl ist nicht für PHPMyAdmin gedacht.

Ein Shell/Telnet Zugriff auf den Server muss schon vorhanden sein. (Lokal kann man das auch mit der Eingabeauffoderung machen)

Dann kannst du mit der folgenden Eingabe ein Backup erstellen:

mysqldump --all -e -l --add-drop-table --host=localhost --user=**** --password=**** DATENBANK >PFAD

Oder auch gleich noch mit GZip komprimieren:

mysqldump --opt --user=BENUTZERNAME --password=PASSWORT --host=HOSTNAME DATENBANKNAME| gzip > /pfad/zum/backup.sql.gz

Wenn du das Backup täglich erstellen lassen willst solltest du, wie schon gesagt wurde, Cronjobs verwenden.

mysqldump --all -e -l --add-drop-table --host=localhost --user=**** --password=**** foo >C:\dump.sql

Wenn du noch Unterordner angeben willst müssen diese schon vorhanden sein. (Habs nur unter Win getestet)

 
bigtail
12-08-2003, 10:50 
 
Wenn du das Backup täglich erstellen lassen willst solltest du, wie schon gesagt wurde, Cronjobs verwenden.
code:
mysqldump --all -e -l --add-drop-table --host=localhost --user=**** --password=**** foo >C:\dump.sql
Hallo @Uzimaster,
Super Antwort, ich hätte allerdings eine oder andere Frage dazu?

Was bedeuten eigentlich -e und -l und wozu --add-drop-table?? man möchte ja nur ein Backup!

Wo steht, dass das Backup täglich erstellt wird?

Könnte man auch die Uhrzeit für das automatische Backup bestimmen??

Danke nochmal

 
Abraxax
12-08-2003, 10:56 
 
Original geschrieben von bigtail
Was bedeuten eigentlich -e und -l und wozu --add-drop-table?? man möchte ja nur ein Backup!mysqldump --help liefert dir die hilfe.

Original geschrieben von bigtail
Wo steht, dass das Backup täglich erstellt wird?das macht du am besten mit einem cronjob.

Original geschrieben von bigtail
Könnte man auch die Uhrzeit für das automatische Backup bestimmen??das kannst du auch im cronjob einstellen.

 
Uzimaster
12-08-2003, 11:24 
 
--add-drop-table - > Vor jedem CREATE wird ein DROP TABLE gesetzt

-e -> Mehrzeilige Insertsyntax wird benutzt (ist i.d.R. schneller)

-l -> Tabellen werden vor dem erstellen des Dumps gesperrt.

 
bigtail
12-08-2003, 12:04 
 
fantastische Antwort, besten Dank.
--add-drop-table - > Vor jedem CREATE wird ein DROP TABLE gesetzt
Wozu??

 
TobiaZ
12-08-2003, 12:12 
 
du willst die Tabelle ja überschreiben. das geht nicht direkt, sondern durch löschen und neu erstellen.

 
Uzimaster
12-08-2003, 12:12 
 
Damit wird die Tabelle gelöscht um sie dann neu zu erstellen. So kann man Fehler vermeiden die beim einfügen der Daten entstehen könnten. (doppelte Id´s etc.)

 
jamaica-man
12-08-2003, 16:10 
 
Hallo alle zusammen,

habs heut morgen gleich getestet und geht einwandfrei.
Die direkte anschlussfrage: Wie stelle ich die Daten jetzt wieder her?
LOAD_DATA_INFILE müsste gehen, oder gibts eine mysqlinsertdump syntax?

mfg MArtin

 
slarti
12-08-2003, 16:16 
 
mysql -u username -p -d datenbankname < deinfile

 
jamaica-man
12-08-2003, 19:41 
 
Guten Tag alle zusammen,

habe das mit dem mysqldumps lokal super hinbekommen. Jetzt wollt ich das alle von einem Script mehren lassen, folgendes ins Script getippelt:

//lokal geht das alles super

//Die Mysqldatenbank wird gessichert
exec('C:/FoxServ/mysql/bin/mysqldump --opt --host='.$sqlhost.' --user='.$sqluser.' --password='.$sqlpass.' '.$database.' > '.$_SERVER['DOCUMENT_ROOT'].'/'.$default['cookie_path'].'/backup/mysql.sql',$mysql,$mysql2);

//jetzt fürn Server umgeschrieben

//Die Mysqldatenbank wird gessichert
exec('/usr/bin/mysqldump --opt -e -l --add-drop-table --host='.$sqlhost.' --user='.$sqluser.' --password='.$sqlpass.' '.$database.' > '.$_SERVER['DOCUMENT_ROOT'].'/'.$default['cookie_path'].'/backup/mysql.sql',$mysql,$mysql2);

auf dem Server legt er die Datei nicht an, "backup" ist auf 777 gesetzt

es kommt der Fehler "126"
nachgeschaut-> 126 = Index file is crashed / Wrong file format

also repair table, fehler immer noch da

woran kann das liegen?

mfg Martin

 
Abraxax
12-08-2003, 19:55 
 
verwende myisamchk

 
Uzimaster
12-08-2003, 20:11 
 
So hier sollte das eigentlich funktionieren:

<?php
// Enter your MySQL access data
$host= 'dbhost';
$user= 'dbuser';
$pass= 'dbpassword';
$db= 'db';

$backupdir = 'backups';

// Compute day, month, year, hour and min.
$today = getdate();
$day = $today[mday];
if ($day < 10) {
$day = "0$day";
}
$month = $today[mon];
if ($month < 10) {
$month = "0$month";
}
$year = $today[year];
$hour = $today[hours];
$min = $today[minutes];
$sec = "00";

// Execute mysqldump command.
// It will produce a file named $db-$year$month$day-$hour$min.gz
// under $DOCUMENT_ROOT/$backupdir
system(sprintf(
'mysqldump --opt -h %s -u %s -p%s %s | gzip > %s/%s/%s-%s%s%s-%s%s.gz',
$host,
$user,
$pass,
$db,
getenv('DOCUMENT_ROOT'),
$backupdir,
$db,
$year,
$month,
$day,
$hour,
$min
));
echo '+DONE';
?>

Quelle: php.net

 
jamaica-man
12-08-2003, 22:01 
 
Hallo alle zusammen,

weiss nicht ob es hier her gehört, aber das problem entstand im laufe dieses threads. Also, fehler von vorhin, als ich das mit exec() probiert habe. Diesen befehl genommen, und mal direkt in telnet reingeschreiben:

quasi:


usr/bin/mysqldump --opt -e -l --add-drop-table --host=localhost --user=web3 --password=passwort usr_web3_2 > /home/www/web3/html/test/backup/mysql.sql


Die zugangsdaten sind aus der dbconnect des Projektes genommen, also host/username/passwort gehen, wenn ich z.B. einen Select query ausführen will in einem phpscript

hier kommt aber folgender Fehler:


Got error: 1045: Access denied for user: 'web3@localhost' (Using password: YES) when trying to connect


Meine Vermutung ist, das confixx irgendwie seine Finger mit im Spiel hat, und dass hintenrum umleitet oder teufel was tut.

jedenfalls gehen die daten in der dbconnect, und hier nicht.

woran kann das liegen?

mfg Martin

 
jamaica-man
13-08-2003, 16:19 
 
Hallo,

ich habe eine datei, mysql.sql die ich mir durch folgenden Code
erstellen lasse:

exec('C:/SERVER/mysql/bin/mysqldump --opt -e -l --all --allow-keywords --quote-names --flush-logs --add-drop-table --host='.$sqlhost.' --user='.$sqluser.' --password='.$sqlpass.' '.$database.' > '.$_SERVER['DOCUMENT_ROOT'].'/'.$default['cookie_path'].'/backup/mysql.sql',$mysql,$mysql2);



jetzt will ich diese Datei mit folgendem Befehl einlesen:




exec('C:/SERVER/mysql/bin/mysql --host='.$sqlhost.' --user='.$sqluser.' --force --password='.$sqlpass.' --database '.$database.' < '.$_SERVER['DOCUMENT_ROOT'].'/'.$default['cookie_path'].'/mysql.sql',$mysql,$mysql2);


dabei überliest er aber anscheinend folgenden Teil:
wobei er den DROP Teil noch ausführt, aber erstellen tut er die Tabelle nicht mehr, komme auch keine Fehlermeldungen.

--
-- Table structure for table 'module'
--

DROP TABLE IF EXISTS `module`;
CREATE TABLE `module` (
`id` smallint(4) unsigned NOT NULL auto_increment,
`name` tinytext NOT NULL,
`internet_homepage` text NOT NULL,
`internet_email` tinytext NOT NULL,
`anschrift_firma` tinytext NOT NULL,
`anschrift_name` tinytext NOT NULL,
`anschrift_strasse` tinytext NOT NULL,
`anschrift_ort` tinytext NOT NULL,
`anschrift_telefon` tinytext NOT NULL,
`anschrift_mobil` tinytext NOT NULL,
`anschrift_fax` tinytext NOT NULL,
`bank_inhaber` tinytext NOT NULL,
`bank_kontonummer` tinytext NOT NULL,
`bank_bankleitzahl` tinytext NOT NULL,
`bank_institut` tinytext NOT NULL,
`bank_betrag` tinytext NOT NULL,
`modul_language` smallint(4) unsigned NOT NULL default '0',
`modul_rechtelevel` enum('1','2','3') NOT NULL default '1',
`modul_username` tinytext NOT NULL,
`modul_passwort` tinytext NOT NULL,
PRIMARY KEY (`id`)
) TYPE=MyISAM COMMENT='Tabelle in der alle Informationen bezüglich der Modulbesitze';

/*!40000 ALTER TABLE `module` DISABLE KEYS */;

--
-- Dumping data for table 'module'
--


LOCK TABLES `module` WRITE;

/*!40000 ALTER TABLE `module` ENABLE KEYS */;
UNLOCK TABLES;

Muss ich evtl. noch andere Parameter in einer der beiden exec setzen?
Hab eigentlich was an sicherheit geht (--allow-keywords, --quote-names) gesetzt, die restlichen 20tables liest er ohne Probleme ein, und diese table ist weder am ende noch am anfang, sonder halt irgendwo mitten drinne.

mfg Martin


Alle Zeitangaben in WEZ +2. Es ist jetzt 03:32 Uhr.