phpbar.de logo

Mailinglisten-Archive

[php] OT: Linux-Server in 3 Monaten

[php] OT: Linux-Server in 3 Monaten

Hohermuth Erich eh_(at)_profzone.ch
Wed, 22 Mar 2000 22:29:50 +0100


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