mysudo

free speech, not free beer!

MySQL: Selektives Kopieren von Tabellen via PHP

3 Kommentare

Für ein aktuelles Projekt möchte ich bestimmte ausgewählte Tabellen mit dem kompletten Inhalt via PHP Skript von DB1 nach DB2 kopieren. Die einzelnen Tabellen in DB2 dürfen überschrieben werden.

Dabei bin ich auf folgendes gestossen:

//Verbindungsdaten
 $database_server = 'localhost';
 $database_username = 'root';
 $database_password = '';
//Datenbanken
 $database_source = 'phpbb';
 $database_target = 'test';
//Zu kopierende Tabellen - Wildcards erlaubt
 $table_pattern_arr = array();
 $table_pattern_arr[] = 'phpbb_acl%';
//Nicht vorhandene Tabellen ignorieren?
 $ignore_non_existing_tables = false;
//Mit Datenbank-Server verbinden
 if ( ($database_handle = mysql_connect($database_server, $database_username, $database_password)) === false)
 {
 die(get_database_error($database_handle));
 }
//Überprüfen ob Datenbanken vorhanden sind
 foreach (array ($database_source, $database_target) AS $database)
 {
 $sql = "SHOW DATABASES LIKE '".$database."'";
 $query = mysql_query($sql, $database_handle) or die('['.__LINE__.']'.get_database_error($database_handle));
if (mysql_num_rows ($query) <> 1)
 {
 die ("Datenbank [".$database."] wurde nicht gefunden");
 }
 }
//Tabellen durchgehen
 foreach ($table_pattern_arr AS $table_pattern)
 {
 //Überprüfen ob die Tabelle vorhanden ist
 $sql = "SHOW TABLES IN ".$database_source." LIKE '".addslashes ($table_pattern)."'";
 $query = mysql_query($sql, $database_handle) or die('['.__LINE__.']'.get_database_error($database_handle));
//Keine Tabellen vorhanden
 if (mysql_num_rows ($query) == 0)
 {
 if ( ! $ignore_non_existing_tables)
 {
 die ("Keine Tabellen die dem Filter [".$table_pattern."] entsprechen in der Datenbank [".$database_source."]");
 }
 }
 //Tabellen vorhanden
 else
 {
 //Gefundene Tabellen duchgehen
 while ($row = mysql_fetch_row ($query))
 {
 //Name der Tabelle
 $table_name = $row[0];
//Ziel Tabelle löschen falls vorhanden
 $sql = "DROP TABLE IF EXISTS ".$database_target.".".$table_name;
 $sub_query = mysql_query($sql, $database_handle) or die('['.__LINE__.']'.get_database_error($database_handle));
//Query zur Erstellung der Tabelle auslesen
 $sql = "SHOW CREATE TABLE ".$database_source.".".$table_name;
$sub_query = mysql_query($sql, $database_handle) or die('['.__LINE__.']'.get_database_error($database_handle));
 $sub_query_data_arr = mysql_fetch_row($sub_query);
//Query zur Erstellung der neuen Tabelle konstruieren
 $sql = str_replace("`".$table_name."`",$database_target.".".$table_name, $sub_query_data_arr[1]);
//Tabelle in Ziel-Datenbank erstellen
 $sub_query = mysql_query($sql, $database_handle) or die('['.__LINE__.']'.get_database_error($database_handle));
//Daten Einfügen
 $sql = "INSERT INTO ".$database_target.".".$table_name." SELECT * FROM ".$database_source.".".$table_name;
 $sub_query = mysql_query($sql, $database_handle) or die('['.__LINE__.']'.get_database_error($database_handle));
 }
 }
 }
//Fertig
 mysql_close($database_handle);
//Funktionen
 function get_database_error ($resource)
 {
 return mysql_errno($resource).' :: '.mysql_error ($resource);
 }

Dabei können zur Selektion sowohl die einzelnen Tabellen

 $table_pattern_arr = array();
 $table_pattern_arr[] = 'tabelle1';
 $table_pattern_arr[] = 'tabelle2';

als auch Platzhalter angegeben werden

 $table_pattern_arr = array();
 $table_pattern_arr[] = 'tabelle%';

Mein herzlicher Dank für das geniale Skrip geht dabei an Schlesser Claude von lunar.lu!

Advertisements

Autor: Thom

Abenteurer, Outdoorfreak, Webworker, Linuxer, WordPresser, SysAdmin, Tech-Geek, Fotograf, Makrofetischist, Alpinwanderer, Mountainbiker, Reisender, Seilbähnler, Skiliftler, Gärtner, Autoflicker, Naturliebhaber, Selbstversorger, Gipfelstürmer, Lebenskünstler - ich bin flexibel, situativ und variabel verfügbar!

3 Kommentare zu “MySQL: Selektives Kopieren von Tabellen via PHP

  1. Kleiner Tipp: WordPress kennt das code-Tag: <code>Text</code>

    Gefällt mir

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s