Scripts

Database structuur vergelijken

Het synchroniseren van een database structuur vanuit een test naar een live omgeving, vraagt veel zorgvuldigheid. Omdat de klant vaak zo min mogelijk down time wil, kan je vaak niet de database overschrijven, met die van de live omgeving. Om te controleren welke tabellen gewijzigd zijn, heb ik dit scriptje een tijdje terug geschreven. Hiermee vergelijk je de structuren van 2 of meerdere (mysql) databases. Wat het scriptje doet, is aan de hand van opgegeven database inloggegevens, één voor één de structuren ophalen, en deze vervolgens vergelijken. Ik hoop dat er iemand is, die dit kan gebruiken. Werkend voorbeeld

dbcompare.php
[code]<?
ini_set('display_erros',1);
error_reporting(E_ALL);

$dbcredentials[1] = array(
   'host' => '',
   'dbusername' => '',
   'dbpassword' => '',
   'dbname' => ''
);
$dbcredentials[2] = array(
   'host' => '',
   'dbusername' => '',
   'dbpassword' => '',
   'dbname' => ''
);


# Verzamel de gegevens
foreach($dbcredentials as $i => $db){
	$conn[$i] = mysql_connect($db['host'], $db['dbusername'], $db['dbpassword']);
	if(!mysql_select_db($db['dbname'],$conn[$i])) {
		die('Kan geen verbinding maken met de database '.$db['dbname']);
	}
	
	# Verzamel tabellen
	$qry = mysql_query("SHOW TABLES",$conn[$i]);
	while($info = mysql_fetch_assoc($qry)){
		$dbtables[$i][] = reset($info);	
	}
	
	# Verzamel kolommen van tabellen
	foreach($dbtables[$i] as $table){
		$qry = mysql_query("SHOW COLUMNS FROM ".$table, $conn[$i]);
		while($info = mysql_fetch_assoc($qry)){
			$tables_with_fields[$i][$table][$info['Field']] = $info['Type'];	
		}
	}
}

?>
<h1>DataBase Vergelijker</h1>
<?
# Houdt bij, welke databases al met elkaar zijn vergeleken
$done = array();

# Vergelijk de gegevens
foreach($dbcredentials as $i => $db_master){
	
	if(!isset($done[$i])){
		$done[$i] = array();	
	}
	
	foreach($dbcredentials as $j => $db_slave){
		
		if(!isset($done[$j])){
			$done[$j] = array();	
		}
		
		# Zorg dat je een tabel vergelijking, maar 1 keer uitvoert.
		if($i != $j && !in_array($j, $done[$i]) && !in_array($i,$done[$j])){	
			$done[$i][] = $j;
			$done[$j][] = $i;
		?>
		<table width="100%">
            <tr>
                <td width="50%"  valign="top">
                    <h2><?=$db_master['dbname'].'@'.$db_master['host']?> => <?=$db_slave['dbname'].'@'.$db_slave['host']?></h2>
                    <pre><?
                    foreach($tables_with_fields[$i] as $table => $fields){
                        if(array_key_exists($table,$tables_with_fields[$j])){
                            print '<span style="color: green;">Table <strong>'.$table.'</strong> bestaat in '.$db_slave['dbname'].'@'.$db_slave['host'].'</span>'."\n";
                            foreach($fields as $field => $type){
                                if(!array_key_exists($field,$tables_with_fields[$j][$table])){
                                    print "\t".'<span style="color: red;">Veld <strong>'.$field.'</strong> bestaat niet in '.$db_slave['dbname'].'@'.$db_slave['host'].'</span>'."\n";
                                }else{
									if($type != $tables_with_fields[$j][$table][$field]){
										 print "\t".'<span style="color: red;">Veld <strong>'.$field.'</strong> is niet hetzelfde veldtype als in '.$db_slave['dbname'].'@'.$db_slave['host'].'</span>'."\n";	
									}
								}
                            }
                        }else{
                            print '<span style="color: red;">Table <strong>'.$table.'</strong> bestaat niet in '.$db_slave['dbname'].'@'.$db_slave['host'].'</span>'."\n";	
                        }
                        print '-------------------------------------------------------'."\n";
                    }
        
					?></pre>
				</td>
				<td valign="top">
					<h2><?=$db_slave['dbname'].'@'.$db_slave['host']?> => <?=$db_master['dbname'].'@'.$db_master['host']?></h2>
					<pre><?
					foreach($tables_with_fields[$j] as $table => $fields){
						if(array_key_exists($table,$tables_with_fields[$i])){
							print '<span style="color: green;">Table <strong>'.$table.'</strong> bestaat in '.$db_master['dbname'].'@'.$db_master['host'].'</span>'."\n";
							 foreach($fields as $field => $type){
								
								if(!array_key_exists($field,$tables_with_fields[$i][$table])){
									print "\t".'<span style="color: red;">Veld <strong>'.$field.'</strong> bestaat niet in '.$db_master['dbname'].'@'.$db_master['host'].'</span>'."\n";
								}else{
									if($type != $tables_with_fields[$i][$table][$field]){
										 print "\t".'<span style="color: red;">Veld <strong>'.$field.'</strong> is niet hetzelfde veldtype als in '.$db_slave['dbname'].'@'.$db_slave['host'].'</span>'."\n";	
									}
								}
							}
						}else{
							print '<span style="color: red;">Table <strong>'.$table.'</strong> bestaat niet in '.$db_master['dbname'].'@'.$db_master['host'].'</span>'."\n";	
						}
						print '-------------------------------------------------------'."\n";
					}
						
					?></pre>
				</td>
			</tr>
		</table>
		<?
		}
	}
}
?>
[/code]

Reacties

0
Nog geen reacties.