PHP & MySQL Engineering

Selektives Kopieren von Tabellen

Ich habe vor einigen Tagen folgende Email eines Besuchers erhalten:

Ich möchte von db1 nach db2 ganz bestimmte einzelne Tabellen mit dem kompletten Inhalt kopieren und das per Cronjob zu bestimmten Zeiten. Dabei dürfen in db2 die bestimmten einzelnen Tabellen mit dem kompletten Inhalt überschrieben werden. [...] Dann wäre es toll wenn ich im Skript [...] auch die einzelnen Tabellen konfigurieren kann.

Hier ein Skript welches die beschriebene Aufgabe lösen sollte Icon Wink in Selektives Kopieren von Tabellen

Man kann hierbei die Tabellen einzeln angegeben …

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

… oder aber Platzhalter verwenden:

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

Das vollständige Script:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<?php
 
//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);
}

Hier zum Beispiel ein Cronjob um das Script stündlich auszuführen:

00 */1 * * * php /var/www/lunar/local/scripts/copy_tables.php

Für Anregungen und Fragen könnt Ihr mir gerne einen Kommentar hinterlassen, oder eine Frage an den Experten stellen.

 

Kommentare: 2

Kommentar hinterlassen »

 
 
 

ich bin sprachlos - vielen vielen Dank!

Ich habe es gerade schon ausprobiert und es funktioniert hervorragend. Ich freue mich riesig und möchte mich nochmals vielmals bei Dir für diese schnelle und professionelle Hilfe bedanken.

Liebe Grüße
Axel

 
 

Super!

War genau dass wonach ich schon den ganzen Vormittag gesucht hatte. Vielen Dank & Liebe Grüsse aus Dänemark!

Volker

 
 

Kommentar hinterlassen

 
(Wird nicht veröffentlicht)
 
(rel="follow")
 
Kommentar *
 
Eins + Vier =