Mailinglisten-Archive |
Stefan Sturm wrote: > Wie übertrage ich am besten eine komplette MySQL Datenbank auf einen anderen > Server. Die Datenbank ist sehr groß, also der Umweg über Dump Table klappt > nicht. Wenn mysqldump meinedb >meinedb.sql in der Shell nicht funktioniert und es nicht an mangelnden Resources liegt ist es Zeit für einen Bugreport in die Richtung des MySQL Teams. Wer keinen Shellzugriff hat und den Admin auch nicht mal ebend bitten kann, schnappt sich die db_mysql.inc aus der PHPLIB und spielt etwas mit der Funktionen tables_names() und metadata(). table_names() liefert ein Array mit den Namen der in der Datenbank enthaltenen Tabellen. Im Falle eines MySQL wird einfach die Query "SHOW TABLES" abgesetzt. metadata() liefert Informationen über die Struktur einer Tabelle: Spaltenname, Spaltentyp, Länge, Flags. Es bedient sich der mysql Funktionen mysql_field_table(), mysql_field_name(), mysql_field_type(), mysql_field_len() und mysql_field_flags(). Wenn man alle Tabellen und auch halbwegs den Aufbau der Datenbank kennt, kann man die Inhalte sehr einfach dumpen. Man macht es jetzt genauso wie bei einem mysqldump auf der Kommandozeile. Es werden reihenweise "insert into tablename (field1, field2) values (value1, value2)" Statements generiert. <?php include "db_mysql.inc"; # Ein Teilstück der PHPLIB benutzen... $db = new DB_Platform; # Datenbankobjekt organisieren $tables = $db->table_names(); # Namen aller Tabellen merken $dump = ""; # Das wird unser Dump... reset($tables); # Um durch Arrays zu laufen # immer reset() ausführen! while (list(, $data)=each($tables)) { # Schleife $table = $data["table_name"]; # Name der aktuellen Tabelle $fields = ""; # Liste d. Felder $basequery = "insert into $table ("; # Anfang d. dump-Query $meta = $db->metadata($table); # Info über Tabelle besorgen reset($meta); # Alle Infos auslesen while (list(, $data)=each($meta)) $fields.=$data["name"].", "; # Liste d. Felder ausbauen $fields = substr($fields, 0, -2); # letztes ', ' wegnehmen $db->query("select * from $table"); # Alle Daten aus Tabelle holen while ($db->Next_Record()) { # etwa $data=mysql_fetch_array reset($meta); # Values f. dump-Query while (list(, $data)=each($meta)) # auslesen $values.=sprintf('"%s", ', addslashes($db->f($data["name"])) ); # Dump erweitern $dump.=$basequery.$fields.") values (".$values.");\n"; } } echo $dump; # Dump ausgeben (verarbeiten...) Jetzt bleibt noch die Aufgabe, die Struktur der Datenbank zu dumpen. Das ist etwas schwieriger, weil mysql_field_type() - wir greifen natürlich zu metadata() - nicht immer hilfreiche Angaben macht (http://www.php.net/manual/function.mysql-field-type.php3). Auch die Benutzung des MySQL Statements "DESCRIBE" hilft alle Hürden zu umschiffen. Damit kann der Datentyp einer Spalte zwar ermittelt werden, aber die genaue Definition der Keys läßt sich nicht erkennen. Hierfür und für den Dump gibt es ja auch mysqldump... Ulf
php::bar PHP Wiki - Listenarchive