Datenbankbackup!?

firstlord18

Erfahrenes Mitglied
Hallo,

habe folgendes Script, welches mir ein Backup von bestimmten Tabellen erstellen soll:

PHP:
<?php
$tbl_array = array();
// .. hier dann diesese array mit verschiedenen tabellen füllen ...


for ($y = 0, $c = count($tbl_array); $y < $c; $y++) {  
	$tabelle = $tbl_array[$y];

	// Struktur der Tabelle einlesen
	$def = "";
	$def .= "DROP TABLE IF EXISTS ".$tabelle."; \n";
	$def .= "CREATE TABLE ".$tabelle." (\n"; 
	$result3 = $this->_query("SHOW FIELDS FROM ".$tabelle);
	
	while($row = mysql_fetch_array($result3)) {
		$def .= "	".$row['Field']." ".$row["Type"];
		
		if ($row["Default"] != "") 
			$def .= " DEFAULT '".$row["Default"]."'";
			
		if ($row["Null"] != "YES") 
			$def .= " NOT NULL";
			
		if ($row["Extra"] != "") 
			$def .= " ".$row["Extra"];
			
		$def .= ",\n";
	}
	
	$def = ereg_replace(",\n$","", $def);
	$result3 = $this->_query("SHOW KEYS FROM ".$tabelle);
	
	while($row = mysql_fetch_array($result3)) {
		$kname = $row["Key_name"];
		
		if(($kname != "PRIMARY") && ($row["Non_unique"] == 0)) 
			$kname="UNIQUE|".$kname;
		
		if(!isset($index[$kname]))
			$index[$kname] = array();
			
		$index[$kname][] = $row["Column_name"];
	}
	
	while(list($xy, $columns) = @each($index)) {
		$def .= ",\n";
	
		if(trim($xy) == "PRIMARY") 
			$def .= "   PRIMARY KEY (" . implode($columns, ", ") . ")";
	
		elseif (substr($xy, 0, 6) == "UNIQUE") 
			$def .= "   UNIQUE ". substr($xy,7) ." (" . implode($columns, ", ") . ")";
	
		else 
			$def .= "   KEY ".$xy." (" . implode($columns, ", ") . ")";
	}

	$def .= "\n); \n";
	 
	// Ende Struktur Modul
	$db = @mysql_select_db($this->conn->db); 

	$tabelle = "". $tabelle; 
	
	$ergebnis=array();
	
	$tbl_name = "\n\n\n--\n-- Tabellenstruktur: `".$tabelle."`\n--\n"; 
	$tbl = "\n\n\n--\n-- Daten für Tabelle `".$tabelle."`\n--\n"; 
	
	
	$fp = fopen($file,"a+"); 
	fwrite($fp, $tbl_name.$def); 
	fwrite($fp, $tbl); 
	fclose($fp);
				

	$data = "";
	
	if ($tabelle > ""){  
	
		$ergebnis[] = @mysql_select_db($database,$conn_id); 
		$result = $this->_query("select * from ".$tabelle); 
		$anzahl= mysql_num_rows ($result); 
		$spaltenzahl = mysql_num_fields($result); 
		
		
		
		for ($i=0; $i < $anzahl; $i++) { 
		
			$zeile=mysql_fetch_array($result); 

			$data.="insert into ".$tabelle." ("; 
			
			for ($spalte = 0; $spalte < $spaltenzahl;$spalte++) { 
				$feldname = mysql_field_name($result, $spalte); 
				
				if($spalte == ($spaltenzahl - 1)) { 
					$data.= $feldname; 
				} 
				else { 
					$data.= $feldname.","; 
				} 
			}
			
			$data.=") VALUES ("; 
			
			for ($k=0; $k < $spaltenzahl; $k++){ 
				if($k == ($spaltenzahl - 1)) { 
					$data.="'".addslashes($zeile[$k])."'"; 
				} 
				else { 
					$data.="'".addslashes($zeile[$k])."',"; 
				} 
			} 
			
			$data.= ");\n"; 
		} 
		
		$data.= "\n";
	} 
	else { 
		$ergebnis[]= $err; 
	} 
	
	$fp = fopen($file,"a+"); 
	$zeit = time();
	$speed = $zeit;

	for ($i3 = 0; $i3 < count($ergebnis); $i3++){ 
		fwrite($fp, $data); 
	} 
	fclose($fp); 
}
?>

Naja, soweit klappt es eigentlich ganz gut, nur dass die Primary Keys falsch ausgelesen werden:

Backup erstellt von dem Script:
Code:
DROP TABLE IF EXISTS um_groups; 
CREATE TABLE um_groups (
	id int(10) NOT NULL auto_increment,
	groupname varchar(120) NOT NULL,
	art varchar(20) DEFAULT 'by_user' NOT NULL,
	autogetnewright int(2) DEFAULT '-1' NOT NULL,
   PRIMARY KEY (id)
); 

DROP TABLE IF EXISTS um_groups_rights; 
CREATE TABLE um_groups_rights (
	groups_id int(10) DEFAULT '0' NOT NULL,
	rights_id int(10) DEFAULT '0' NOT NULL
); 

DROP TABLE IF EXISTS um_rights; 
CREATE TABLE um_rights (
	id int(10) NOT NULL auto_increment,
	rightname varchar(120) NOT NULL,
	php_id varchar(100) NOT NULL
); 

DROP TABLE IF EXISTS um_users; 
CREATE TABLE um_users (
	id int(10) NOT NULL auto_increment,
	username varchar(100) NOT NULL,
	password varchar(100) NOT NULL,
	icq varchar(20) NOT NULL,
	mail varchar(50) NOT NULL,
	random_id varchar(25),
	autogetnewright int(2) DEFAULT '-1' NOT NULL
); 

DROP TABLE IF EXISTS um_users_groups; 
CREATE TABLE um_users_groups (
	users_id int(10) DEFAULT '0' NOT NULL,
	groups_id int(10) DEFAULT '0' NOT NULL
); 

DROP TABLE IF EXISTS um_users_rights; 
CREATE TABLE um_users_rights (
	users_id int(10) DEFAULT '0' NOT NULL,
	rights_id int(10) DEFAULT '0' NOT NULL
);

Und hier das Backup, das von PHPMyAdmin erstellt wurde:

Code:
CREATE TABLE `asdasd` (
  `id` int(10) NOT NULL auto_increment,
  `name` varchar(100) collate latin1_general_ci NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=1 ;

CREATE TABLE `um_groups` (
  `id` int(10) NOT NULL auto_increment,
  `groupname` varchar(120) collate latin1_general_ci NOT NULL default '',
  `art` varchar(20) collate latin1_general_ci NOT NULL default 'by_user',
  `autogetnewright` int(2) NOT NULL default '-1',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=2 ;

CREATE TABLE `um_groups_rights` (
  `groups_id` int(10) NOT NULL default '0',
  `rights_id` int(10) NOT NULL default '0'
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

CREATE TABLE `um_rights` (
  `id` int(10) NOT NULL auto_increment,
  `rightname` varchar(120) collate latin1_general_ci NOT NULL default '',
  `php_id` varchar(100) collate latin1_general_ci NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=14 ;

CREATE TABLE `um_users` (
  `id` int(10) NOT NULL auto_increment,
  `username` varchar(100) collate latin1_general_ci NOT NULL default '',
  `password` varchar(100) collate latin1_general_ci NOT NULL default '',
  `icq` varchar(20) collate latin1_general_ci NOT NULL default '',
  `mail` varchar(50) collate latin1_general_ci NOT NULL default '',
  `random_id` varchar(25) collate latin1_general_ci default '',
  `autogetnewright` int(2) NOT NULL default '-1',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=2 ;

CREATE TABLE `um_users_groups` (
  `users_id` int(10) NOT NULL default '0',
  `groups_id` int(10) NOT NULL default '0'
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

CREATE TABLE `um_users_rights` (
  `users_id` int(10) NOT NULL default '0',
  `rights_id` int(10) NOT NULL default '0'
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

Irgendwie stimmt der erste Primary Key noch, aber danach werden keine mehr angelegt.

Woran liegt das bzw habt Ihr ein (kleines !) Script, welches bestimmte Tabellen backuppd (Also Struktur + Daten der Tabelle)!

Danke!
 
Hallo,
durch folgendes Beispiel kannst du die ganze Struktur der Tabelle ausgeben.
PHP:
<?
  include('connect.php');  
  $query = mysql_query('SHOW CREATE TABLE tabelle');
  $ds = mysql_fetch_object($query);
  $name = mysql_field_name($query, 1);
  echo nl2br($ds->$name);
?>

mfg
forsterm
 
Danke schonmal. Noch ne Frage:


wenn ich sowas habe:

Code:
CREATE TABLE `um_users` (
`id` int(10) NOT NULL auto_increment,
`username` varchar(100) collate latin1_general_ci NOT NULL default '',
`password` varchar(100) collate latin1_general_ci NOT NULL default '',
`icq` varchar(20) collate latin1_general_ci NOT NULL default '',
`mail` varchar(50) collate latin1_general_ci NOT NULL default '',
`random_id` varchar(25) collate latin1_general_ci default '',
`autogetnewright` int(2) NOT NULL default '-1',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci


frag ich mich immer, was das zeug wie "collate latin1_general_ci" oder "ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci" sein soll. Braucht man das?
Is auch irgendwie voll komisch, wenn ich das auf anderen Servern einspielen will, bekomme ich oft Errors. Wenn ich dann den oben genannten Krams weglösche, dann es einwandfrei:

Code:
CREATE TABLE `um_users` (
`id` int(10) NOT NULL auto_increment,
`username` varchar(100) NOT NULL default '',
`password` varchar(100) NOT NULL default '',
`icq` varchar(20) NOT NULL default '',
`mail` varchar(50) NOT NULL default '',
`random_id` varchar(25) default '',
`autogetnewright` int(2) NOT NULL default '-1',
PRIMARY KEY (`id`)
)


Nur warum? Für was braucht man das etc?

Danke!
 
ok danke, du hast recht. Hab es nun gemerkt :)
Kann man das collate_latin zeugs da irgendwie weglassen?
Also bei dem Befehl "show table status" meinte ich jetzt
 
Zurück