Datenbank kopieren und sichern in MySql
Andreas-Lindig
- datenbank
hallo Forum,
ich wuerde gern den Datenbankinhalt meiner test-Datenbank zuhause auf den Server meines Providers uebertragen.
->Wie geht das?
Ein Problem sind zum Beispiel die id's. Die habe ich in der Struktur der Tabellen auf 'auto_increment' gestellt. Jetzt habe ich nach einigen Aenderungen Luecken in den id-Spalten (also gelöschte Einträge). Wenn ich die Tabellen einfach ueberspiele (ohne id's - anders gehts ja gar nicht) werden die id's in der Ziel-Datenbank wieder lueckenlos durchnumeriert. Das heisst aber, dass Verknuepfungen - ueber die id's (als Schluessel zwischen den Tabellen) - nicht mehr stimmen.
Außerdem bekomme ich beim DUMP meiner Datenbank immer so eine komische Warnmeldung:
<b>Warning</b>: Cannot set time limit in safe mode in <b>c:\Eigene_Dateien\PHP_home\phpmyadmin\lib.inc.php</b> on line <b>473</b><br>
INSERT INTO bestellung VALUES ( '1', '1', '1', NULL, '03.03.2002 22:51', '1', '1', '1');
die steht vor jedem INSERT-Statement.
->Kann mir da mal jemand was grundsaetzliches dazu schreiben?
->Es geht mir dabei ja auch darum: wie sichert man die Daten einer Datenbank so, dass man sie nach einem Crash wieder aufspielen kann?
vielen Dank und Gruss, Andreas
--
http://pizza.andeas-lindig.de
Hallo,
eigentlich ist das alles ganz einfach (mit phpMyAdmin)
Struktur und Daten senden und speichern als "datei.sql" (local) und dann Online auf die MySQL-DB wieder aufspielen. Geht auch mit den id´s.
Gruß riethmunk
Hallo,
hallo
eigentlich ist das alles ganz einfach (mit phpMyAdmin)
schön, daß Du mir Mut machst
Struktur und Daten senden und speichern als "datei.sql" (local)
hab, ich gemacht und die Enstprechende Fehlermeldung erhalten...(siehe Eingansposting)
und dann Online auf die MySQL-DB wieder aufspielen. Geht auch mit den id´s.
Da bekomme ich eine Fehlermeldung, die mir auch logisch erscheint: sie besagt in etwa, daß ich die ID nicht doppelt eingeben kann. (klar: einmal steht in meinem sql-statement eine ID und zugleich versucht auto_increment eine zu vergeben)
Also ganz so einfach gings bei mir bisher nicht.
Gruß, Andreas
Hallo nochmal,
du mußt den Inhalt der Online-DB komplett gelöscht haben, sonst geht das nicht.
Nur der DB-Name darf übrig sein, den rest legst Du beim hochspielen wieder an.
gruß riethmunk
aaahh!
tatsächlich. herzlichen Dank.
nur, ein Problem bleibt:
in meinem DUMP steht vor JEDEM Insert diese Warnmeldung:
<b>Warning</b>: Cannot set time limit in safe mode in <b>c:\Eigene_Dateien\PHP_home\phpmyadmin\lib.inc.php</b> on line <b>473</b><br>
INSERT INTO bestellung VALUES ( '1', '1', '1', NULL, '03.03.2002 22:51', '1', '1', '1');
und damit geht es eben nicht. Ich habe gerade zur Probe mal einen kleinen Auszug hochgeladen, in dem ich diese Warnmeldungen gelöscht habe. Nur ist mein DUMP mehrere hundert Zeilen lang...
Also: wie verhindert man diese Warnung beim Dumpen?
gruß, Andreas
Hallo,
sieht so aus als ob du hier ein falsches Datumsformat in die DB schreiben willst.
03.03.2002 22:51
muß so aussehen
2002-03-03 22:51:00
auch wenn wir in Deutschland sind will MySQL das Format.
Gruß riethmunk
03.03.2002 22:51
muß so aussehen
2002-03-03 22:51:00
muß ich in Ruhe mal zuhause testen. Danke und Gruß (vielleicht bis morgen ;-) Andreas
Hi!
aaahh!
tatsächlich. herzlichen Dank.
nur, ein Problem bleibt:
in meinem DUMP steht vor JEDEM Insert diese Warnmeldung:
<b>Warning</b>: Cannot set time limit in safe mode in <b>c:\Eigene_Dateien\PHP_home\phpmyadmin\lib.inc.php</b> on line <b>473</b><br>
INSERT INTO bestellung VALUES ( '1', '1', '1', NULL, '03.03.2002 22:51', '1', '1', '1');
und damit geht es eben nicht. Ich habe gerade zur Probe mal einen kleinen Auszug hochgeladen, in dem ich diese Warnmeldungen gelöscht habe. Nur ist mein DUMP mehrere hundert Zeilen lang...
Also: wie verhindert man diese Warnung beim Dumpen?
gruß, Andreas
das time limit kommt von php. da es sich ja um eine lokale php installation handelt, könntest du einfach den "safe mode" deaktivieren.
alternativ ist es bei grossen datenmengen ja eh sinnvoller(schneller und sicherer) das von hand zu machen. falls du shell scripte bei deinem provider verwenden darfst, könntest du so vorgehen:
lokal:
1. mysqldump --opt DATABASE > db_dumb.sql
2. dann db_dumb.sql in das cgi verzeichnis deines webservers einspielen
3. ein shellscript erstellen:
#!/bin/sh
echo "Content-type: text/html"
echo
echo
mysql DATABASE < db_dumb.sql
4. shellscript hochladen und ausführen
FERTIG!
grüsse, dirk.
Hi!
alternativ ist es bei grossen datenmengen ja eh sinnvoller(schneller und sicherer) das von hand zu machen. falls du shell scripte bei deinem provider verwenden darfst, könntest du so vorgehen:
lokal:
- mysqldump --opt DATABASE > db_dumb.sql
- dann db_dumb.sql in das cgi verzeichnis deines webservers einspielen
- ein shellscript erstellen:
#!/bin/sh
echo "Content-type: text/html"
echo
echo
mysql DATABASE < db_dumb.sql
- shellscript hochladen und ausführen
FERTIG!
Dieser lokal erzeugte Dump kann auch in phpmyadmin eingelesen werden, so wie sonst auch, einfach strg copy und ausführen!
So kämst Du zumindest um die Fehlermeldungen herum.
mysqldump funktioniert normalerweise übrigens nur im Verzeichnis von mysql\bin\ ggfs mußt Du auch Userdaten angeben, so wie:
mysqldump --opt -hlocalhost -udein_user -pdein_passwort DATABASE > db_dumb.sql
Grüße
Andreas
Dieser lokal erzeugte Dump kann auch in phpmyadmin eingelesen werden, so wie sonst auch, einfach strg copy und ausführen!
So kämst Du zumindest um die Fehlermeldungen herum.
Ich weiß nicht, ob wir jetzt aneinander vorbeireden, aber der DUMP selbst ist ja schon fehlerhaft, so daß ich ihn nicht verwenden kann.
Gruß, Andreas
hi,
das time limit kommt von php. da es sich ja um eine lokale php installation handelt, könntest du einfach den "safe mode" deaktivieren.
soetwas schien mir auch schon, weil auch im Dump etwas von 'safe_mode' steht. Ich habe ihn eingeschaltet, weil es auch bei meinem Provider so ist (damit ich möglichst unter gleichen Bedingungen testen kann).
habe aber gerade mal einen Dump von meinem Provider aus gemacht (genauso, wie zuhause) und erhalte den Fehler nicht. Ist das bei lokal-Installation anders?
Da bekomme ich eine Fehlermeldung, die mir auch logisch erscheint: sie besagt in etwa, daß ich die ID nicht doppelt eingeben kann. (klar: einmal steht in meinem sql-statement eine ID und zugleich versucht auto_increment eine zu vergeben)
Hi,
genau aus diesem Grunde haben gute Datenbanksysteme wie z.b. Oracle so ein Feature nicht. Aber das hilft dir im Moment recht wenig.
Du hast die Wahl:
a) du mußt die komplette Tabelle in MySQL löschen und deine einspielen
---> hat den evt. nachteil, daß du insofern keinen Datenabgleich (von dir lokal neu eingegebene Daten beim Provider hinzufügen) machen kannst, sondern immer nur einen vollen Datenstamm importieren mußt, was sich unter Umständen auf alle Tabellen deiner DB ausdehnen kann.
b) du fügst deine Daten datensatzweise der bestehenden Tabelle hinzu und läßt die ID über das auto_increment dort vergeben, dann kommen unter umständen aber Referenzmodelle durcheinander
c) du arbeitest auf dem Server des Providers nicht mit auto_increment, sondern maximal bei dir zuhause lokal, dann bleiben Referenzmodelle (tabelle1.id zu tabelle2.tab1id) erhalten. Allerdings müßtest du, wenn viel über fertigen php-seiten online als Interface in die Datenbanktabelle reinsoll immer die neue ID von hand generieren (max(id) abrufen -> neue ID = alteMaxID + 1)
d) du findest eine Möglichkeit für ein override für das auto_increment, was es aber imho nicht gibt, bzw. hab noch nie davon gehört.
Du siehst, 3 mögliche Möglichkeiten, die aber immer einen bestimmten Nachteil mitsichbringen, was für mich dieses feature (auto_increment) nicht gerade sinnvoll macht. Deshalb muss abe rnicht gleich mySQL schlecht sein. :-)
Falls jemand einen guten Workaround für dieses Problem kennt, da bin ich ganz Ohr :-) man lernt ja nie aus :-)
So, tschö(nen Feierabend)
Frank
hi,
a) du mußt die komplette Tabelle in MySQL löschen und deine einspielen [...] was sich unter Umständen auf alle Tabellen deiner DB ausdehnen kann.
werden die dann größer oder was (obwohl die Datensätze nicht mehr werden)?
b) du fügst deine Daten datensatzweise der bestehenden Tabelle hinzu und läßt die ID über das auto_increment dort vergeben, dann kommen unter umständen aber Referenzmodelle durcheinander
Genau!,
d) du findest eine Möglichkeit für ein override für das auto_increment, was es aber imho nicht gibt, bzw. hab noch nie davon gehört.
aber die ID's werden scheinbar, wie gerade auf den Tip von Riethmunk hin getestet, doch so vergeben, wie sie im SQL-Statement stehen.
c) du arbeitest auf dem Server des Providers nicht mit auto_increment [...] Allerdings müßtest du, wenn viel über fertigen php-seiten online als Interface in die Datenbanktabelle reinsoll immer die neue ID von hand generieren (max(id) abrufen -> neue ID = alteMaxID + 1)
eben, und ich dachte auto_indrement sei sicherer in Bezug auf nicht wiederholte ID's (ausserdem ist's so schön praktisch ;-)
was für mich dieses feature (auto_increment) nicht gerade sinnvoll macht.
nächstes mal lasse ich die Finger davon (versprochen ;-)
UND: weißt du denn mit der von mir beschriebenen Fehlermeldung beim Dumpen etwas anzufangen?
So, tschö(nen Feierabend)
ja, ebenfalls
gruß, Andreas
UND: weißt du denn mit der von mir beschriebenen Fehlermeldung beim Dumpen etwas anzufangen?
Hi,
sorry, mit dieser SQL-DB-Implementierung hab ich eher weniger zu tun, deswegen kann ich dir da leider nicht helfen.
ja, praktisch mag sich das (auto-increment) schön verwenden lassen, aber gerade wenn es auf solche Anwendungsfälle hinausläuft, ist es hinderlich.
zu a) nochmal: nicht die Tabellen werden größer, sondern du müßtest diese Aktion dann evt. mit allen Tabellen durchführen.
deine Anmerkung zu d) hab ich nicht ganz verstanden.
einfach so die Finger von lassen, macht auch nich viel sinn, weil auto_increment haben ist immer noch besser als gar nichts haben....
Gruß, Frank
Hi!
Was spricht dagegen einfach die komplette Tabelle zu übertragen? Kreuze beim Dump in phpmyadmin einach an "DROP TABLE", dann wird die Tabelle gelöscht, natürlich mußt Du dann acuh "Struktur und Daten" dumpen, sonst gehts nicht.
So ist es das auberste und einfachste, alles andere wird recht kompliziert!
Grüße
Andreas
Was spricht dagegen einfach die komplette Tabelle zu übertragen? Kreuze beim Dump in phpmyadmin einach an "DROP TABLE", dann wird die Tabelle gelöscht,
ja, das ist mittlerweile klar geworden: Ich wollte bestehende Tabellen neu beschreiben und das geht nicht. Das Problem waren halt immer die Fehler beim Dump.
Andreas
vielen Dank Euch allen für Eure engagierte Hilfe.
heute hat's geklappt - meine Speisekarte ist online.
Ich habe einen Dump mit 'mysql-front' gemacht, da gibt's keine Fehlermeldung.
Die Probleme waren:
gruß, Andreas